我有一个带有默认值的存储过程,我将其设置为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,所以请在你的答案中专注于这个或任何最新版本。
答案 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
。