MySQL 8.0.19中如何用箭头语法/JSON_EXTRACT查询所有嵌套JSON数据
解决MySQL多层嵌套JSON全层级搜索问题
核心方案:用JSON_SEARCH递归遍历所有层级
MySQL 8.0自带的JSON_SEARCH()函数支持通配符**,可以递归遍历JSON的所有嵌套层级,正好适配你需要的全范围搜索需求。对应的查询语句可以改写为:
SELECT * FROM `system_log` WHERE JSON_SEARCH(entry, 'one', '%search_term%', NULL, '$**') IS NOT NULL;
参数详解
entry: 目标JSON字段'one': 找到第一个匹配路径就返回(仅需判断是否存在匹配时用这个,性能更优;若要获取所有匹配路径可换成'all')'%search_term%': 你的搜索关键词,支持%模糊匹配,精确匹配可去掉百分号NULL: 可选参数,用于排除特定路径,这里无需排除所以传NULL'$**': 递归通配符,代表遍历JSON的所有层级(包括嵌套对象、数组)
适配箭头语法的写法
如果你习惯用箭头表达式(等价于JSON_EXTRACT),也可以用下面的写法,核心逻辑不变:
SELECT * FROM `system_log` WHERE JSON_SEARCH(entry->"$", 'one', '%search_term%', NULL, '**') IS NOT NULL;
针对你的示例JSON测试
假设entry字段值为:
{ " Name": { "after": "Shop", "before": "Supermarket" } }
当搜索关键词'%Shop%'时,JSON_SEARCH会返回匹配路径'$." Name".after',条件成立,这条记录会被成功查询出来。
注意事项
- 性能优化:如果表数据量较大,全层级JSON搜索可能存在性能损耗。可以考虑给JSON字段添加生成列,或者针对高频搜索的路径创建JSON索引(MySQL 8.0支持JSON索引,但仅对固定路径有效,递归场景下效果有限)。
- 特殊字符处理:如果搜索关键词包含JSON特殊字符(比如双引号、反斜杠),需要提前转义,避免语法错误。
内容的提问来源于stack exchange,提问作者HJP22
相关产品推荐
相关产品推荐

