SQL如何查询含可变键名的JSON结构中的指定score字段值
通用提取方案
针对JSON路径中存在动态键名的场景,以下写法适配MySQL 5.7+版本的JSON函数语法,覆盖你提到的三类思路方向:
1. 层级通配符匹配(绕开可变键名)
如果确定result节点下只有一层动态键、且目标score是该动态键的直接子属性,直接用*通配符替代固定键名即可,不需要感知动态键的具体值:
-- * 代表匹配$.result下的任意一级键名 SELECT object->>'$.result.*.score' AS Score FROM your_table;
注意:如果
$.result下存在多个子键,该写法会返回所有子键下score值组成的数组,若仅需第一个匹配值,可在路径后加索引:object->>'$.result.*.score[0]'
2. 递归深度查找(直接定位目标字段)
如果层级不固定,需要忽略前置路径直接查找所有名为score的字段,可使用**递归通配符实现全路径匹配:
-- ** 代表递归匹配任意深度的任意键名,直接定位所有score字段 SELECT object->>'$**.score' AS Score FROM your_table;
注意:该写法会匹配JSON中所有层级的
score字段,如果文档中存在其他同名的score属性,会出现取值错误,适合结构简单、无同名字段的场景。
3. 动态拼接路径(已知可变键名推导逻辑时使用)
如果可变键名可以从表字段、或JSON其他固定位置的字段推导得到,可以通过CONCAT函数拼接出完整JSON路径,再传入JSON_EXTRACT取值:
- 场景1:可变键名存储在表的其他字段(例:字段名为
dynamic_key)
SELECT JSON_EXTRACT( object, CONCAT('$.result.', dynamic_key, '.score') ) AS Score FROM your_table;
- 场景2:可变键名存储在JSON本身的固定路径下(例:键名存在
$.result.meta.activeKey位置)
SELECT JSON_EXTRACT( object, CONCAT('$.result.', object->>'$.result.meta.activeKey', '.score') ) AS Score FROM your_table;
扩展:多动态键场景(MySQL 8.0+)
如果result下存在多个动态键,需要批量提取所有子节点下的score值,可使用JSON_TABLE将JSON节点打平为结构化行数据,避免返回数组格式:
SELECT t.Score FROM your_table, JSON_TABLE( object, '$.result.*' COLUMNS ( Score INT PATH '$.score' ) ) t;
内容的提问来源于stack exchange,提问作者DanielSchloß
相关产品推荐
相关产品推荐

