我有一个字符串,其中包含由管道分隔的数字23|12|12|32|43
。
使用SQL我想提取每个数字,添加10然后求和以获得总数。
答案 0 :(得分:3)
这是另一种选择:
declare @str nvarchar(max) = '23|12|12|32|43';
set @str = 'select '+replace(@str, '|', '+');
exec(@str);
答案 1 :(得分:2)
使用递归公用表表达式的答案:
WITH cte AS (
SELECT
'23|12|12|32|43' + '|' AS string
,0 AS total
UNION ALL
SELECT
RIGHT(string, LEN(string) - PATINDEX('%|%', string))
,CAST(LEFT(string, PATINDEX('%|%', string) - 1) AS INT) + 10
FROM cte
WHERE PATINDEX('%|%', string) > 0
)
SELECT SUM(total) AS total FROM cte
作为递归终止符,我已经检查了字符串中是否存在更多的管道,但是这然后错过了我通过将额外的管道连接到原始字符串末尾的最后一个元素,我认为可能有更好的方式来表达WHERE子句。
答案 2 :(得分:2)
以下是另一种方法:
DECLARE @s VARCHAR(1000) = '23|12|12|32|43'
SELECT CAST('<root><e>' + REPLACE(@s, '|', '</e><e>') + '</e></root>' AS XML)
.value('sum(/root/e) + count(/root/e) * 10', 'INT')
这使用了对它提供的XML
数据类型和函数的转换。
我发布这个仅作为示例,您的方法有更好的表现。