我有一个像这样的字符串:)
"<"FOSTIMON 75 M.J.>|4|4|4|3|3|3|3|3|3|3|3|3||||||||||||||||||||||||||||"
我需要数字的总和(4 + 4 + 4 + 3 + ... + 3),预期结果= 39
谢谢您的帮助!
答案 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