2012-11-01 9 views
15

Devo usare if statement inside where clausola in sql.Come utilizzare If Statement in Where Clausola in SQL?

Select * from Customer 
WHERE ([email protected] OR @ISClose is NULL) 
AND  
(C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
AND 
if (@Value=2) 
    begin 
    ([email protected] or @Total is NULL)  
    end 
else if(@Value=3) 
begin 
(I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' or @Total is NULL) 
end 

Nota: Questo non è il code.Everything completo è definito in SP.I appena scritto il codice che è stato necessario per capire il problema.

Grazie in anticipo.

risposta

6

devi usare CASE Statement/Expression

Select * from Customer 
WHERE ([email protected] OR @ISClose is NULL) 
AND  
    (C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
AND 
    CASE @Value 
     WHEN 2 THEN (CASE I.RecurringCharge WHEN @Total or @Total is NULL) 
     WHEN 3 THEN (CASE WHEN I.RecurringCharge like 
           '%'+cast(@Total as varchar(50))+'%' 
        or @Total is NULL) 
    END 
+0

ho provato lo stesso, ma mi ho dato errore "sintassi in prossimità di '=' non corretta" su questa linea quando 1 allora ([email protected] o @Total è NULL) –

+0

Sì, sta dando l'errore nella stessa posizione. Sto già eseguendolo nel mio SP originale. –

+0

incapace di capire cosa non va vicino a "=". Grazie a tutti. –

2

nPer sicuri di quale RDBMS che si sta utilizzando, ma se si tratta di SQL Server si poteva guardare piuttosto utilizzando un CASE statement

Valuta una lista di condizioni e restituisce uno dei molteplici possibili espressioni risultato.

espressione

Il caso ha due formati:

La semplice espressione CASE paragona un'espressione a una serie di semplici espressioni per determinare il risultato.

L'espressione CASE cercata valuta un set di espressioni booleane su determinare il risultato.

Entrambi i formati supportano un argomento ELSE opzionale.

+0

Sto utilizzando SQL Server –

+0

allora piuttosto guardare con un'istruzione CASE –

9
SELECT * 
    FROM Customer 
WHERE ([email protected] OR @ISClose is NULL) 
    AND (C.FirstName like '%'[email protected]+'%' or @ClientName is NULL)  
    AND (isnull(@Value,1) <> 2 
     OR I.RecurringCharge = @Total 
     OR @Total is NULL)  
    AND (isnull(@Value,2) <> 3 
     OR I.RecurringCharge like '%'+cast(@Total as varchar(50))+'%' 
     OR @Total is NULL) 

In sostanza, la sua condizione era

if (@Value=2) 
    TEST FOR => ([email protected] or @Total is NULL)  

ruotato intorno,

AND (isnull(@Value,1) <> 2    -- A 
     OR I.RecurringCharge = @Total -- B 
     OR @Total is NULL)    -- C 

Quando (A) è vero, cioè @Value è non 2, [ A o B o C] diventeranno VERO indipendentemente dai risultati B e C. B e C sono in realtà controllati solo quando @Value = 2, che è l'intenzione originale.

0
select * from xyz where (1=(CASE WHEN @AnnualFeeType = 'All' THEN 1 ELSE 0 END) OR AnnualFeeType = @AnnualFeeType)