You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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ß

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 15:09:46