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

MySQL中对存储JSON格式Population数据的列求和返回0的问题求助

MySQL中对存储JSON格式Population数据的列求和返回0的问题求助

兄弟我太懂你这个坑了!之前我也碰到过把JSON格式的数据存在普通列里,直接用SUM(info)返回0的情况,当时整个人都懵了😅

先给你说为啥会返回0:你直接SUM的是整个JSON字符串,MySQL会尝试把这个字符串转成数值,但因为字符串开头是{,转数值失败就会默认当成0处理,所以不管你有多少条数据,结果都是0,这完全是用错姿势了!

接下来给你两种靠谱的解决方案,根据你的MySQL版本选:

方案一:用MySQL原生JSON函数(推荐,MySQL 5.7+支持)

从MySQL 5.7开始支持JSON类型和相关函数,你可以用JSON_EXTRACT或者更简洁的->>运算符来提取JSON里的Population数值,再求和:

-- 用JSON_EXTRACT的写法
SELECT SUM(JSON_EXTRACT(info, '$.Population')) AS total_population
FROM CITY
WHERE countrycode = 'AUS';
-- 更简洁的->>写法(是JSON_UNQUOTE(JSON_EXTRACT(...))的简写,数值提取也适用)
SELECT SUM(info->>'$.Population') AS total_population
FROM CITY
WHERE countrycode = 'AUS';

这里$.Population是JSON路径语法,意思是取info字段里的Population属性值,提取出来的数值就能正常被SUM计算了。

方案二:字符串截取(仅适用于不支持JSON函数的旧版本MySQL)

如果你的MySQL版本太老,不支持JSON函数,那只能用字符串截取的方式硬提数值,不过这个方法有风险,一旦JSON格式有变化(比如空格位置变了)就会出错,谨慎使用:

SELECT SUM(CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(info, ':', -1), '}', 1) AS UNSIGNED)) AS total_population
FROM CITY
WHERE countrycode = 'AUS';

原理是先按:分割取最后一段(也就是数值加}的部分),再按}分割取第一段,得到纯数字字符串,转成无符号整数后再求和。

另外你之前试的find_in_set完全用错场景啦,这个函数是用来找某个字符串在逗号分隔的集合里的位置,根本不是用来提取JSON数值的工具,所以肯定没用哒。

备注:内容来源于stack exchange,提问作者Fletcher Hayden

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 11:07:57