使用嵌套JSON_TABLE过滤MySQL数据时触发“参数错误”报错
MySQL嵌套JSON_TABLE报错:ERROR 1210 (HY000): Incorrect arguments to JSON_TABLE
你的核心需求是筛选出JSON数组列attributes中**同时包含(含a或f的元素)以及(等于sa的元素)**的行,原有嵌套写法报错的主要原因:
- 第一个子查询/CTE中,
files与JSON_TABLE的隐式连接会返回重复的id和attributes行(只要JSON数组中有多个符合OR条件的元素,就会重复输出同一行数据),导致后续对这些重复行的JSON列使用JSON_TABLE时触发参数错误。 - 原有写法逻辑冗余,完全不需要重复展开JSON数组。
解决方案1:使用EXISTS子查询(直观高效)
通过两个独立的EXISTS子查询分别验证两个条件,避免重复展开JSON数组:
SELECT id, attributes FROM files WHERE -- 验证数组中存在含a或f的元素 EXISTS ( SELECT 1 FROM JSON_TABLE(attributes, '$[*]' COLUMNS(value TEXT PATH '$')) AS jt WHERE jt.value LIKE '%a%' OR jt.value LIKE '%f%' ) AND -- 验证数组中存在等于sa的元素 EXISTS ( SELECT 1 FROM JSON_TABLE(attributes, '$[*]' COLUMNS(value TEXT PATH '$')) AS jt WHERE jt.value LIKE 'sa' );
解决方案2:使用GROUP BY聚合筛选
先展开JSON数组,再通过聚合函数筛选同时满足两个条件的行:
SELECT id, attributes FROM files JOIN JSON_TABLE(attributes, '$[*]' COLUMNS(value TEXT PATH '$')) AS jt GROUP BY id, attributes HAVING -- 统计含a/f的元素数量,至少存在1个 SUM(CASE WHEN jt.value LIKE '%a%' OR jt.value LIKE '%f%' THEN 1 ELSE 0 END) > 0 AND -- 统计等于sa的元素数量,至少存在1个 SUM(CASE WHEN jt.value LIKE 'sa' THEN 1 ELSE 0 END) > 0;
修复原有嵌套写法(若坚持你的思路)
只需在第一个子查询中添加DISTINCT去重,确保or_filtered中的每一行都是唯一的id和attributes:
WITH or_filtered AS ( SELECT DISTINCT id, attributes FROM files JOIN JSON_TABLE(attributes, '$[*]' COLUMNS(value TEXT PATH '$')) AS jt WHERE jt.value LIKE "%a%" OR jt.value LIKE "%f%" ) SELECT DISTINCT or_filtered.id, or_filtered.attributes FROM or_filtered JOIN JSON_TABLE(or_filtered.attributes, '$[*]' COLUMNS(value TEXT PATH '$')) AS jt2 WHERE jt2.value LIKE "sa";
内容的提问来源于stack exchange,提问作者user648200
相关产品推荐
相关产品推荐

