这有点复杂,所以忍受我。
,我已经找到了基本概念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工作。
答案 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)