MySQL中如何通过JSON键值查找对应对象并获取指定字段
更优的MySQL JSON数组键值匹配查询方案
Hey, great question! That nested string replacement approach works but is definitely clunky and hard to maintain. Let's look at two cleaner solutions depending on your MySQL version:
1. MySQL 8.0+ 推荐方案:使用 JSON_TABLE 转换为关系表
JSON_TABLE 是MySQL 8.0引入的原生函数,能直接把JSON数组转换成标准的行结构,让你像操作普通数据表一样查询,可读性和可维护性都强很多:
SELECT j.text FROM fields f JOIN JSON_TABLE( f.options, '$[*]' COLUMNS( text VARCHAR(64) PATH '$.text', value VARCHAR(64) PATH '$.value' ) ) j WHERE j.value = '1';
为什么这个更好?
- 完全摆脱了字符串拼接/替换的脆弱逻辑,不用担心JSON路径格式变化导致查询失效
- 如果需要多次查询不同的
value值,或者要结合其他条件过滤,这种方式扩展性极强 - 代码逻辑直观,其他开发者一看就懂
2. 兼容MySQL 5.7的简化版:优化JSON_SEARCH+JSON_EXTRACT组合
如果你还在使用MySQL 5.7(不支持JSON_TABLE),可以简化你原来的思路,只需要一次字符串替换就能实现:
SELECT JSON_UNQUOTE( JSON_EXTRACT( options, REPLACE(JSON_SEARCH(options, 'one', '1'), '.value', '.text') ) ) AS matched_text FROM fields;
简化点说明:
JSON_SEARCH(options, 'one', '1')返回的是匹配的value路径,比如"$[0].value"- 直接把
.value替换成.text,就能得到对应的text路径"$[0].text" - 最后用
JSON_UNQUOTE去掉结果的引号,得到纯文本Grass
这两种方案都比你原来的嵌套多层REPLACE要简洁可靠得多!
内容的提问来源于stack exchange,提问作者John Mellor
相关产品推荐
相关产品推荐

