以下是存储过程的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的新手。
答案 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);