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

使用嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 15:43:14