2017-01-12 64 views
0

可以說我在存儲過程中有一個參數@Name。如果它不爲空/空,我想按此參數進行過濾只有。在任何其他情況下,我想忽略過濾器。有條件地對sql查詢應用過濾器

我想出了以下兩種解決方案。爲了舉例,讓我們只考慮參數爲空的情況。

select * 
    from MyTable 
where (len(rtrim(ltrim(@Name))) > 0 and Name = @Name) or (len(rtrim(ltrim(@Name))) = 0) 

,第二個

@query = 'select * from MyTable' 
if (len(rtrim(ltrim(@Name))) > 0) 
    @query = @query + ' Name = @Name '  

這兩個方法都工作正常。

  • 你認爲哪一個是最乾淨的(在代碼方面)和易於維護的
  • 是否有任何其他(更好)的替代品。

注意:這個問題在代碼審查也可以適應,請評論,如果你這樣想,爲了遷移有

+0

'或@Name是null'? – jarlh

+0

@jarlh我只是省略了它,以保持示例清潔 – Athafoud

+0

@Athafoud:請看我的答案。它向您展示瞭如何在查詢過程變得非常冗長的情況下如何擴展查詢並更好地維護查詢。我使用eaxple的不同表名稱,您可以根據需要更改它,並且它工作得非常好。 –

回答

3

它可以簡化這樣

select * 
    from MyTable 
where Name = @Name or @Name = '' or @Name is null 

或中提到評論,請使用NULLIF檢查空字符串,然後用NULL替換它,然後驗證它針對IS NULL

where (Name = @Name or nullif(@Name, '') is null) 
0

如果您正在使用存儲過程中的動態sql,請嘗試類似這樣的操作。對主選擇查詢和動態查詢使用不同的變量會更容易。使用這種方法時,如果proc變得冗長,它將很容易維護。

declare @finalquery varchar(max) 
    declare @mainSelectquery nvarchar(500); 
    declare @whereCondtions varchar (1000); 
    declare @DateParam datetime 
    set @mainSelectquery='' 
    set @whereCondtions ='' 

    set @finalquery ='' 

    set @DateParam=getdate() 
    set @mainSelectquery = 'select * from tblOrders where 1=1 ' 

    set @whereCondtions = ' and Order_site =''TSN''' 

    set @whereCondtions = @whereCondtions + ' AND CAST(ORDER_APPROVED_DATE_LT AS DATE)=CAST(GETDATE() AS DATE)' 

    set @finalquery =(@mainSelectquery + @whereCondtions) 

    print @finalquery 

---- You can further extend this by adding more where condition based on the parameter pass in stored proc 
if (@OrderID !=0) 
begin 
set @whereCondtions = ' OrderID='+str (@stateRefID) 
end 
1

你並不需要檢查的長度,默認情況下,SQL服務器是尾隨,空間敏感的(唯一的例外是當LIKE謂詞的表達式的右側包含尾隨空格,然後墊沒有被移除)。

取下面的代碼。

DECLARE @Name='    ' 

IF(@Name='') SELECT 1 ELSE SELECT 0 

如果你運行你上面的上面的代碼將得到1的結果在你的情況,你可以刪除LTRIM和RTRIM和簡單地測試了針對空字符串字面平等。

select * 
    from MyTable 
    where ((@Name='' OR @Name IS NULL)OR(Name = @Name)) 

OR

IF(@Name='') SET @Name=NULL 

select * 
     from MyTable 
     where (@Name IS NULL OR Name = @Name)