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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 07:48:57