2016-06-29 82 views
1

我有一個SQL Server存儲過程,它根據一組條件參數過濾一組數據。SQL Server:在where子句中使用AND或OR基於條件

@Parameter1 int = null, 
@Parameter2 int = null, 
@Parameter3 int = null, 
@Parameter4 int = null, 
@Parameter5 int = null, 
@UseOR bit = False 

Select * 
From Table 
Where 
    (@Parameter1 Is Null Or Column1 = @Parameter1) And 
    (@Parameter2 Is Null Or Column2 = @Parameter2) And 
    (@Parameter3 Is Null Or Column3 = @Parameter3) And 
    (@Parameter4 Is Null Or Column4 = @Parameter4) And 
    (@Parameter5 Is Null Or Column5 = @Parameter5) 

但是,對於某些用戶來說,需要將兩個列(Column3和Column4)與OR連接而不是AND。

這就是@UseOR參數進來所以只對某些用戶(這將在應用程序代碼中所定義的),該查詢應具有OR柱3和4之間,例如:

Select * 
From Table 
Where 
     (@Parameter1 Is Null Or Column1 = @Parameter1) And 
     (@Parameter2 Is Null Or Column2 = @Parameter2) And 
     (@Parameter3 Is Null Or Column3 = @Parameter3) OR 
     (@Parameter4 Is Null Or Column4 = @Parameter4) And 
     (@Parameter5 Is Null Or Column5 = @Parameter5) 

對於其他人來說,它會像原文一樣。我不確定是否有可能根據@UseOR是否爲true來將AND更改爲OR。在我看來,很高興能有這樣的事情:

Select * 
From Table 
Where 
    (@Parameter1 Is Null Or Column1 = @Parameter1) And 
    (@Parameter2 Is Null Or Column2 = @Parameter2) And 
    (@Parameter3 Is Null Or Column3 = @Parameter3) IIF(@UseOR = True, OR, AND) 
    (@Parameter4 Is Null Or Column4 = @Parameter4) And 
    (@Parameter5 Is Null Or Column5 = @Parameter5) 

但顯然這是行不通的。有沒有辦法做這樣的事情,還是我完全錯誤地思考它?

+0

我覺得做複雜的斷言這裏可能是與直覺相反:大約有兩個不同的程序和調用一個或其他根據條件是什麼? – fedorqui

+0

在你的程序邏輯中處理,而不是在SQL中。有多個查詢沒有任何問題。或者你可以在你的邏輯中建立查詢。 –

+3

你知道OR會被最後使用 – Paparazzi

回答

2

繁瑣的解決辦法是這樣的:

@Parameter1 int = null, 
@Parameter2 int = null, 
@Parameter3 int = null, 
@Parameter4 int = null, 
@Parameter5 int = null, 
@UseOR bit = False 

Select * From Table 
Where 
    (@Parameter1 Is Null Or Column1 = @Parameter1) And 
    (@Parameter2 Is Null Or Column2 = @Parameter2) And 
    (
     (
      @UseOR = 0 AND 
      ((@Parameter3 Is Null Or Column3 = @Parameter3) And (@Parameter4 Is Null Or Column4 = @Parameter4)) 
     ) OR 
     (
      @UseOR = 1 AND 
      ((@Parameter3 Is Null Or Column3 = @Parameter3) OR (@Parameter4 Is Null Or Column4 = @Parameter4)) 
     ) 
    ) And 
    (@Parameter5 Is Null Or Column5 = @Parameter5) 
+0

我會將其標記爲答案,因爲這是我所要求的。但是,我認爲你是對的,我應該只使用兩個單獨的查詢。 – tigerdi