2011-05-26 50 views
4

在简单的SQL书,还有的代码提,如果我用where 1 = 0,我可以放心地添加一个或条件类似部分:Mysql的其中1 = 0混乱

WHERE 
    1=0 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

我没有得到它,为什么当我使用where 1 = 0我可以安全地添加OR语句

我可以只使用类似下面的内容吗?

WHERE 
    1=1 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

据我所知,where 1=1是添加And语句的快捷方式。
据我所知,因为where 1 =1将返回true.Can我可以使用它的Or声明吗?
Istill没有得到的部分where 1 = 0
任何解释将是伟大的。

+0

请注意,为便于阅读,您也可以只用'那里虚假或'&'其中true和'。 – Fx32 2017-03-22 10:57:31

回答

4

这取决于您正在处理的布尔操作的类型。如果要添加可变数量的AND语句,则使用总是计算为真的语句,如1 = 1。另一方面,如果您想要对OR语句执行相同的操作,则应该使用计算结果为false的语句,如1 = 0

假设你有一个布尔变量x有一个不确定的真值(这可能是真的,也可能是假的。你不知道。)现在,如果你发现x AND false的价值,你会得到false,不管x的值是多少。

在另一方面,如果你看看x OR true,你会得到true。再次,这与x的真值无关。

在您的声明中,您希望硬编码值对查询的逻辑没有影响。由于false OR a OR b OR c在逻辑上等于a OR b OR c,硬编码语句不起作用。在另一种情况下,true AND a AND b AND c相当于a AND b AND c

+0

thx you so much – slier 2011-05-27 14:52:07

1

MySQL使用short-circuit boolean evaluation.

只要结果解析到一个明确的TRUE或FALSE的MySQL停止评估行的其余部分。

TRUE OR ? OR ?将始终为TRUE,因此MySQL只会查看第一个项目,而不会测试其他任何项目。
FALSE AND ? AND ?将始终是FALSE,所以MySQL不会再看其他测试。

这有(意外)副作用,即MySQL会从来不看与喜欢你的表,而是在下面的查询返回的所有行:

SELECT * FROM atable 
WHERE 
    1=1       /* <--- this makes the whole OR set always true*/ 
    OR name LIKE '%Toledo%'  /* therefore the like tests are never done  */ 
    OR billaddr LIKE '%Toledo%' /*and all rows are returned */ 
    OR shipaddr LIKE '%Toledo%' 

在此查询:

SELECT * FROM atable 
WHERE 
    1=0       /* false OR ? has an unknown outcome so */ 
    OR name LIKE '%Toledo%'  /* MySQL has to evaluate the LIKE tests */ 
    OR billaddr LIKE '%Toledo%' /*only some rows will be returned*/ 
    OR shipaddr LIKE '%Toledo%' 

这个工程正好符合AND

+0

thx for urx explaination ..绝对帮助 – slier 2011-05-27 14:51:56

0

相反我可以只使用类似下面?

WHERE 
    1=1 
    OR name LIKE '%Toledo%' 
    OR billaddr LIKE '%Toledo%' 
    OR shipaddr LIKE '%Toledo%' 

,将返回每一行(因为它总是如此),所以没有...