SQL Server存储过程WHERE子句IF CASE无值

时间:2014-06-05 23:15:14

标签: sql sql-server stored-procedures if-statement switch-statement

我有一个带有默认值的存储过程,我将其设置为NULL。在WHERE子句中,对于指定的每个值,而不是NULL或未给出(其中它也将是NULL),我希望列等于此值,否则,我想要在WHERE子句中没有此列的情况下进行搜索。基本结构看起来像这样:

// Set up the stored procedure
USE Table;
GO
CREATE PROCEDURE dbo.SearchTable

    // Specify value(s)
    @Name varchar(50) = NULL

AS

    // Set up the query
    IF(@Name IS NOT NULL
        SELECT * FROM Table WHERE Name=@Name;

    ELSE
        SELECT * FROM Table

BEGIN
END

我有多个参数,因此,对于这个逻辑,我需要为每个参数提供2 IF个参数。正如您可以想象的那样,这会变得枯燥,耗时且容易出错。

我想将这个逻辑移到查询中,最好是移入WHERE子句,但是我找到的任何方法都会导致错误(除了异常,这需要同样多的IF个) 。据我所知,SQL Server不喜欢IF子句中的WHERE,并且使用CASE我必须指定列,我不想这样做

我该怎么办?

修改: 我有SQL Server版本2012,所以请在你的答案中专注于这个或任何最新版本。

2 个答案:

答案 0 :(得分:3)

如果您不关心表现,可以这样做:

SELECT *
FROM Table
WHERE @Name is null or Name = @Name;

通常,or条件会妨碍有效使用索引。不过,或许这不是你的问题。

答案 1 :(得分:1)

你可以这样做。这样做的缺点是索引可能无法正常使用,因此性能可能不会很好。

SELECT * FROM Table
WHERE (@Name Is Null Or Name = @Name)
      And (@Col2 Is Null Or Col2 = @Col2)
      And (@Col3 Is Null Or Col3 = @Col3)

每个列条件是" anded"。或者仅在@var不为空时才用于应用该列条件。例如,如果仅在填充@Name的情况下调用此对象,则它等同于Where Name = @Name。如果同时填充了@ Name@Col2,则相当于Where Name = @Name And Col2 = @Col2