1

这有点复杂,所以请耐心等待。

多亏了这个问题,我才弄清楚了基本概念

SELECT LENGTH(col) - LENGTH(REPLACE(col, 'Y', ''))

非常聪明的解决方案。

问题是,我正在尝试计算字符串标记的实例数,然后将该计数器乘以表示字符串数值的修饰符。哦,我有一个包含 50 个令牌的列表,每个令牌都有不同的值。

所以,取字符串“{5}{X}{W}{b/r}{2/u}{pg}”

查找令牌列表及其数值,我们得到:

{5}   5
{X}   0
{W}   1
{b/r} 1
{2/u} 2
{pg}  1
....  ....

因此,上面字符串的总和值为 5+0+1+1+2+1 = 10

现在,我真正在寻找的是一种方法来执行 Join 并为 TokenValue 表的每一列执行上述替换令牌获取长度技巧。

那有意义吗?

伪 SQL 示例:

SELECT StringColumn, TotalTokenValue
???
FROM TableWithString, TokenValueTable

也许这作为自定义功能会更好?


编辑

我想我已经完成了一半,但这有点难看。

SELECT        StringColumn, LEN(StringColumn) AS TotalLen, Token, 
                { fn LENGTH(Token) } AS TokenLength, TokenValue, 
                { fn REPLACE(StringColumn, Token, '') AS Replaced, 
                { fn LENGTH(Replaced) } AS RepLen,
                { TotalLen - RepLen / TokenLength} AS TokenCount }, 
                { TokenCount * TokenValue} CalculatedTokenValue
FROM            StringTable CROSS JOIN
                         TokenTable

然后我需要将它包装在某种 Group By 中并获得 SUM(CalculatedTokenValue) 我可以在脑海中想象它,无法让 SQL 工作。

4

1 回答 1

1

如果您创建这样的视图:

Create or replace view ColumnsTokens as 
  select StringColumn, Token, TokenValue, 
   (length(StringColumn) - length(replace(StringColumn, token, ''))) / length(Token) TokenCount 
from StringTable 
join TokenTable on replace(StringColumn, Token, '') <> StringColumn ;

这将充当列和标记之间的多对多关系表,我认为您可以轻松编写所需的任何查询。例如,这将为您提供总分:

select StringColumn, sum(TokenCount * TokenValue) TotalTokenScore
   from ColumnsTokens 
group by StringColumn ;

(您只缺少没有标记的 StringColumns)

于 2013-08-03T18:17:13.960 回答