SQL字符串中数字的总和

时间:2018-09-25 14:25:50

标签: sql sql-server string split

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

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

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

谢谢您的帮助!

2 个答案:

答案 0 :(得分: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是该特定版本的糊涂。

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

答案 1 :(得分:0)

尝试一下

假定字符串的第一部分直到第一个“ |”可以忽略 不确定使用的是哪个版本的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