【问题标题】:SQL Sum of numbers from a stringSQL 字符串中数字的总和
【发布时间】:2018-09-25 14:25:49
【问题描述】:

我有一个这样的字符串:)

"<"FOSTIMON 75 M.J.>|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||"

我需要数字的总和 (4+4+4+3+...+3),预期结果 = 39

感谢您的帮助!

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 请用您正在使用的数据库标记您的问题。您可能还想解释为什么这些数字在一个字符串中而不是在单独的列中。
  • 我使用 MS SQL。这些数字是从另一个软件保存的,我只需要一个校验和。

标签: sql sql-server string split


【解决方案1】:

这回答了编辑前的原始问题。

大多数数据库都支持执行某种形式的预处理语句。在您的情况下,可能最简单的方法是构造一条 SQL 语句,然后动态执行它。

此语法因数据库而异。出于随机性,我选择了 SQL Server,但该功能(尽管不是语法)几乎在任何数据库中都可用:

declare @str nvarchar(max) = '|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||';

set @str = 'select ' + replace(@str, '|', '+') + ' + 0';

exec sp_executesql @str;

Here 是此特定版本的测试者。

请注意,这是因为+ 是一元(数字)运算符,类似于-,但它不会改变符号。

【讨论】:

  • 很好,但是 OP 已经用修改后的字符串更新了问题
【解决方案2】:

试试这个

假设字符串的第一部分直到第一个“|”可以忽略 不确定您使用的是什么版本的 SQL,但如果它低于 SQL2016,则使用此string splitter

DECLARE @s NVARCHAR(50) = '<"FOSTIMON 75 M.J.>|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||'

SELECT 
     SUM(CONVERT(INT, S.[Value]))
FROM dbo.DelimitedSplit8K(@s, '|') S
WHERE S.RN >= 2 AND S.RN <= 13

如果您使用的是 SQL2012 +,那么您可以使用 TRY_PARSE 并完全摆脱 WHERE 子句

SELECT 
     SUM(   
            CASE
                WHEN TRY_PARSE(S.[Value] AS INT) IS NOT NULL
                THEN CONVERT(INT, S.[Value])
                ELSE 0
            END
            --CONVERT(INT, S.[Value])
        )
FROM dbo.DelimitedSplit8K(@s, '|') S

如果您使用的是 SQL2016 +,请使用内置函数 String_Split

SELECT 
        SUM(    
            CASE
                WHEN TRY_PARSE(S.[Value] AS INT) IS NOT NULL
                THEN CONVERT(INT, S.[Value])
                ELSE 0
            END
        )
FROM STRING_SPLIT(@s, '|') S

【讨论】:

  • 谢谢,我忘了指定sql版本2010。这个解决方案不适用于这个版本。
  • @Hans33 我发的第一个不应该是最后两个。
  • 无效的对象名称'dbo.DelimitedSplit8K'。
  • 我链接到了答案中包含函数的文章
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2023-01-08
  • 2020-01-18
  • 2021-12-08
相关资源
最近更新 更多