逻辑表达式不会放弃希望的结果
欧凯,首先,请允许我提请相关表格和虚拟数据继续之前使用(简单的表结构来重新产生问题):逻辑表达式不会放弃希望的结果
|----------------------------------------------|
|users |
|----------------------------------------------|
|ID | name | email |
|----------------------------------------------|
|1 | jack jill | [email protected] |
|----------------------------------------------|
|2 | jack jacky | [email protected] |
|----------------------------------------------|
这里是MySQL查询语句中使用:
SELECT *
FROM `users`
WHERE `ID` = 1
AND `name` LIKE '%jacky%'
OR `email` LIKE '%jacky%'
预期结果:排1号
实际结果:行无2
问题:
1)处于上面的语句的逻辑表达式执行短路评价是什么?
2)如果是(来自问题1),为什么它不返回第一行作为第一个已经计算为TRUE的表达式。 3)如果不是(来自问题1),那么评估哪个表达式以及发生操作符优先级的顺序?
所有这些都在我的脑海中,我真的很困惑它如何评估。即使它只是一个简单的SQL语句。真的很感激,如果有人可以深入解释这一点。
在SQL中,AND
运算符优先于OR
。所以,你可能要重写,与这样的括号:
SELECT *
FROM `users`
WHERE `ID` = 1
AND ( `name` LIKE '%jacky%'
OR `email` LIKE '%jacky%'
)
在您的版本的最后一个条件(即email LIKE '%jacky%'
)就足以获得匹配。你能想象的默认优先级是这样的:
SELECT *
FROM `users`
WHERE ( `ID` = 1
AND `name` LIKE '%jacky%'
)
OR `email` LIKE '%jacky%'
与该修正的版本会有其实是没有更多的比赛,因为在第一行的名称场没有jacky
,也不在其电子邮件字段。
好吧,当看看你的例子的第二个查询,让我清楚它是怎么回事 –
我真的认为,它为什么不返回第一行,因为ID已经等于1,如果它做短路,为什么不返回第一行并留下余下的操作数。就像这个'(ID = 1)AND(name LIKE'%jacky%')AND(email LIKE'%jacky%')' –
但是如果这就是你想要的,你不应该说“AND”。如果具有正确的ID就足以让您进行匹配,那么您不希望用“AND”添加另一个条件。将其更改为“OR”进行短路。然后门仍然对其他行可能满足其他条件,并没有ID 1. – trincot
数据中有错误。 ''''''''后面''''''''' – trincot
@trincot不,这是我真正的实时数据看起来像 –
在这种情况下,即使您要纠正优先级问题,也不能指望与第一行匹配。你的条件需要''jacky'和'y'的出现。 – trincot