我正在阅读有关OR运算符的文档,它说:
大多数更好的DBMS甚至不会评估第二个条件 如果已经满足第一个条件,则为OR WHERE子句。 (如果 满足第一个条件,则无论 第二个条件)。
SELECT prod_code, prod_price
FROM Articles
WHERE Code = '1' OR Code = '2'
这是否意味着文档中如果Code ='1'查询将返回所有带有'1'的值,而忽略第二个条件WHERE Code ='2'。
我已经在SQL Server上对其进行了测试,它返回的所有值都为1,所有值都为2,因此实际上是2行。...
所以我有点困惑?
谢谢 干杯
答案 0 :(得分:4)
该语句仅涉及优化,称为“短路”。就是说,2
符合条件时,不会与1
进行比较。因为与2
的比较得出的结果无关紧要。
您似乎有点困惑
如果Code ='1'查询将返回所有值'1',而忽略第二个条件WHERE Code ='2'。
Code
是每一行中的一列,而不是对于所有行都是恒定的总值。 (如果是这样,它将在SQL Server中为@Code
,而不是@Code
。)
不过,以您的示例为例,您应该使用IN
:
WHERE Code IN ('1', '2')
并且,如果Code
是数字,则比较值不应包含单引号。
答案 1 :(得分:1)
从我的原始评论中删除:这意味着,如果某行满足Code = 1
的条件,则不会评估该行的子句Code = 2
。这并不意味着它将停止检查其余的行。 RDBMS仍将返回满足这些要求之一的每一行。
所以,如果我们有一个像这样的表:
CREATE TABLE YourTable (ID int IDENTITY,
Code int,
SomeValue varchar(10));
INSERT INTO YourTable (Code,SomeValue)
VALUES (1,'asdkjsa'),
(1,'asdojsa'),
(2,'saohdsald'),
(3,'sdfkjhsadk'),
(3,'asdkjsagd');
如果您要运行查询SELECT * FROM YourTable WHERE Code = 1 OR Code = 2;
,则对于第二个第1 2行,OR Code = 2
将不会被评估,因为Code = 1
已被评估为true。
但是,您可以使用更简洁的运算符WHERE Code = 1 OR Code = 2
:IN
,而不是使用WHERE Code IN (1,2)
。
答案 2 :(得分:1)
这是否意味着如果Code ='1'查询将返回所有 值“ 1”而忽略第二个条件WHERE代码=“ 2”。
每行Code
列都有1个值。
扫描表后,将检查WHERE
子句中的条件。
如果您使用的rdbms执行短路评估,则对于OR
:
如果值是'1'
,则它也不会与'2'
,因为它是不需要的,因此继续进行下一行。
如果该值不是'1'
,则它将与'2'
进行另一个比较。
因此,请回答您的问题:
带有Code = '2'
的行不会被忽略。
当不需要 时,将忽略条件检查。
答案 3 :(得分:0)
您的示例搜索条件为
Code = '1' OR Code = '2'
这是一个布尔表达式,它本身由两个与OR
组合的子布尔表达式组成。
Code = '1'
Code = '2'
在SQL中,布尔表达式可以具有三个可能的真值true
,false
,unknown
。
在将表达式与AND
或OR
结合使用时,真值表可用于扩展所有可能的结果。 OR
的真值表如下。
╔═════════╦══════╦═════════╦═════════╗
║ ║ TRUE ║ FALSE ║ UNKNOWN ║
╠═════════╬══════╬═════════╬═════════╣
║ TRUE ║ TRUE ║ TRUE ║ TRUE ║
║ FALSE ║ TRUE ║ FALSE ║ UNKNOWN ║
║ UNKNOWN ║ TRUE ║ UNKNOWN ║ UNKNOWN ║
╚═════════╩══════╩═════════╩═════════╝
通过查看上表,可以看到,如果您知道一个子表达式为真,那么另一个表达式具有什么值并不重要。整个组合表达式的值仍为true
,因此甚至不需要对其求值。
SQL Server 可以进行短路评估,但是it doesn't guarantee that it will。
此外,它可能会提出一个执行计划,其中两个谓词甚至都不相关在一起进行评估。可能会为问题中的查询提出一个计划,该计划包含带有两个搜索的索引搜索运算符。在Code = '1'
上一个,在Code = '2'
上一个。
现在可以从执行计划中删除单独的谓词评估,因为可以确保这些索引查找的组合结果将与WHERE
子句匹配,因此除了进行什么操作外,无需执行任何其他谓词评估。将会是这些探索的一部分。