更改 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
我 运行 使用 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