【问题标题】:AND and OR operator in SQL ServerSQL Server 中的 AND 和 OR 运算符
【发布时间】:2014-05-05 22:54:04
【问题描述】:

SQL Server 中的 AND 运算符是否等同于 C#(或其他语言)中的 &&&

即,如果发现第一个条件为假,它会检查第二个条件吗?

【问题讨论】:

  • 抱歉,我找不到任何文档
  • 对您的查询运行 EXPLAIN。它将向您展示查询是如何解析和执行的,以及使用了哪些索引等。查找有关如何阅读解释计划的文档。
  • ,在 SQL 中,不保证布尔表达式的计算顺序。 不要依赖这个在 C# 或其他语言中可能没问题的布尔“短路”! See this blog post by Remus Rusanu 一个很好的例子
  • "或其他语言" - 一些语言同时定义 short-circuiting 和布尔运算符的非短路变体,或仅定义非短路运算符。你不应该假设短路在所有其他语言中都是通用的。

标签: sql sql-server


【解决方案1】:

不,SQL 中没有短路。例如:

SELECT a, b, c
From T t
WHERE is_numeric(c) = 1 AND cast(c as numeric(10,2)) > 100.00

这可能会在 c 不是数字的情况下生成无效的转换错误。

但是您可以通过重写以使用 CASE 语句来强制它短路:

SELECT a, b, c
From T t
where
case
when is_numeric(c) = 0 then 0
when cast(c as numeric(10,2)) > 100.00 then 1
else 0 
end = 1

一般和除了处理空值任何形式的子句

where <EXPR1> AND <EXPR2> AND <EXP3>

可以写成:

where case
when NOT <EXPR1> then 0
when NOT <EXPR2> then 0
when NOT <EXPR3> then 0
else 1 end = 1

任何形式的表达:

where <EXPR1> OR <EXPR2> OR <EXPR3>

可以写成:

where case
when <EXPR1> then 1
when <EXPR2> then 1
when <EXPR3> then 1
else 0 end = 1

【讨论】:

  • 哪一个会表现更好?短路一个(开关 - 外壳)或另一个?
  • 1) 案例可能会阻止使用索引,因此如果您有一个索引字段,您可以查询然后在案例之外执行此操作。 2)对于非索引字段,大小写可能更快或更慢,具体取决于。例如,SQL Server 的 UDF 成本为零,因此如果您的 WHERE 有 UDF,如果将它们移到 CASE 的末尾,通常可以加快处理速度。但不总是!通过性能调优,始终测试
  • 在我的 sp 中,这个 (pastie.org/8972992) 谓词消耗了 45% 的 CPU。如果我使用case.,我可以减少它吗?
  • @SubinJacob 它取决于数据和查询。 测试一下
猜你喜欢
  • 2015-02-17
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多