2012-12-13 6 views
5

Unten ist meine where-Klausel der Abfrage, wenn ich Daten für einen bestimmten Benutzer, wenn die Bedingung in where-Klausel der SQL-Abfrage

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

und unten ist die where-Klausel, wenn ich will ziehen Daten für alle Benutzer will :

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

Da ich 2 separate Abfragen nicht wollen, ist es eine Möglichkeit, einen Zustand, in dem Klausel hinzuzufügen, so dass ich eine einzelne Abfrage verwenden können, und in Abhängigkeit von der Eingabe (dh System_user_id) wird es sich entscheiden, ob Fügen Sie eine zusätzliche Bedingung in die Abfrage ein. Ich werde -1 senden, wenn ich Daten für alle Benutzer & für einen bestimmten Benutzer möchte seine system_user_id wird gesendet.

+0

Ich habe die Antwort mit den Ergebnissen aktualisiert und ein Referenz von SQLFiddle, bitte werfen Sie einen Blick. :) Wenn Sie brauchen, kann ich immer noch die frühere Version der Antwort behalten ..;) – bonCodigo

+0

Sie sagten, Sie wollten nicht 2 separate Abfragen in der Frage, aber markieren Sie dann die Antwort mit zwei separaten Abfragen als Antwort. –

Antwort

7

Sie können das folgende Verfahren versuchen.

Aktualisiert Abfrage

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; 

Ergebnisse:

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

einen bestimmten Benutzer zu sehen:


Eine andere Methode

von OP nach neuesten Kommentar Aktualisiert

Abfrage:

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

Ergebnisse: wenn @uid = -1

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

Bitte kommentieren, wenn Sie diese aus versucht haben :)

+0

es gibt Fehler in der Nähe von "DANN" –

+0

@avinashchavan können Sie ohne dann laufen;) – bonCodigo

+0

Danke für die Hilfe !!! –

5

Versuchen:

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

Eine Variation dieses eine Common Table Expression unter Verwendung von (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 für Sie @Diamond Geezer;) – bonCodigo

+0

@bonCodigo Vielen Dank.Im Allgemeinen würde ich IF-Blöcke kodieren (wie in Ihrer Antwort), weil die Absicht klarer ist. Das Ausführen von "IF" -Anweisungen in der WHERE-Klausel kann schwierig zu lesen und zu debuggen sein, wenn zahlreiche optionale Parameter vorhanden sind. –