我有一个字符串,其中包含由这样的管道分隔的数字23|12|12|32|43
。
使用 SQL 我想提取每个数字,加 10,然后求和以获得总数。
Here is another alternative:
declare @str nvarchar(max) = '23|12|12|32|43';
set @str = 'select '+replace(@str, '|', '+');
exec(@str);
使用递归公用表表达式的答案:
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 子句的更好方法。
这是另一种方法:
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
它提供的数据类型和函数。
我只是作为一个例子发布了这个,你的方法有更好的性能。