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
相关产品推荐
相关产品推荐

