MySQL中如何从JSON字段提取指定对象或属性?
解决MySQL中提取JSON字段指定内容的问题
看起来你在从MySQL的JSON字段中提取特定对象或属性时遇到了小麻烦,我来帮你梳理下可行的解决办法:
先确认前提条件
首先要确保你的appjson字段类型是JSON类型,而不是TEXT或VARCHAR。如果是普通字符串类型,所有JSON函数都无法正常工作,需要先通过CAST(appjson AS JSON)将其转换为JSON格式后再操作。
可行的提取方法
1. 提取official对象
方法一:使用JSON_EXTRACT函数(MySQL 5.7+支持)
注意路径写法不需要给键名加额外引号(除非键名有特殊字符),如果字段是字符串类型要先转换:
-- 字段为JSON类型时 SELECT JSON_EXTRACT(appjson, '$.official') FROM appdata WHERE id = '123'; -- 字段为字符串类型时 SELECT JSON_EXTRACT(CAST(appjson AS JSON), '$.official') FROM appdata WHERE id = '123';
方法二:使用简化的->运算符(MySQL 5.7+支持)
这是JSON_EXTRACT的简写形式,更简洁:
SELECT appjson->'$.official' FROM appdata WHERE id = '123';
2. 提取internalcomments属性值
方法一:多层路径的JSON_EXTRACT
SELECT JSON_EXTRACT(appjson, '$.official.comments.internalcomments') FROM appdata WHERE id = '123';
方法二:简化的->运算符
SELECT appjson->'$.official.comments.internalcomments' FROM appdata WHERE id = '123';
方法三:提取无引号的纯文本值
如果需要去掉结果的双引号,使用->>运算符(相当于JSON_UNQUOTE(JSON_EXTRACT(...))):
SELECT appjson->>'$.official.comments.internalcomments' FROM appdata WHERE id = '123';
或者显式使用JSON_UNQUOTE:
SELECT JSON_UNQUOTE(JSON_EXTRACT(appjson, '$.official.comments.internalcomments')) FROM appdata WHERE id = '123';
为什么你之前的方法失败?
appjson.official这种点号直接访问:这是MySQL 8.0.14及以上才支持的JSON路径简写语法,如果你用的版本低于这个,就会报错。JSON_EXTRACT提示未识别:要么你的MySQL版本低于5.7(JSON函数是5.7才引入的),要么appjson字段不是JSON类型,导致函数无法处理该字段。
低版本MySQL的替代方案(不推荐)
如果你的MySQL版本低于5.7,无法使用JSON函数,只能用字符串处理函数(比如SUBSTRING_INDEX)来截取,但这种方法非常脆弱,一旦JSON结构发生变化就会失效,强烈建议升级到5.7及以上版本,或者将字段转换为JSON类型。
内容的提问来源于stack exchange,提问作者user7350714
相关产品推荐
相关产品推荐

