在使用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`
- WHERE
- json_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`
- WHERE
- json_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]);