MySQL中JSON_EXTRACT在WHERE条件中失效?附报错与相关代码
SQL JSON查询失效及报错问题
尝试执行的SQL语句
- 语句1:
SELECT * FROM `gass_pedan` WHERE json_extract(`cars_info`, '$.driver_id') = 4;
- 语句2:
SELECT * FROM `gass_pedan` WHERE JSON_CONTAINS(`cars_info`, '4', '$.driver_id')
报错信息
#3141 - Invalid JSON text in argument 1 to function json_extract: "The document is empty." at position 0.
cars_info字段的JSON示例
{"mxrid":2,"mxrno":"11","driver_id":"4","drname":"carl","cartype":"mixer"}
问题分析与解决方案
核心问题
- 空/无效JSON触发报错:报错提示“文档为空”,说明表中
cars_info字段存在空值、空字符串或格式错误的JSON数据,这类数据在执行JSON函数时会触发#3141错误。 - 数据类型不匹配导致无结果:JSON中
driver_id是字符串类型(值为"4"),但第一条语句用数字4做匹配,类型不匹配会导致查询无返回结果。
修正后的SQL语句
方案1:修复json_extract查询
先过滤有效JSON数据,再匹配对应字符串值:
SELECT * FROM `gass_pedan` WHERE JSON_VALID(`cars_info`) = 1 AND json_extract(`cars_info`, '$.driver_id') = '4';
方案2:修复JSON_CONTAINS查询
JSON_CONTAINS的第二个参数需为JSON格式的字符串(要包裹双引号),同时过滤无效JSON:
SELECT * FROM `gass_pedan` WHERE JSON_VALID(`cars_info`) = 1 AND JSON_CONTAINS(`cars_info`, '"4"', '$.driver_id');
补充说明
JSON_VALID()函数可提前筛选格式合法的JSON数据,避免空文档报错。- JSON字段的取值类型必须与匹配值类型严格一致,字符串类型的JSON值要用单引号包裹的字符串匹配,不能直接用数字。
内容的提问来源于stack exchange,提问作者SchoolforDesign
相关产品推荐
相关产品推荐

