如何在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
相关产品推荐
相关产品推荐

