MySQL使用JSON_EXTRACT遇非法JSON报错,如何跳过无效行?
解决JSON格式错误导致的SQL查询报错问题
你的问题出在:虽然WHERE子句里加了JSON_VALID(json_column) = 1,但数据库执行条件的顺序不一定和你写的顺序一致,可能先执行JSON_EXTRACT操作,导致无效JSON被处理,触发报错。
要跳过格式错误的JSON行,最可靠的方式是先筛选出合法的JSON行,再在这些行上执行字段提取,可以用以下两种方式实现:
方法1:子查询过滤有效JSON
SELECT JSON_EXTRACT(json_column, '$.payload.from') as was, JSON_EXTRACT(json_column, '$.payload.to') as now FROM ( -- 先筛选出合法的JSON数据 SELECT json_column FROM orders WHERE JSON_VALID(json_column) = 1 ) AS valid_orders WHERE JSON_EXTRACT(json_column, '$.action') = 'change' AND JSON_EXTRACT(json_column, '$.payload.from') IS NOT NULL AND JSON_EXTRACT(json_column, '$.payload.to') IS NOT NULL AND JSON_EXTRACT(json_column, '$.action') IS NOT NULL;
方法2:用CTE(MySQL 8.0+支持)
如果你的MySQL版本是8.0及以上,用CTE会让代码结构更清晰:
WITH valid_orders AS ( SELECT json_column FROM orders WHERE JSON_VALID(json_column) = 1 ) SELECT JSON_EXTRACT(json_column, '$.payload.from') as was, JSON_EXTRACT(json_column, '$.payload.to') as now FROM valid_orders WHERE JSON_EXTRACT(json_column, '$.action') = 'change' AND JSON_EXTRACT(json_column, '$.payload.from') IS NOT NULL AND JSON_EXTRACT(json_column, '$.payload.to') IS NOT NULL AND JSON_EXTRACT(json_column, '$.action') IS NOT NULL;
另外,你也可以用MySQL的JSON路径运算符->替代JSON_EXTRACT,写法更简洁,比如json_column->'$.payload.from',功能和原语句完全一致。
内容的提问来源于stack exchange,提问作者Erlandas
相关产品推荐
相关产品推荐

