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

如何在MariaDB中使用JSON函数查询JSON数组内的记录

解决MariaDB中JSON数组元素的查询问题

嘿,我明白你遇到的问题了——你用JSON_VALUE直接查$.cuts.name没得到结果,这是因为cuts是一个JSON数组,不是单个对象,JSON_VALUE没办法直接遍历数组里的所有元素来匹配。别担心,给你几个靠谱的解决办法:

方法一:用JSON_CONTAINS直接匹配数组内的对象

这个方法最简洁,适合直接检查数组中是否存在符合条件的对象:

SELECT COUNT(*) AS theatrical_count
FROM products
WHERE JSON_CONTAINS(attr, '{"name": "Theatrical"}', '$.cuts');

这里的参数分别是:

  • 第一个参数attr:要检查的JSON字段
  • 第二个参数'{"name": "Theatrical"}':我们要匹配的JSON对象结构
  • 第三个参数'$.cuts':指定要检查的JSON路径(也就是cuts数组)

方法二:用JSON_SEARCH查找匹配的路径

如果需要确认是否存在匹配的元素,可以用JSON_SEARCH来查找对应的路径,只要返回结果不为空就说明存在:

SELECT COUNT(*) AS theatrical_count
FROM products
WHERE JSON_SEARCH(attr, 'one', 'Theatrical', NULL, '$.cuts[*].name') IS NOT NULL;

参数说明:

  • 'one':表示只返回第一个匹配的路径
  • 'Theatrical':要查找的目标值
  • '$.cuts[*].name':指定遍历cuts数组的所有元素([*]是数组通配符),检查每个元素的name属性

方法三:用JSON_TABLE展开数组为行(更灵活)

如果需要对数组元素做更复杂的筛选或关联查询,JSON_TABLE可以把JSON数组展开成临时表,然后像普通表一样查询:

SELECT COUNT(DISTINCT p.id) AS theatrical_count
FROM products p
JOIN JSON_TABLE(
    p.attr,
    '$.cuts[*]' COLUMNS (
        cut_name VARCHAR(40) PATH '$.name'
    )
) jt
WHERE jt.cut_name = 'Theatrical';

这里我们把cuts数组里的每个元素转换成临时表jt的一行,然后筛选cut_name等于"Theatrical"的记录,最后用DISTINCT p.id避免重复计数(如果一条记录里有多个符合条件的cuts元素)。

你可以根据自己的需求选择合适的方法,这三种都能正确查询到你想要的记录数~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:02:40