如何在SQL查询中使用IF-THEN-ELSE逻辑包含可选参数?

时间:2017-04-20 17:08:33

标签: sql sql-server

以下是存储过程的create语句:

Create Procedure SearchCreatedAssignments
(@LessonName Varchar(50), @DateFrom date, @DateTo Date, @LocationCode Varchar(10))
As 
BEGIN 

基本上,我想编写一个基于参数值搜索数据库的查询。例如:

Select *
from dbo.test

where (LessonName = @LessonName)
AND (StartDate = @DateFrom)
AND (EndDate = @DateTo) 
AND (LocationCode = @LocationCode)

相当简单吧?但是,如果这些参数中的任何一个为null(或包含空字符串),我想从搜索中省略它们,并仅搜索非null的参数。我在想这样的事情:

--if @LocationCode is null OR @LocationCode = '' -> omit @LocationCode from the search

这显然是伪代码。我怎样才能做到这一点?如果这是一项简单的任务,请原谅我;我是SQL的新手。

4 个答案:

答案 0 :(得分:4)

请考虑以下事项。如果参数为NULL或为空,则默认值为相关字段

Select *
from dbo.test
where LessonName   = IsNull(NullIf(@LessonName,''),LessonName) 
 AND  StartDate    = IsNull(NullIf(@DateFrom,''),StartDate) 
 AND  EndDate      = IsNull(NullIf(@DateTo,''),EndDate)
 AND  LocationCode = IsNull(NullIf(@LocationCode,''),LocationCode)

答案 1 :(得分:0)

您可以编写动态SQL语句并在过程中使用sp_ExecuteSQL执行它,或者您可能会对SQL感到棘手:

Select *
from dbo.test    
where (LessonName = @LessonName)
AND (StartDate = @DateFrom)
AND (EndDate = @DateTo) 
AND (LocationCode = @LocationCode or @LocationCode IS NULL or @LocationCode = '')

答案 2 :(得分:0)

您可以使用COALESCE功能以这种方式执行此操作:

where LessonName = coalesce(@LessonName, LessonName)
  AND StartDate = coalesce(@DateFrom, StartDate)
  AND EndDate = coalesce(@DateTo, EndDate) 
  AND LocationCode = coaleasce(@LocationCode, LocationCode)

虽然我不确定空字符串。它适用于空值,在其他数据库中,coalesce也可以处理空字符串。如果它不起作用,您可以以相同的方式使用case

LessonName = case when @LessonName is not null and @LessonName != ''
                  then @LessonName else LessonName end

只需对其他参数使用相同的逻辑。

答案 3 :(得分:0)

INHO在这种情况下,一个好方法是使用动态查询。

DECLARE @cmd VARCHAR(MAX);

SET @CMD = 'SELECT * FROM dbo.Text WHERE @Param1 = 'x''; --at least on parameter
IF @PARAM2 IS NOT NULL
BEGIN
    SET @CMD = @CMD + ' AND Param2 = @Param2'
END 
IF @PARAM3 IS NOT NULL
BEGIN
    SET @CMD = @CMD + ' AND Param3 = @Param3'
END 

EXECUTE (@CMD);