2012-04-17 14 views
13

Estoy haciendo una búsqueda, donde los usuarios eligen en el menú desplegable algunas cláusulas. Cuando dejan un cuadro vacío, quiero que la consulta ignore la cláusula. Sé CASE, y lo mejor que pensé es que si paso 0 al parámetro en el procedimiento almacenado, ignora ese parámetro, así.CASO en WHERE, SQL Server

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

así, (algo más) debe ser como ninguna condición, puede ser '> 0' como identificadores de país son de todo> 1, pero no saben cómo utilizar> y = en el mismo caso .

¿Alguna sugerencia?

Respuesta

24

Algunas maneras:

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

O, utilice una instrucción generada dinámicamente y sólo añadir en la condición de País en su caso. Esto debería ser más eficiente en el sentido de que solo ejecuta una consulta con las condiciones que realmente necesita aplicar y puede dar como resultado un mejor plan de ejecución si los índices de soporte están en su lugar. Debería usar SQL parametrizado para evitar la inyección de SQL.

3

(something else) debería haber a.Country

si Country es anulable luego hacer (something else) ser a.Country OR a.Country is NULL

+0

Asume que 'Country' no puede contener nulos. –

+0

@MartinSmith ¡Buena captura! – SliverNinja

1

Prueba esto:

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

Puede simplificar a:

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