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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 16:45:44