起因
在使用json_contains查询MySQL表里面的JSON字段数据时,报错:3141 Invalid JSON text in argument 1 to function json_contains: "The document is empty." at position 0.
经过
通过排查发现,是因为所查JSON字段json_field存在空值""引起的,原SQL语句如下所示:
SELECT*
FROM`table`
WHEREjson_contains(`json_field`, '{"id":462}') AND `table`.`deleted_at` IS NULL
刚开始通过增加JSON字段不为空的方法来尝试解决,SQL语句如下所示:
SELECT*
FROM`table`
WHERE`json_field` IS NOT NULL AND json_contains( `json_field`, '{"id":462}' ) AND `table`.`deleted_at` IS NULL
发现此种方法不适合于我的情况,可以参考。
解决
通过MySQL的json_valid函数先排除非法JSON字段的数据行,再执行查询即可,SQL如下所示:
SELECT*
FROM`table`
WHEREjson_valid( `json_field` ) AND json_contains( `json_field`, '{"id":462}' ) AND `table`.`deleted_at` IS NULL
附
PHP框架laravel解决方式:
$table->whereRaw('json_valid(json_field)')->whereJsonContains("json_field", ["id" => 462]);