You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL查询:计算逗号分隔字段值的总和问题求助

问题原因

你的replace(ListOfValues, ',', '')操作会把字符串"20, 10, 40, 50, 60"转换成"20 10 40 50 60",MySQL将这类带空格的字符串转为数值时,只会提取第一个连续的数字部分(也就是20),所以SUM最终只返回20。

解决方案

方法1:使用递归CTE(MySQL 8.0+支持)

递归拆分逗号分隔的字符串,再逐个转换为数值求和:

WITH RECURSIVE split_values AS (
    SELECT
        TRIM(SUBSTRING_INDEX(ListOfValues, ',', 1)) AS value,
        SUBSTRING(ListOfValues, LENGTH(SUBSTRING_INDEX(ListOfValues, ',', 1)) + 2) AS remaining
    FROM DemoTable
    WHERE ListOfValues IS NOT NULL AND ListOfValues != ''
    UNION ALL
    SELECT
        TRIM(SUBSTRING_INDEX(remaining, ',', 1)) AS value,
        SUBSTRING(remaining, LENGTH(SUBSTRING_INDEX(remaining, ',', 1)) + 2) AS remaining
    FROM split_values
    WHERE remaining IS NOT NULL AND remaining != ''
)
SELECT SUM(CAST(value AS UNSIGNED)) AS TotalSum FROM split_values;

方法2:使用数字辅助表(兼容低版本MySQL)

先创建一个包含连续数字的临时表,再通过SUBSTRING_INDEX拆分每个数值:

-- 创建临时数字表(数值数量超过你的最大元素数即可)
CREATE TEMPORARY TABLE nums (n INT);
INSERT INTO nums VALUES (1),(2),(3),(4),(5),(6);

-- 拆分求和
SELECT SUM(CAST(TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(ListOfValues, ',', n), ',', -1)) AS UNSIGNED)) AS TotalSum
FROM DemoTable
JOIN nums ON n <= LENGTH(ListOfValues) - LENGTH(REPLACE(ListOfValues, ',', '')) + 1;
额外建议

尽量避免在数据库中存储逗号分隔的数值集合,遵循数据库规范化设计,将每个数值单独存储为一行数据,这样查询、计算和维护都会更高效,也能从根源避免这类问题。

内容的提问来源于stack exchange,提问作者Niranjan Kumar Chowdam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 08:47:05