使用OR运算符-SQL Server

时间:2019-02-10 12:08:05

标签: sql sql-server sql-server-2008 logical-operators

我正在阅读有关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行。...

所以我有点困惑?

谢谢 干杯

4 个答案:

答案 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 = 2IN,而不是使用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中,布尔表达式可以具有三个可能的真值truefalseunknown

在将表达式与ANDOR结合使用时,真值表可用于扩展所有可能的结果。 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子句匹配,因此除了进行什么操作外,无需执行任何其他谓词评估。将会是这些探索的一部分。