在简单的sql书中,如果我使用where 1 = 0
,有一部分代码提及,我可以安全地添加OR条件,如:
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。我也可以将它用于Or
语句吗?
Istill没有得到where 1 = 0
的部分
任何解释都会很棒。
答案 0 :(得分:5)
这取决于您正在处理的布尔操作的类型。如果要添加可变数量的AND
语句,则使用总是求值为true的语句,例如1 = 1
。另一方面,如果要对OR
语句执行相同操作,则应使用计算结果为false的语句,例如1 = 0
。
假设你有一个带有不确定真值的布尔变量x
(它可能是真的,或者它可能是假的。你不知道。)现在,如果你找到{{1的值无论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
。
答案 1 :(得分:1)
MySQL使用short-circuit boolean evaluation.
一旦结果解析为TRUE或FALSE,MySQL就会停止评估其余的行。
TRUE OR ? OR ?
将始终为TRUE,因此MySQL只会查看第一个项目,而不会测试其他任何内容。
FALSE AND ? AND ?
将始终为FALSE,因此MySQL将不再查看其他测试。
这有(非预期的)副作用,MySQL永远不会用LIKE查看你的表,而是返回以下查询中的所有行:
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
答案 2 :(得分:0)
我可以使用下面的内容吗?
WHERE
1=1
OR name LIKE '%Toledo%'
OR billaddr LIKE '%Toledo%'
OR shipaddr LIKE '%Toledo%'
将返回每一行(因为它始终为真),所以没有......