【问题标题】:Is "OR" in SQL Server short-circuiting?SQL Server 中的“或”是否短路?
【发布时间】:2012-05-01 12:46:48
【问题描述】:

“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 会做检查吗?

关于优化查询(和服务器内存)

让你失望

【问题讨论】:

  • VB 的Or 实际上不是 短路并且 评估这两个条件。与 VB 中的OrElse 进行比较。唯一一次短路(或不)真正在语义方面很重要是在条件中允许包括异常在内的副作用,这是另一个问题: "SQL Server 允许条件中的副作用吗?"
  • @pst:虽然 OP 想要短路的原因是为了性能,但这是一个有效的非副作用相关原因:)
  • @mellamokb 是的,我完全避免回应这种愿望 ;-)
  • 感谢您的回答。这真的很有帮助。主要是为了记住我 dba.stackexchange(我的错)。

标签: performance sql-server-2005 boolean-logic short-circuiting


【解决方案1】:

在大多数情况下,是的,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/

【讨论】:

    【解决方案2】:

    来自Microsoft Connect

    感谢您的反馈。我们今天在 SQL Server 中支持的逻辑运算符是 ANSI SQL 标准中指定的,并且几乎所有数据库系统都支持这些逻辑运算符。我们不打算扩展它来支持更多非常规的逻辑运算符。如果您想有条件地评估表达式,请在 SQL Server 中使用 CASE 表达式,例如:

    哪里的情况 何时(选择 1 where ) 何时(选择 2 where ) ... 结束 = 1

    CASE 表达式保证按顺序计算 WHEN/THEN 子句。

    【讨论】:

      猜你喜欢
      • 2015-02-13
      • 2010-09-27
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2015-02-05
      • 2010-12-05
      • 2013-06-06
      • 2012-03-17
      相关资源
      最近更新 更多