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

Posted

技术标签:

【中文标题】计算分配给 SQL 列中字符串标记的数值的总值【英文标题】:Calculating total value of Numeric values assigned to string tokens in SQL column 【发布时间】:2013-08-04 10:11:09 【问题描述】:

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

感谢THIS QUESTION,我已经弄清楚了基本概念

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

非常聪明的解决方案。

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

所以,取字符串“5XWb/r2/upg”

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

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

【问题讨论】:

哦,用值替换标记,然后执行某种 SUM() 函数怎么样?仍然卡在循环上。在代码中,我会做某种 FOR 循环,但仍在学习这种“在数据库中做所有事情”的趋势。大声笑。 什么是数据库?甲骨文?自定义函数将是特定于数据库的。 .NET 2013 附带的任何内容。可能是 SQL Server 的变体。有一个 FUNCTION 文件夹,所以我假设我可以制作自定义文件夹。 :P Oracle 有下面的链接,看起来就像您想要的那样。我不确定 SQL Server。 forums.oracle.com/thread/585623 不要在数据库中做所有事情——这种语义解析在您选择的客户端语言中可能会更快。像 Awk、perl 或 Lisp 这样的基于字符串的字符串是最容易快速实现的。 【参考方案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)

【讨论】:

好的,所以 REPLACE() 函数不能正常工作。它似乎只是在替换 LAST 令牌。因此,只计算最终代币的 TokenValue。我在StringColumn中尝试了几种变体,结果是一致的。 这很奇怪。也许您的数据库提供了某种您可以使用的正则表达式函数。或者-如果您可以对列中的最大标记数做出安全假设-您可以使用嵌套替换,但这会有点混乱。 让它工作! Replace() 问题解决为:***.com/questions/18039188(需要 REPLACE() 中的 TRIM())

以上是关于计算分配给 SQL 列中字符串标记的数值的总值的主要内容,如果未能解决你的问题,请参考以下文章

为列中的每个唯一值分配值[重复]

如何在一个已经在python中保存整数值的索引处将字符分配给字符串?

无法从 excel 列中读取字符串值

过滤熊猫数据框列中的字符串/浮点数/整数值

SQL - 如何选择随机行,直到该行的总值为某个数字?

NestJS Postgres Prisma - 错误类型'字符串'不可分配给参数类型'TemplateStringsArray | Sql'