如何使用SQL Server对分隔字符串中的数字求和

时间:2013-03-27 10:03:26

标签: sql sql-server

我有一个字符串,其中包含由管道分隔的数字23|12|12|32|43

使用SQL我想提取每个数字,添加10然后求和以获得总数。

3 个答案:

答案 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数据类型和函数的转换。

我发布这个仅作为示例,您的方法有更好的表现。