6

鉴于:

WHERE (@Id Is NULL OR @Id = Table.Id)

如果@Id 为空:表达式的计算结果为真。第二部分 @Id = Table.Id 是否仍然被考虑?或者考虑到第一部分是(c#中的情况),表达式计算为真就足够了。

这是相关的,因为有一些更复杂的 OR 语句,在这些语句中,了解是否所有部分都被评估很重要。


更新:

从那以后我发现这种语法是一个很好的选择

WHERE (Table.Id = ISNULL(@Id, Table.Id))
4

2 回答 2

11

有时他们是,有时他们不是。SQL Server 不保证布尔运算符短路,不要依赖它来保证正确性。请参阅此博客条目:布尔运算符短路

像这样依赖于@variables 的复杂查询最好写成显式的 IF 语句:

IF (@id IS NULL)
  SELECT ... FROM ... WHERE ...
ELSE
  SELECT ... FROM ... WHERE ...
于 2009-11-19T05:15:10.360 回答
1

对于这样的查询,执行计划可能不是那么好。两者都将被评估。

于 2009-11-19T05:12:21.303 回答