MySQL JSON列嵌套属性访问返回null,如何获取auth_type值?
解决MySQL JSON列中嵌套字符串JSON的提取问题
你的问题出在entries字段的存储形式上:它的值是字符串类型的JSON数组(被双引号包裹,内部还有转义的引号),而非原生的JSON数组。直接用JSON_EXTRACT(request, '$.entries[0].auth_type')会返回null,因为MySQL会把$.entries识别为字符串,而非可遍历的JSON结构。
正确的查询方式
需要先将entries的字符串内容解析为JSON,再提取目标字段,有两种简洁写法:
写法1:使用函数嵌套
SELECT JSON_UNQUOTE( JSON_EXTRACT( JSON_PARSE(JSON_UNQUOTE(JSON_EXTRACT(request, '$.entries'))), '$[0].auth_type' ) ) AS auth_type FROM mytable WHERE JSON_EXTRACT(request, '$.entries') IS NOT NULL LIMIT 1;
写法2:使用->>运算符简化(推荐)
->>是JSON_UNQUOTE(JSON_EXTRACT())的简写,配合JSON_PARSE可以大幅简化语句:
SELECT JSON_PARSE(request->>'$.entries')->>'$[0].auth_type' AS auth_type FROM mytable WHERE request->>'$.entries' IS NOT NULL LIMIT 1;
步骤说明
request->>'$.entries':提取并去除entries字段的外层引号,得到原始的JSON数组字符串([{"user_id":"31823","auth_type":"RFID"}])。JSON_PARSE(...):将上述字符串解析为原生JSON数组。->>'$[0].auth_type':从解析后的JSON数组中提取第一个元素的auth_type字段,并去除引号。
内容的提问来源于stack exchange,提问作者Ryan Robinson
相关产品推荐
相关产品推荐

