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

