2017-02-28 36 views
1

我的問題是我有這樣的查詢:IF或CASE在WHERE SQL查詢的WHERE子句

SELECT * FROM TABLE1 WHERE STATUSID = @PARAMETER 

然後我想創建一個查詢到動態的是這樣的:

IF @PARAMETER IS 1 THEN STATUSID = 1 
IF @PARAMETER IS 2 THEN STATUSID = 2 
IF @PARAMETER IS 3 THEN STATUSID = 1 OR STATUSID = 2 

燦任何人給我一個示例查詢如何做到這一點?我只是想在WHERE子句中這樣做,以便我可以最小化我的代碼行。

+0

爲什麼? – jarlh

+1

請不要大喊。我們不是聾啞人。 –

回答

3

使用或

SELECT * 
FROM TABLE1 
WHERE (STATUSID = 1 and @PARAMETER = 1) 
OR (STATUSID = 2 and @PARAMETER = 2) 
or (STATUSID in (1,2) and @PARAMETER = 3) 
+0

這是一個不錯的訣竅。謝謝先生。 – Muj

3
Use CASE Clause to get result : 

SELECT * FROM TABLE1 WHERE STATUSID = CASE 
    WHEN @PARAMETER = 1 THEN 1 
    WHEN @PARAMETER = 2 THEN 2 
    WHEN @PARAMETER = 3 THEN STATUSID END 
+1

AND/OR通常比where子句中的case表達式更容易優化。 – jarlh

+0

我在= 1附近遇到了一些錯誤,依此類推。或聲明的工作,但無論如何感謝 – Muj

+0

您的查詢的最後一部分將無法解決我的問題'當@PARAMETER = 3那麼STATUSID'因爲我有一個狀態ID 4等等,我不想也選擇 – Muj

2

另一種解決辦法是首先檢查參數,然後執行相應的查詢。

IF @PARAMETER = 1 THEN SELECT * FROM TABLE1 WHERE STATUSID = 1 
IF @PARAMETER = 2 THEN SELECT * FROM TABLE1 WHERE STATUSID = 2 
IF @PARAMETER = 3 THEN SELECT * FROM TABLE1 WHERE STATUSID = 1 OR STATUSID = 2 

是引擎優化的最簡單方法。

+0

是啊這是正確的但我只想在1行代碼中完成。因爲在我的查詢中它包含很多行,所以如果我使用了這種技巧,我的行代碼將變成x3,因爲'if' – Muj

+0

事實上,我也使用了可接受的解決方案,但顯示更多選項似乎是合適的。在有些情況下,發動機很難優化這種過濾器。 –