T-SQL其中int = @ var / @ var = null?

时间:2012-02-21 17:23:30

标签: sql sql-server tsql null integer

我遇到的情况是我调用存储过程并传入一些变量。在某些情况下,我将传递null,我希望它返回所有内容。采取以下(年龄为整数列):

[Table]  
[Name] | [Age]  
Mike   | 22  
Fred   | 18  
Bob    | 22 



SELECT * FROM [table] WHERE [Age]=@AgeVar

现在,如果我通过22,我会得到迈克和鲍勃。同样地传入18将让我得到弗雷德。但是,当我传入null /不设置@AgeVar时,如果我想要所有3行怎么办?这是我的问题,非常简单。

编辑:Sproc非常复杂,我真的不想将所有部分加倍,只需要两次,因为下面的答案之一。还有其他方法吗?

4 个答案:

答案 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

它使您的代码具有可读性,尤其是当您有多个参数可能会或可能不会用于搜索时,仍会为您提供合理的性能。