在 SQL Server 中,“OR” 运算符是否支持短路?

3

“OR”比较运算符在中文中的工作方式类似于VB。也就是说,如果第一个条件为真,那么后面的条件就不再被检查。

例如:

DECLARE @var1 bit;
SET @var1=1
DECLARE @var2 bit;
SET @var2=1

(@var1=1 or @var2=1)
AND ...

所以,@var等于1,我们不需要检查var2,但是SQL Server会进行检查吗?
这是关于查询优化(以及服务器内存)的问题。
谢谢。

2
http://dba.stackexchange.com/questions/5333/logical-operators-or-and-in-condition-and-order-of-conditions-in-where - Tim Schmelter
2
VB 的 Or 实际上 是短路运算,将会评估两个条件。与 VB 中的 OrElse 进行比较。唯一情况下短路运算(或没有)真正 对语义有影响是当条件允许副作用,包括异常时,这是另一个问题:“SQL Server 允许在条件中有副作用吗?” - user166390
@pst:虽然 OP 想要短路的原因是为了性能,但这是一个有效的非副作用相关的原因 :) - mellamokb
@mellamokb 是的,我完全避免回应那个愿望;-) - user166390
谢谢你的回答。它们真的很有帮助,尤其是提醒我关注dba.stackexchange(这是我的错)。 - forX
可能是SQL Server条件流程的重复问题。 - Ben Voigt
2个回答

2

大多数情况下,是的,SQL Server确实对AND和OR语句使用短路计算,但有时操作的顺序并不如您所期望的那样发生。可以通过以下方式轻松测试:

SELECT '"Divide By Zero" error' AS [test] WHERE (1 / 0 = 1)

SELECT 'NO "Divide By Zero" error' AS [test] WHERE (1 = 1) OR (1 / 0 = 1)

您可以在此处找到Gianluca Sartori的更深入分析:http://www.sqlservercentral.com/articles/T-SQL/71950/

0

来自Microsoft Connect

感谢您的反馈。我们在SQL Server中支持的逻辑运算符是ANSI SQL标准中指定并被几乎所有数据库系统支持的运算符。我们不打算扩展它以支持更不寻常的逻辑运算符。如果您想有条件地评估表达式,则可以在SQL Server中使用CASE表达式,例如:

where case when then (select 1 where ) when then (select 2 where ) ... end = 1

CASE表达式保证了WHEN / THEN子句按顺序进行评估。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接