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

Mysql 如何在SQL中对逗号分隔的字符串求和?,mysql,sql,Mysql,Sql,所以我想得到这个结果: id value 1 1,2,3,4 2 2,3,4 我可以用SQL(MySQL)来做吗?只要付出很大的努力,你就可以做到这一点。实际上,这是一种非常非常糟糕的数据存储方式 本着有时我们不得不使用格式不受我们控制的数据的精神: id sum 1 10 2 9 调用嵌套函数以获取字符串中的第n个值。concat(value',0')用于处理值少于表达式的情况。在这种情况下,嵌套的子字符串_index()将返回大于列表中项数的任何n值的最后一

所以我想得到这个结果:

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

我可以用SQL(MySQL)来做吗?

只要付出很大的努力,你就可以做到这一点。实际上,这是一种非常非常糟糕的数据存储方式

本着有时我们不得不使用格式不受我们控制的数据的精神:

id   sum
1     10
2     9
调用嵌套函数以获取字符串中的第n个值。
concat(value',0')
用于处理值少于表达式的情况。在这种情况下,嵌套的
子字符串_index()
将返回大于列表中项数的任何n值的最后一个值。将
0
连接到列表可确保这不会影响总和


SQL FIDLE是。

您可以更动态地创建函数。请按照以下步骤操作

  • 创建一个函数,该函数给出逗号分隔值的和

    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;
    

  • 首先,您为什么要以如此不方便的方式存储数据?这可能是数据的重复。公认的答案是创建存储过程(也提供了存储过程)。
    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 
    
    select id,dbo.GetToalOfCommaSeperatedVal(value) from YOUR_TABLE