鉴于:
WHERE (@Id Is NULL OR @Id = Table.Id)
如果@Id 为空:表达式的计算结果为真。第二部分 @Id = Table.Id 是否仍然被考虑?或者考虑到第一部分是(c#中的情况),表达式计算为真就足够了。
这是相关的,因为有一些更复杂的 OR 语句,在这些语句中,了解是否所有部分都被评估很重要。
更新:
从那以后我发现这种语法是一个很好的选择
WHERE (Table.Id = ISNULL(@Id, Table.Id))
鉴于:
WHERE (@Id Is NULL OR @Id = Table.Id)
如果@Id 为空:表达式的计算结果为真。第二部分 @Id = Table.Id 是否仍然被考虑?或者考虑到第一部分是(c#中的情况),表达式计算为真就足够了。
这是相关的,因为有一些更复杂的 OR 语句,在这些语句中,了解是否所有部分都被评估很重要。
更新:
从那以后我发现这种语法是一个很好的选择
WHERE (Table.Id = ISNULL(@Id, Table.Id))
有时他们是,有时他们不是。SQL Server 不保证布尔运算符短路,不要依赖它来保证正确性。请参阅此博客条目:布尔运算符短路。
像这样依赖于@variables 的复杂查询最好写成显式的 IF 语句:
IF (@id IS NULL)
SELECT ... FROM ... WHERE ...
ELSE
SELECT ... FROM ... WHERE ...
对于这样的查询,执行计划可能不是那么好。两者都将被评估。