如何使用SQL Server对分隔字符串中的数字求和
我有一个字符串,其中包含由管道分隔的数字,如so 23 | 12 | 12 | 32 | 43如何使用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)) ,
我想使用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);
您不应该在单个列中存储分隔值。您应该计划对数据模型进行重新设计—您不应该在单个列中存储分隔值。您应该计划重新设计数据模型