MySQL WITH与json_table联合使用产生报错1210 - Incorrect arguments to JSON_TABLE

本文讲述了在SQL查询中,使用WITH子句结合JSON_TABLE函数时遇到错误1210的问题,发现通过添加GROUP BY解决。重点在于理解WITH和GROUP BY对JSON_TABLE操作的影响,以及底层原理分析。

问题描述如题,查了半天没搞明白原理,但找到报错原因了。
语法大致如下:
WITH table1 AS (SELECT id, json_array_col FROM some_table) SELECT * FROM table1, JSON_TABLE(json_array_col, "$[*]" COLUMNS(array_element CHAR(22) PATH "$")) t1;
报错1210 - Incorrect arguments to JSON_TABLE,
修复:
WITH table1 AS (SELECT id, json_array_col FROM some_table) SELECT * FROM table1 GROUP BY id, JSON_TABLE(json_array_col, "$[*]" COLUMNS(array_element CHAR(22) PATH "$")) t1;
差别只在group by,
SELECT id, json_array_col FROM some_table, JSON_TABLE(json_array_col, "$[*]" COLUMNS(array_element CHAR(22) PATH "$")) t1;
而此时,json_table在实体表时,不需要group by,并不会产生此错误,只在with语法与json_table合作使用时会产生如此报错。
先记下,有空再查下。
有知道底层原理的大佬可以指点迷津一二。

错误代码 1210Incorrect arguments to JSON_TABLE)通常表示 `JSON_TABLE` 函数的参数使用不正确。以下是可能导致该错误的原因及相应的解决办法: #### 1. `lecturer_ids` 列不是有效的 JSON 数据 虽然已经使用 `JSON_VALID` 过滤了无效的 JSON 数据,但仍可能存在其他特殊情况。可以进一步检查数据,确保 `lecturer_ids` 列中的数据是标准的 JSON 数组。例如: ```sql -- 再次确认数据是否为有效的 JSON 数组 SELECT id, lecturer_ids, JSON_VALID(lecturer_ids) FROM live_room WHERE JSON_TYPE(lecturer_ids) != 'ARRAY'; ``` 若存在非数组类型的数据,可以将其过滤掉: ```sql SELECT GROUP_CONCAT(el.lecturer_name SEPARATOR ',') AS lecturer_names FROM ( SELECT * FROM live_room WHERE JSON_VALID(lecturer_ids) = 1 AND JSON_TYPE(lecturer_ids) = 'ARRAY' ) t JOIN JSON_TABLE(t.lecturer_ids, '$[*]' COLUMNS (lecturer_id INT PATH '$')) AS jt ON jt.lecturer_id = el.user_id JOIN ent_lecturer el ON jt.lecturer_id = el.user_id; ``` #### 2. `JSON_TABLE` 函数的路径表达式有误 路径表达式 `'$[*]'` 用于提取 JSON 数组中的所有元素。若 JSON 结构更为复杂,该路径表达式可能不适用。例如,若 JSON 数据是嵌套结构,需要调整路径表达式。可以使用 `JSON_EXTRACT` 函数查看数据结构: ```sql SELECT id, JSON_EXTRACT(lecturer_ids, '$') FROM live_room; ``` 根据查看结果调整路径表达式。 #### 3. 数据类型不匹配 `JSON_TABLE` 函数中指定的列数据类型(如 `lecturer_id INT`)必须 JSON 数组中的元素类型相符。若 JSON 数组中的元素并非有效的整数,就会报错。可以使用 `JSON_TYPE` 函数检查元素类型: ```sql SELECT id, JSON_TYPE(JSON_EXTRACT(lecturer_ids, '$[0]')) FROM live_room; ``` 若 JSON 数组中的元素不是整数,可尝试将其转换为合适的数据类型。例如,若元素是字符串类型的数字,可以使用 `CAST` 函数进行转换: ```sql SELECT GROUP_CONCAT(el.lecturer_name SEPARATOR ',') AS lecturer_names FROM ( SELECT * FROM live_room WHERE JSON_VALID(lecturer_ids) = 1 AND JSON_TYPE(lecturer_ids) = 'ARRAY' ) t JOIN JSON_TABLE(t.lecturer_ids, '$[*]' COLUMNS (lecturer_id INT PATH '$')) AS jt ON CAST(jt.lecturer_id AS CHAR) = CAST(el.user_id AS CHAR) JOIN ent_lecturer el ON CAST(jt.lecturer_id AS CHAR) = CAST(el.user_id AS CHAR); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值