MySQL使用SUM计算JSON数组字段求和返回0异常排查
写法问题说明
你的查询写法确实存在错误,核心原因如下:
options->'$[*].optionPrice'的返回结果是JSON数组类型,也就是你单独查询时得到的[2000, 0],并不是独立的数值集合- MySQL的
SUM()聚合函数无法直接对JSON数组做拆解求和,当传入JSON数组类型参数时,MySQL会做隐式类型转换,非纯数字格式的JSON数组转换为数值时结果为0,因此最终计算结果始终为0,和预期不符。
正确实现方案
根据你使用的MySQL版本,可以选择对应写法:
- 方案1:MySQL 8.0及以上版本,使用
JSON_TABLE函数拆解JSON数组为行数据后再求和,是最规范的实现方式
SELECT t.id, SUM(j.optionPrice) AS total_option_price FROM table_order_items t JOIN JSON_TABLE( t.options, '$[*]' COLUMNS ( optionPrice INT PATH '$.optionPrice' ) ) j GROUP BY t.id;
- 方案2:MySQL 5.7版本无
JSON_TABLE支持,可通过遍历数组下标的方式逐值提取后求和,需要提前按单条记录最多包含的option项数补全序号关联表
SELECT t.id, SUM(CAST(JSON_EXTRACT(t.options, CONCAT('$[', num.n, '].optionPrice')) AS UNSIGNED)) AS total_option_price FROM table_order_items t JOIN ( SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 ) num ON num.n < JSON_LENGTH(t.options) GROUP BY t.id;
补充说明:如果单条记录的options数组长度超过你写的序号最大值,方案2会漏算超出部分的金额,需要根据业务实际最大数组长度扩充序号联合查询的部分。
内容的提问来源于stack exchange,提问作者sula7ifa
相关产品推荐
相关产品推荐

