计算在SQL列中分配给字符串标记的数值的总值

时间:2013-08-03 02:45:34

标签: sql replace

这有点复杂,所以忍受我。

由于THIS QUESTION

,我已经找到了基本概念
SELECT LENGTH(col) - LENGTH(REPLACE(col, 'Y', ''))

非常聪明的解决方案。

问题是,我正在尝试计算字符串标记的实例数,然后取该计数器并将其乘以表示字符串数值的修饰符。哦,我有一个50-toh代币清单,每个代币都有不同的价值。

所以,取字符串“{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表的每一列执行上述替换令牌获取长度技巧。

这有意义吗?

Psuedo-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工作。

1 个答案:

答案 0 :(得分: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)