如何在SQL中对逗号分隔的字符串求和?

时间:2014-02-05 02:48:52

标签: mysql sql

id  value
1   1,2,3,4
2   2,3,4

所以我想得到这个结果:

id   sum
1     10
2     9

我可以在SQL(MySQL)中完成吗?

2 个答案:

答案 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)

你可以更动态地创建一个函数。请按照以下步骤

  1. 创建一个给出逗号分隔值总和的函数

    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 
    
  2. 以下列方式执行just select命令

    select id,dbo.GetToalOfCommaSeperatedVal(value) from YOUR_TABLE