我们下面的表达式为T-SQL查询:
Exp1 OR Exp2
被EXP2评估时EXP1是真的吗? 我认为没有必要对它进行评估。
同样地; 对于,
Exp1 AND Exp2
在EXP2评估时EXP1是假的?
我们下面的表达式为T-SQL查询:
Exp1 OR Exp2
被EXP2评估时EXP1是真的吗? 我认为没有必要对它进行评估。
同样地; 对于,
Exp1 AND Exp2
在EXP2评估时EXP1是假的?
不像一些编程语言,你不能指望在短路的T-SQL WHERE
子句。 它可能发生,也可能不会 。
SQL Server中的从左到右的顺序不一定计算表达式。 评价顺序由执行计划控制,计划是基于整个查询的总体估计成本选择。 所以不能确定SQL将执行那种你所描述的短路的优化。 这种灵活性是什么使opimiser有用。 例如这可能是因为在每种情况下所述第二表达可以比第一更有效地进行评估(如果它被编入索引或受到一些约束例如)。
SQL还使用三值逻辑,这意味着一些在二值逻辑中使用的等价规则不适用(尽管这不会改变您所描述的具体例子)。
SQL服务器有时执行布尔短路,有时没有。
这取决于所生成的查询执行计划。 选择的执行计划取决于几个因素,包括柱的WHERE子句中的选择性,表的大小,可用的索引等。
SQL Server查询运算符OR和AND是可交换的。 有没有内在的秩序和查询优化器可以自由选择最低成本的路径,开始评估。 一旦计划被设置,如果其结果是预先确定的其他部分不进行评价。
这方面的知识可以像查询
select * from master..spt_values
where (type = 'P' or 1=@param1)
and (1=@param2 or number < 1000)
option (recompile)
其中评价的图案时@参数被设置为1是保证短路这种模式是典型可选的过滤器。 请注意,它并不重要@params是否之前或其他部分之后被测试。
如果你是非常好的SQL和知道一个事实,即查询最佳被迫下降有一定的计划,你可以使用CASE语句,它们会被嵌套的顺序进行游戏的SQL Server。 下面的实施例将迫使type='P'
总是被第一评价。
select *
from master..spt_values
where
case when type='P' then
case when number < 100 then 1
end end = 1
如果你不相信的最后一个查询的计算顺序,试试这个
select *
from master..spt_values
where
case when type='P' then
case when number < 0 then
case when 1/0=1 then 1
end end end = 1
即使在表达式中的常数1/0=1
是最少的成本评估,这是从来没有评价-否则查询将导致除以零而不是返回任何行(有在主没有行.. spt_values匹配两个条件)。