2012-04-17 21 views
13

Sto facendo qualche ricerca, dove gli utenti stanno scegliendo in dropdown alcune clausole. Quando lasciano una casella vuota, voglio che la query ignori la clausola. Conosco CASE, e la cosa migliore che ho pensato è che se passo 0 a parametro nella stored procedure, ignora quel parametro, come questo.CASE in WHERE, SQL Server

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE (something else) END) 

così, (altro) dovrebbe essere come nessuna condizione, può essere '> 0' come ID campagna provengono da> 1, ma non so come usare> = e nel medesimo caso .

Qualche suggerimento?

risposta

24

A pochi modi:

-- Do the comparison, OR'd with a check on the @Country=0 case 
WHERE (a.Country = @Country OR @Country = 0) 

-- compare the Country field to itself 
WHERE a.Country = CASE WHEN @Country > 0 THEN @Country ELSE a.Country END 

Oppure, utilizzare un'istruzione generati dinamicamente e aggiungere solo nella condizione Paese, se del caso. Questo dovrebbe essere il più efficiente nel senso che si esegue una query solo con le condizioni che devono effettivamente essere applicate e che si può ottenere un piano di esecuzione migliore se gli indici di supporto sono disponibili. È necessario utilizzare l'SQL parametrizzato per evitare l'iniezione SQL.

3

(something else) dovrebbe essere a.Country

se Country è annullabile poi fare (something else) essere a.Country OR a.Country is NULL

+0

Presuppone "Paese" non è annullabile. –

+0

@MartinSmith Buona cattura! – SliverNinja

1
.. ELSE a.Country ... 

suppongo

1

Prova questo:

WHERE a.Country = (CASE WHEN @Country > 0 THEN @Country ELSE a.Country END) 
5

Puoi semplificare a:

WHERE a.Country = COALESCE(NULLIF(@Country,0), a.Country); 
Problemi correlati