簡體   English   中英

有條件地對sql查詢應用過濾器

[英]Apply filter on sql query conditionally

可以說我在存儲過程中有一個@Name參數。 我想這個參數來篩選, 只有當它不為空/空。 在其他情況下,我想忽略過濾器。

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

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 '    

兩種方法都按預期工作。

  • 您認為哪個最干凈(就代碼而言)且易於維護
  • 還有其他(更好)的選擇嗎?

注意:此問題也可能適用於Code Review,如果您認為這樣,請發表評論,以便在那里進行遷移

可以這樣簡化

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

或如注釋中所述,使用NULLIF檢查空字符串,然后將其替換為NULL然后針對IS NULL進行驗證

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

您不需要檢查長度,默認情況下,SQL Server對尾隨空格敏感(此規則的唯一例外是,當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))

要么

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

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

如果您正在存儲過程中使用動態sql,請嘗試執行以下操作。 最好對主選擇查詢和動態查詢使用不同的變量,這些變量可以輕松擴展。 使用這種方法,當處理過程變得冗長時,將易於維護。

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM