2012-05-11 9 views
5

Actualmente tengo un procedimiento almacenado, que toma una cadenataquigrafía IF en SQL

@vari as varchar(30) 
if @vari is null 
    SELECT * FROM TABLE 
else 
    SELECT * FROM TABLE WHERE col = @vari 
endif 

¿hay alguna manera de inline la sentencia if, con lo cual no se declaran de 2 seleccione sólo por 1 PARAM?

+0

También puede hacer esto con una declaración de caso, no es tan corto como las respuestas a continuación, pero en algunos casos es mejor . – Purplegoldfish

+0

No cambiaría su código, porque en la mayoría de los casos, sql generará un plan de ejecución mucho mejor que los criterios combinados 'o'. –

Respuesta

15
SELECT * FROM TABLE WHERE (@vari is null or col = @vari) 
+0

Esto funciona, pero mi siguiente pregunta: ¿Por qué? ¿Los corchetes solo evalúan el primer criterio como verdadero, luego se detiene o ...? – Alex

+3

@Alex: Aún evalúa ambos criterios, pero debido al 'o ', cualquiera de los dos puede ser verdadero para la fila que se incluirá en el conjunto de resultados. Si '@vari es nulo', entonces se devolverá cada fila porque la primera parte siempre es verdadera. De lo contrario, las únicas filas devueltas serán aquellas que coincidan con la segunda parte, 'col = @ vari', que aplica el filtro. – mellamokb

+2

Los corchetes están aquí porque tengo la costumbre de poner las RUP entre paréntesis. –

3

Suponiendo col no es nulo, se puede hacer esto:

select * 
from table 
where col = isnull(@vari, col)