2012-12-13 55 views
5

下面是條件我在那裏時,我想對特定用戶如果在SQL查詢的WHERE子句

where Completion_Date>= '11/01/2011' 
and Completion_Date<= '12/11/2012' 
and System_user_id = 1234 

及以下數據查詢的WHERE子句是WHERE子句時,我想拉的所有數據用戶:

where Completion_Date>= '11/01/2011' 
and Completion_Date<= '12/11/2012' 

因爲我不想2個獨立的查詢,有沒有辦法添加在where子句,這樣我可以使用單一的查詢,並根據輸入(即SYSTEM_USER_ID),它會決定是否條件在查詢中添加額外的條件。 當我想爲所有用戶的數據&發送一個特定用戶的system_user_id將被髮送時,我將發送-1。

+0

我已經更新了結果和答案請參考SQLFiddle,請看看。 :)如果你需要,我仍然可以保留早期版本的答案雖然..;) – bonCodigo

+0

你說你不想在問題中2個單獨的查詢,但然後用兩個單獨的查詢標記答案作爲答案。 –

回答

7

你可以試試下面的方法在這一個變化。

更新查詢

declare @userid int = -1 
if (@userid = -1) 
    BEGIN 

    SELECT * FROM mytable 
    where Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
    and userid in 
     (select distinct userID from mytable) 
    end 
ELSE 
    BEGIN 

    SELECT * FROM mytable 
    where Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
    and userid = @userid 

end; 

結果:

USERID NAME COMPLETION_DATE 
123  john 2011-11-01 
125  tim  2011-11-02 
127  ron  2011-11-08 

要查看特定用戶:


另一種方法

最新評論後更新從OP

查詢:

DECLARE @uid int = -1 
SELECT 
* 
FROM mytable 
WHERE 
(CASE 
    WHEN @uid <> -1 THEN @uid 
    ELSE userid 
    END 
) = userid 

and Completion_Date>= '11/01/2011' 
    and Completion_Date<= '12/11/2012' 
; 

結果:當@uid = -1

USERID NAME COMPLETION_DATE 
123  john 2011-11-01 
125  tim  2011-11-02 
127  ron  2011-11-08 

請評論,如果你已經嘗試了這一點:)

+0

它會給出「THEN」附近的錯誤 –

+0

@avinashchavan你可以運行,然後;) – bonCodigo

+0

Thanx的幫助! –

5

嘗試:

WHERE ((@System_user_id = -1) 
    AND (Completion_Date >= '11/01/2011') 
    AND (Completion_Date <= '12/11/2012')) 
OR ((@System_user_id <> -1) 
    AND (System_user_id = @System_user_id) 
    AND (Completion_Date >= '11/01/2011') 
    AND (Completion_Date <= '12/11/2012')) 

使用公用表表達式(SQL Fiddle

;WITH CompletionDates AS 
(
    SELECT * 
    FROM MyTable 
    WHERE Completion_Date >= '11/01/2011' 
    AND Completion_Date <= '12/11/2012' 
) 
SELECT * 
FROM CompletionDates 
WHERE (@System_user_id = -1) OR (System_user_id = @System_user_id) 
+0

+1爲你@Diamond Geezer;) – bonCodigo

+0

@bonCodigo謝謝。通常我會使用IF塊進行編碼(就像在你的答案中一樣),因爲它的意圖更清晰。如果有許多可選參數,那麼在WHERE子句中執行「IF」語句會變得難以閱讀和調試。 –