我遇到的情况是我调用存储过程并传入一些变量。在某些情况下,我将传递null,我希望它返回所有内容。采取以下(年龄为整数列):
[Table]
[Name] | [Age]
Mike | 22
Fred | 18
Bob | 22
SELECT * FROM [table] WHERE [Age]=@AgeVar
现在,如果我通过22,我会得到迈克和鲍勃。同样地传入18将让我得到弗雷德。但是,当我传入null /不设置@AgeVar时,如果我想要所有3行怎么办?这是我的问题,非常简单。
编辑:Sproc非常复杂,我真的不想将所有部分加倍,只需要两次,因为下面的答案之一。还有其他方法吗?
答案 0 :(得分:9)
SELECT * FROM [table] WHERE [Age]=@AgeVar OR @AgeVar IS NULL
正如上面和下面多次提到的,这种技术会破坏大型表的查询性能。用户要小心。
答案 1 :(得分:3)
IF @AgeVar IS NULL
BEGIN
SELECT *
FROM @Table
END
ELSE
BEGIN
SELECT *
FROM @Table
WHERE Age = @AgeVar
END
答案 2 :(得分:1)
我发现如果您有一个常见的案例,那么请使用CASE语句。这只会在极少数情况下使性能下降。因此,如果您经常将null作为参数传递,那么这将更有效。
SELECT *
FROM [table]
WHERE
0 =
CASE
WHEN @AgeVar IS NULL THEN 0
WHEN [Age]=@AgeVar THEN 0
END
答案 3 :(得分:1)
这将为您提供比[Age]=@AgeVar OR @AgeVar IS NULL
方法更好的性能,因为它将生成索引搜索而不是索引扫描:
SELECT * FROM [Table1]
WHERE COALESCE(@AgeVar, Age) = Age
它使您的代码具有可读性,尤其是当您有多个参数可能会或可能不会用于搜索时,仍会为您提供合理的性能。