id value
1 1,2,3,4
2 2,3,4
所以我想得到这个结果:
id sum
1 10
2 9
我可以在SQL(MySQL)中完成吗?
答案 0 :(得分:3)
经过努力,你可以做到这一点。但实际上,这是存储数据的一种非常非常糟糕的方式。
本着这种精神,有时我们必须使用格式不受我们控制的数据:
select id,
(substring_index(value, ',', 1) +
substring_index(substring_index(concat(value, ',0'), ',', 2), ',', -1) +
substring_index(substring_index(concat(value, ',0'), ',', 3), ',', -1) +
substring_index(substring_index(concat(value, ',0'), ',', 4), ',', -1) +
substring_index(substring_index(concat(value, ',0'), ',', 5), ',', -1)
) as thesum
from t;
嵌套调用substring_index()
获取字符串中的第n个值。 concat(value, ',0')
用于处理值少于表达式的情况。在这种情况下,嵌套的substring_index()
将返回任何n值大于列表中项目数的最后一个值。将0
连接到列表可确保这不会影响总和。
SQL小提琴是here。
答案 1 :(得分:0)
你可以更动态地创建一个函数。请按照以下步骤
创建一个给出逗号分隔值总和的函数
CREATE FUNCTION GetToalOfCommaSeperatedVal
(
@commaSeperatedVal varchar(100)
)
RETURNS int
AS
BEGIN
declare @sum int
DECLARE @x XML
SELECT @x = CAST('<A>'+ REPLACE(@commaSeperatedVal,',','</A><A>')+ '</A>' AS XML)
SELECT @sum=sum(t.value('.', 'int'))
FROM @x.nodes('/A') AS x(t)
return @sum
END
GO
以下列方式执行just select命令
select id,dbo.GetToalOfCommaSeperatedVal(value) from YOUR_TABLE