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

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

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

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

【问题讨论】:

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

标签: sql replace


【解决方案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() 问题解决为:stackoverflow.com/questions/18039188(需要 REPLACE() 中的 TRIM())
猜你喜欢
  • 2023-04-10
  • 2020-05-04
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多