更改 where 子句的顺序会中断查询

Changing order of where clauses breaks the query

我 运行 使用 MySQL 5.6:

此查询有效,returns 预期结果:

select *
from some_table
where a = 'b'
and metadata->>"$.country" is not null;

但是,这个查询(唯一不同的是where子句的顺序)returns出错

select *
from some_table
where metadata->>"$.country" is not null
and a = 'b';

错误 MySQL returns 是

Invalid JSON text in argument 1 to function json_extract: "Invalid value." at position 0.

为什么?

metdata 列的值包含 table 中至少一行的格式错误 JSON。

我们希望完全删除 a = 'b' 条件,我们也会观察到相同的错误。

我怀疑行为上的差异是由于执行操作的顺序造成的。当首先评估 a = 'b' 条件时,会排除评估 JSON_EXTRACT(metadata) 表达式之前的行。由于该行不符合 a = 'b' 条件,MySQL 走捷径,它不计算 JSON_EXTRACT,它已经知道该行将被排除。

当比较以不同的顺序完成时,首先执行 JSON_EXTRACT 函数,当对 [=17= 中具有无效 JSON 的行计算表达式时会引发错误].


总结:

table 中至少有一行 JSON 存储在 metadata 列中。

观察到的两个查询行为的差异是由于不同的操作顺序。

建议:

考虑使用 JSON_VALID 函数来识别具有无效值的行。


摘自MySQL参考手册

JSON_EXTRACT

Returns data from a JSON document, selected from the parts of the document matched by the path arguments. Returns NULL if any argument is NULL or no paths locate a value in the document. An error occurs if the json_doc argument is not a valid JSON document or any path argument is not a valid path expression.

https://dev.mysql.com/doc/refman/5.7/en/json-search-functions.html#function_json-extract

JSON_VALID

https://dev.mysql.com/doc/refman/5.7/en/json-attribute-functions.html#function_json-valid