2012-11-01 16 views
10

Ho una domanda del tipo:Sql Server unione con Se la condizione

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
IF @tmpValue > 0 
SELECT * FROM Animal WHERE.Active = 0 

Quando uso come questo si sta dando errore a causa di se la condizione. Devo usare UNION a causa della nostra struttura.

Come posso usarlo con se condizione?

Grazie,
John

risposta

14

Spostare la condizione @tmpValue > 0 alla clausola WHERE in questo modo:

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE @tmpValue > 0 AND Active = 0 
3

puoi aggiungere la tua condizione alla query come questa. la parte parte del sindacato sarà semplicemente non dà risultati se la sua condizione di prova è falsa:

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal WHERE.Active = 0 and @tmpValue > 0 
3

modo migliore per mettere condizioni in Query è istruzione CASE. puoi inserire qualsiasi numero di condizioni nella query. L'istruzione CASE viene utilizzata per inserire filtri condizionali in Query.

Per EX.

DECLARE @tmpValue 
SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 
UNION 
SELECT * FROM Animal 
WHERE 
1 = CASE WHEN @tmpValue = 0 THEN 0 ELSE Active = 1 END 

la situazione non è complessa ma per condizioni più complesse è possibile utilizzare l'istruzione CASE annidata in Query.

0

Ecco un modo per semplificare il codice eliminando del tutto l'UNION. Preferisco sempre una soluzione più semplice, ove possibile. Ciò funzionerà anche meglio se la selezione esegue una scansione della tabella, poiché verrà eseguita una sola scansione anziché (potenzialmente) due volte.

DECLARE @tmpValue 

SET @tmpValue = 0 -- it will be change 

SELECT * FROM Animal WHERE AniActive = 1 OR @tmpValue > 0