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

MySQL 5.7如何查询JSON数组字段包含指定键名的行

问题场景

使用数据库版本:MySQL 5.7
涉及表结构:

  • id:bigInt 类型
  • item_name:varchar 类型
  • attributes:JSON 数组类型
    示例数据行:
1,"PRODUCT",'[ { "1": [2,4,1]},{ "2": [5,4,6]},{ "3": [5,3,2]}]'

查询需求:筛选attributes字段中**存在键名为1**的行,无需校验键对应的值内容。

原有查询失效原因

之前执行的两条语句返回结果不符合预期,核心是函数使用逻辑错误:

  • 第一条JSON_CONTAINS查询
SELECT JSON_CONTAINS('{"attributes":[ { "1": [2,4,1]},{ "2": [5,4,6]},{ "3": [5,3,2]}]}',"1") Result;

JSON_CONTAINS仅校验目标JSON中是否存在指定的值,不会匹配键名,目标JSON顶层不存在值为1的项,因此始终返回0。

  • 第二条JSON_SEARCH查询
SELECT JSON_SEARCH('{"attributes":[ { "1": [2,4,1]},{ "2": [5,4,6]},{ "3": [5,3,2]}]}', 'one',  "1") Result;

JSON_SEARCH默认仅搜索JSON的值内容,不会遍历匹配键名,因此找不到对应路径,始终返回null。

可行实现方案

最优方案:JSON_CONTAINS_PATH(适配任意数组长度,性能最好)

直接使用路径匹配函数检查是否存在目标键,不需要关心数组长度、不需要解析值内容,完全匹配需求:

SELECT * FROM 你的业务表名
WHERE JSON_CONTAINS_PATH(attributes, 'one', '$[*]."1"')

参数说明:

  • 'one':只要存在1个匹配路径就返回真
  • '$[*]."1"':遍历attributes数组下所有元素,检查是否存在键名为1的项

测试验证:针对你示例中嵌套在对象里的测试JSON,只要把字段和路径对应调整即可,测试语句如下,执行后会返回1:

SELECT JSON_CONTAINS_PATH(
  '{"attributes":[ { "1": [2,4,1]},{ "2": [5,4,6]},{ "3": [5,3,2]}]}',
  'one',
  '$.attributes[*]."1"'
) Result;

备选方案:JSON_SEARCH 通配符匹配

如果需要兼容更复杂的键匹配规则,可以通过路径通配符指定JSON_SEARCH遍历键名,结果非空即代表匹配成功:

SELECT * FROM 你的业务表名
WHERE JSON_SEARCH(attributes, 'one', '1', null, '$[*].%') IS NOT NULL

内容的提问来源于stack exchange,提问作者Hemant singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:06:27