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

如何使用SQL Server对分隔字符串中的数字求和,sql,sql-server,Sql,Sql Server,我有一个字符串,其中包含由管道分隔的数字,如so 23 | 12 | 12 | 32 | 43 我想使用SQL提取每个数字,加上10,然后求和得到总数 使用递归公共表表达式的答案: WITH cte AS ( SELECT '23|12|12|32|43' + '|' AS string ,0 AS total UNION ALL SELECT RIGHT(string, LEN(string) - PATINDEX('%|%', string)) ,

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


我想使用SQL提取每个数字,加上10,然后求和得到总数

使用递归公共表表达式的答案:

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子句。

使用递归公共表表达式的答案:

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数据类型及其提供的函数


我将此作为示例发布,您的方法具有更好的性能。

以下是另一种方法:

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数据类型及其提供的函数


我将此作为示例发布,您的方法具有更好的性能。

这里是另一种选择:

declare @str nvarchar(max) = '23|12|12|32|43';

set @str = 'select '+replace(@str, '|', '+');

exec(@str);

以下是另一种选择:

declare @str nvarchar(max) = '23|12|12|32|43';

set @str = 'select '+replace(@str, '|', '+');

exec(@str);

您不应该在单个列中存储分隔值。您应该计划对数据模型进行重新设计—您不应该在单个列中存储分隔值。您应该计划重新设计数据模型