很明显,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链接的所有其他条件。
因此,明智的程序员应该始终以这样一种方式对条件链进行编程,以便首先评估成本较低或最能消除的条件,或者以能够最大限度地利用短路的方式安排条件