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

MySQL中如何按JSON数组对象的指定属性值查询数据?

问题描述

我有一张名为sometable的表,其中包含一个名为jsonval的JSON字段。该字段存储的JSON对象包含programs属性,其值是一个带有id属性的对象数组。我需要查询出jsonval.programs.id等于14的记录。

目前使用以下查询语句可实现需求:

SELECT id, jsonval, JSON_EXTRACT(jsonval, '$.programs[*].id') FROM `sometable` 
WHERE JSON_EXTRACT(jsonval, '$.programs[*].id') LIKE '%"14"%';

这是因为JSON_EXTRACT(jsonval, '$.programs[*].id')会返回存储id的数组的字符串形式,例如:["14","26"]。但我想知道是否存在更优雅的解决方案,比如使用JSON_CONTAINS?

更优雅的查询方案

方法1:使用JSON_CONTAINS

JSON_CONTAINS可以直接检查JSON结构中是否包含指定对象,只需明确匹配路径和目标对象即可:

SELECT id, jsonval 
FROM `sometable`
WHERE JSON_CONTAINS(jsonval, '{"id": "14"}', '$.programs');

注意:如果programs数组里的id是数值类型而非字符串,将"14"改为14即可。

JSON_SEARCH用于查找指定值在JSON中的路径,只要返回结果不为NULL,就说明存在匹配记录:

SELECT id, jsonval 
FROM `sometable`
WHERE JSON_SEARCH(jsonval, 'one', '14', null, '$.programs[*].id') IS NOT NULL;

参数说明:

  • 'one'表示找到第一个匹配项即停止搜索,换成'all'会返回所有匹配路径,但仅需判断存在性时用'one'效率更高。
  • 最后一个参数'$.programs[*].id'指定搜索路径前缀,限定只在programs数组的id属性中查找。

方法3:使用JSON_TABLE(适合复杂场景)

如果需要对programs数组元素做进一步关联或筛选操作,JSON_TABLE可以将JSON数组转换为关系型表结构,再进行条件过滤:

SELECT t.id, t.jsonval
FROM `sometable` t,
     JSON_TABLE(t.jsonval, '$.programs[*]' COLUMNS (
         program_id VARCHAR(255) PATH '$.id'
     )) jt
WHERE jt.program_id = '14';

这种方式的优势在于可以直接对数组元素进行关系型操作,灵活性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 15:52:22