2017-04-20 100 views
4

下面是一個存儲過程創建語句:如何在SQL查詢中使用IF-THEN-ELSE邏輯包含可選參數?

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) 

很簡單吧?但是,如果這些參數中的任何一個爲空(或包含空字符串),我想從搜索中省略它們,並僅通過非空參數進行搜索。我在想這樣的事情:

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

這顯然是僞代碼。我怎樣才能做到這一點?如果這是一項簡單的任務,請原諒我;我是SQL新手。

回答

4

考慮下。如果參數爲空或空,默認值將是場問題

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) 
+0

因此,如果參數爲空(或包含空字符串),它是否從搜索中被省略? – ic3man7019

+0

@ ic3man7019不,它只會將該字段與其自身評估爲真。大多數答案都是一樣的。 –

+2

@ ic3man7019我想跳進來,只是指出它會給出相同的結果,就像它被省略一樣。我使用這種做法很多,並沒有看到更好的這種查詢。而且,還有很多其他答案提出了動態sql,只要有可能,我都會避免它。使用動態sql時,請考慮對[性能和安全性](http://www.sommarskog.se/dynamic_sql.html)的影響。 – ahoxha

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 = '') 
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 

,只是使用相同的邏輯其他參數。

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); 
+1

不是確定的最佳方式。 –

+0

@JorgeCampos可能是一個更好的方法是更現實的 – McNets

+0

是的,它絕對是.... –