2012-12-13 23 views
5

Di seguito è riportato il mio dove clausola della query quando voglio i dati per un determinato utentese la condizione in cui la clausola di query SQL

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

e sotto è la clausola in cui quando ho voglia di tirare i dati per tutti gli utenti :

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

Poiché io non voglio 2 domande separate, c'è un modo per aggiungere una condizione in cui la clausola in modo che io possa utilizzare una singola query e seconda dell'ingresso (cioè System_user_id) si deciderà se aggiungi condtion in più nella query. Invierò -1 quando desidero i dati per tutti gli utenti & per un utente specifico verrà inviato il proprio system_user_id.

+0

Ho aggiornato la risposta con i risultati e un riferimento da SQLFiddle, si prega di dare un'occhiata. :) Se hai bisogno, posso comunque mantenere la versione precedente della risposta.) – bonCodigo

+0

Hai detto che non volevi 2 query separate nella domanda, ma segna la risposta con due query separate come risposta. –

risposta

7

Puoi provare la seguente procedura.

Query Aggiornato

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; 

Risultati:

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

Per vedere un utente specifico:


UN ALTRO METODO

aggiornato dopo ultimo commento da OP

Query:

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

Risultati: quando @uid = -1

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

Si prega di commentare se avete provato questo fuori :)

+0

dà errore vicino "THEN" –

+0

@avinashchavan puoi eseguire senza allora;) – bonCodigo

+0

Grazie per l'aiuto !!! –

5

Prova:

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

Una variante di questo usando un'espressione di tabella comune (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 per te @Diamond Geezer;) – bonCodigo

+0

@bonCodigo Grazie.In genere scriverei codice utilizzando i blocchi IF (come nella risposta) perché l'intenzione è più chiara. L'esecuzione di istruzioni "IF" nella clausola WHERE può diventare difficile da leggere e eseguire il debug se esistono numerosi parametri facoltativi. –

Problemi correlati