2012-12-13 18 views
5

Poniżej jest mój gdzie klauzula kwerendy kiedy chcę dane dla określonego użytkownikajeśli warunek w klauzuli WHERE zapytania sql

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

i poniżej jest gdzie klauzula gdy chcę ciągnąć dane dla wszystkich użytkowników :

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

Ponieważ nie chcę 2 oddzielne zapytania, czy istnieje sposób, aby dodać warunek w klauzuli WHERE, aby można było korzystać z jednego zapytania oraz w zależności od wejścia (tj System_user_id) będzie decydować o tym, czy dodaj dodatkowe kryterium w zapytaniu. Będę wysyłać -1, gdy chcę danych dla wszystkich użytkowników & dla konkretnego użytkownika jego system_user_id zostanie wysłany.

+0

I zostały zaktualizowane odpowiedź z wynikami oraz referencja od SQLFiddle, proszę spojrzeć. :) Jeśli potrzebujesz, nadal mogę zachować wcześniejszą wersję odpowiedzi, jednak ..;) – bonCodigo

+0

Powiedziałeś, że nie chcesz 2 oddzielnych zapytań w pytaniu, a następnie oznaczyć odpowiedź dwoma oddzielnymi zapytaniami jako odpowiedzią. –

Odpowiedz

7

Możesz spróbować wykonać następującą procedurę.

Aktualizacja Zapytanie

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; 

Wyniki:

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

Aby zobaczyć konkretny użytkownika:


Inną metodą

aktualizowane po najnowszym komentarzu z OP

zapytania:

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' 
; 

Wyniki: kiedy @uid = -1

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

Proszę o komentarz, jeśli próbowałem się :)

+0

daje błąd w pobliżu "THEN" –

+0

@avinashchavan można uruchomić bez;) – bonCodigo

+0

Thanx za pomoc! –

5

Spróbuj:

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')) 

wariacja na ten temat za pomocą wspólnego wyrażenia tabeli (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 dla ciebie @Diamond Geezer;) – bonCodigo

+0

@bonCodigo Dziękuję.Generalnie będę kodował używając bloków IF (jak w twojej odpowiedzi), ponieważ intencja jest wyraźniejsza. Wykonanie instrukcji "IF" w klauzuli WHERE może być trudne do odczytania i debugowania, jeśli istnieje wiele opcjonalnych parametrów. –

Powiązane problemy