21

我想咨询 SQL Server 或短路

代码:

DECLARE @tempTable table
    (
        id int
    )
INSERT @tempTable(id) values(1)
      
DECLARE @id varchar(10)
SET @id = 'x'
SELECT * FROM @tempTable WHERE 1=1 OR id = @id --successfully
SELECT * FROM @tempTable WHERE @id = 'x' OR id = @id --Exception not Convert 'x' to int

为什么?1=1并且@id='x'true

SQL Server OR 运算符:是否有短路功能?</p>

谢谢

4

3 回答 3

17

在 SQL 中,不要求OR 子句提前中断。换句话说,是否同时检查这两个条件取决于优化器。我不是 MSSQL 优化器方面的专家,但我见过优化器有和没有短路 OR 子句的实例。

于 2012-06-27T05:20:16.667 回答
5

刚刚偶然发现这个问题,并且已经找到了这个博客条目:http ://rusanu.com/2009/09/13/on-sql-server-boolean-operator-short-circuit/

SQL Server 可以在任何它认为合适的地方自由优化查询,因此在博客文章中给出的示例中,您不能依赖短路。

但是,显然记录了一个 CASE 以按书面顺序评估 - 检查该博客文章的评论。

于 2012-08-14T19:35:41.613 回答
-4

很明显,MS Sql server 支持短路理论,通过避免不必要的检查来提高性能,

支持示例:

SELECT 'TEST'
WHERE 1 = 'A'

SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'

在这里,第一个示例将导致错误“将 varchar 值 'A' 转换为数据类型 int 时转换失败。”

虽然第二个条件很容易运行,因为条件 1 = 1 评估为 TRUE,因此第二个条件根本没有运行。

此外

SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'

在这里,第一个条件将评估为 false,因此 DBMS 将适用于第二个条件,并且您将再次得到转换错误,如上例所示。

注意:我写了错误的条件只是为了意识到天气条件被执行或短路,如果查询结果错误意味着条件被执行,否则短路。

简单说明

考虑,

WHERE 1 = 1 OR 2 = 2

由于第一个条件被评估为TRUE,因此评估第二个条件毫无意义,因为它的任何值的评估都不会影响结果,因此 Sql Server 通过跳过不必要的条件检查或评估来节省查询执行时间的好机会.

“OR”的情况下,如果第一个条件被评估为TRUE ,则由“OR”连接的整个链将被视为评估为 true,而不评估其他条件。

condition1 OR condition2 OR ..... OR conditionN

如果 condition1 被评估为 true,则将所有条件休息,直到 conditionN 被跳过。概括地说,在确定第一个TRUE时,将跳过由 OR 链接的所有其他条件。

考虑第二个条件

WHERE 1 = 0 AND 1 = 1

由于第一个条件被评估为FALSE,因此评估第二个条件毫无意义,因为它的任何值的评估都不会影响结果,因此 Sql Server 再次通过跳过不必要的条件检查或评估来节省查询执行时间的好机会.

“AND”的情况下,如果第一个条件被评估为FALSE ,则与“AND”连接的整个链将被视为评估为 FALSE,而不评估其他条件。

condition1 AND condition2 AND ..... conditionN

如果 condition1 被评估为FALSE,则其余所有条件直到conditionN被跳过。概括地说,在确定第一个FALSE时,将跳过由AND链接的所有其他条件。

因此,明智的程序员应该始终以这样一种方式对条件链进行编程,以便首先评估成本较低或最能消除的条件,或者以能够最大限度地利用短路的方式安排条件

谢谢并恭祝安康,

Rk_Hirpara

于 2015-06-12T08:01:09.580 回答