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

计算SQL列中分配给字符串标记的数值的总值,sql,replace,Sql,Replace,这有点复杂,请容忍我 多亏了你,我才弄明白了基本概念 非常聪明的解决方案 问题是,我试图计算一个字符串标记的实例数,然后取那个计数器,用一个表示字符串数值的修饰符乘以它。哦,我有一个50个ish代币的列表,每个都有不同的值 以字符串“{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 现在

这有点复杂,请容忍我

多亏了你,我才弄明白了基本概念

非常聪明的解决方案

问题是,我试图计算一个字符串标记的实例数,然后取那个计数器,用一个表示字符串数值的修饰符乘以它。哦,我有一个50个ish代币的列表,每个都有不同的值

以字符串“{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

现在,我真正要寻找的是一种方法,对TokenValue表的每一列进行连接并执行前面提到的replace-token-get-length技巧

这有意义吗

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无法正常工作。

如果您创建这样的视图:

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 ;

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

如果您创建这样的视图:

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 ;

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

Ooh,用值替换标记,然后执行某种SUM()函数怎么样?仍然卡在循环上。在代码中,我会做一些FOR循环,但仍在学习这种“在数据库中做所有事情”的趋势。哈哈,数据库是什么?神谕自定义函数将是特定于数据库的。随.NET 2013打包的任何函数。可能是SQL Server的变体。有一个函数文件夹,所以我想我可以定制一个POracle下面有一个链接,看起来像你想要的。我对SQL Server没有把握。不要在数据库中做任何事情——在您选择的客户机语言中,这种语义解析可能会更快。像Awk、perl或Lisp这样的基于字符串的函数最容易实现fast。哦,用值替换标记,然后执行某种SUM()函数怎么样?仍然卡在循环上。在代码中,我会做一些FOR循环,但仍在学习这种“在数据库中做所有事情”的趋势。哈哈,数据库是什么?神谕自定义函数将是特定于数据库的。随.NET 2013打包的任何函数。可能是SQL Server的变体。有一个函数文件夹,所以我想我可以定制一个POracle下面有一个链接,看起来像你想要的。我对SQL Server没有把握。不要在数据库中做任何事情——在您选择的客户机语言中,这种语义解析可能会更快。基于字符串的函数(如Awk、perl或Lisp)最容易实现fast.OK,因此REPLACE()函数无法正常工作。它似乎只是在替换最后一个令牌。因此,只计算最终令牌的令牌值。我尝试了StringColumn中的几种变体,结果是一致的。这很奇怪。也许您的数据库提供了某种您可以使用的regexp函数。或者-如果你能对一列中的最大令牌数做出一个安全的假设-你可以使用嵌套替换,但那会有点混乱。这就行了!Replace()问题已通过:(Replace()中需要修剪()确定,因此Replace()函数无法正常工作。它似乎只是在替换最后一个令牌。因此,只计算最终令牌的令牌值。我尝试了StringColumn中的几种变体,结果是一致的。这很奇怪。也许您的数据库提供了某种您可以使用的regexp函数。或者-如果你能对一列中的最大令牌数做出一个安全的假设-你可以使用嵌套替换,但那会有点混乱。这就行了!Replace()问题通过以下方式解决:(Replace()中需要修剪()
select StringColumn, sum(TokenCount * TokenValue) TotalTokenScore
   from ColumnsTokens 
group by StringColumn ;