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

Mysql 更改where子句的顺序会中断查询,mysql,mysql-5.6,Mysql,Mysql 5.6,我使用MySQL 5.6遇到了这个案例: 此查询工作并返回预期结果: 选择* 从某张桌子上 其中a='b' 元数据->>“$.country”不为空; 但是,此查询(唯一的区别是where子句的顺序)返回一个错误 选择* 从某张桌子上 其中元数据->>“$.country”不为空 a='b'; MySQL返回的错误是 函数JSON_extract的参数1中的JSON文本无效:“无效值。”位于位置0 为什么? 表中至少有一行的metdata列的值包含格式错误的JSON 我们希望完全删除a='b

我使用MySQL 5.6遇到了这个案例:

此查询工作并返回预期结果:

选择*
从某张桌子上
其中a='b'
元数据->>“$.country”不为空;
但是,此查询(唯一的区别是where子句的顺序)返回一个错误

选择*
从某张桌子上
其中元数据->>“$.country”不为空
a='b';
MySQL返回的错误是

函数JSON_extract的参数1中的JSON文本无效:“无效值。”位于位置0


为什么?

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

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

我怀疑行为上的差异是由于执行的操作顺序造成的。首先计算
a='b'
条件时,在计算
JSON\u EXTRACT(metadata)
表达式之前排除行。由于该行与
a='b'
条件不匹配,MySQL采用了一种快捷方式,它不计算
JSON\u EXTRACT
,它已经知道该行将被排除

当以不同的顺序进行比较时,首先执行
JSON_EXTRACT
函数,当对
元数据中包含无效JSON的行计算表达式时,会引发错误


总结:

表中至少有一行的
metadata
列中存储了格式不正确的JSON

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

建议:

考虑使用
JSON\u VALID
函数来标识具有无效值的行


摘自MySQL参考手册

JSON\u EXTRACT

返回JSON文档中的数据,从与路径参数匹配的文档部分中选择。如果任何参数为NULL或文档中没有找到值的路径,则返回NULL如果json_doc参数不是有效的json文档或任何路径参数不是有效的路径表达式,则会发生错误

JSON\u有效


尝试用括号括起来:
其中(元数据->>“$.country”不是空的)
刚刚尝试过。同样的错误你能在sqlfiddle中复制这个吗?我会尝试,但现在似乎已经失败了。还是只有我一个人?试试看,更可靠,有趣。您是对的,删除另一个where子句会导致相同的错误。我将根据您的建议检查哪些行无效。您完全正确。数据库中有6行JSON格式不正确。所有这些都将value
a
设置为除
“b”
之外的其他值,正如您在首先确定
a=“b”
范围时所猜测的那样,它会忽略这些值,并且查询运行时不会出现任何问题。