逻辑表达式不会放弃希望的结果

逻辑表达式不会放弃希望的结果

问题描述:

欧凯,首先,请允许我提请相关表格和虚拟数据继续之前使用(简单的表结构来重新产生问题):逻辑表达式不会放弃希望的结果

|----------------------------------------------| 
|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语句。真的很感激,如果有人可以深入解释这一点。

+0

数据中有错误。 ''''''''后面''''''''' – trincot

+0

@trincot不,这是我真正的实时数据看起来像 –

+0

在这种情况下,即使您要纠正优先级问题,也不能指望与第一行匹配。你的条件需要''jacky'和'y'的出现。 – trincot

在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,也不在其电子邮件字段。

+0

好吧,当看看你的例子的第二个查询,让我清楚它是怎么回事 –

+0

我真的认为,它为什么不返回第一行,因为ID已经等于1,如果它做短路,为什么不返回第一行并留下余下的操作数。就像这个'(ID = 1)AND(name LIKE'%jacky%')AND(email LIKE'%jacky%')' –

+0

但是如果这就是你想要的,你不应该说“AND”。如果具有正确的ID就足以让您进行匹配,那么您不希望用“AND”添加另一个条件。将其更改为“OR”进行短路。然后门仍然对其他行可能满足其他条件,并没有ID 1. – trincot