CASE CON WHERE IN

25/07/2007 - 13:20 por Cristian Meneses | Informe spam
Hola amigos del foro.
En esta ocasion les consulto de que forma puedo hacer algo parecido a
esto

SELECT
Campo1,
Campo2
FROM MiTabla
WHERE
Campo3 = 0 AND
Campo1 = CASE WHEN @MiVariable = '0' THEN Campo1 ELSE Campo1 IN
(SELECT * FROM TablaExtra) END

Saludos


Cristian Meneses

Preguntas similare

Leer las respuestas

#6 principiante
25/07/2007 - 22:50 | Informe spam
Ciertamente equivaldría a un OR la segunda condición y debe ser más rapido
así


José TH.


"Ricardo Passians" escribió en el mensaje
news:%23MsI$

Bueno, si te entendí, mejor debes usar un OR, y olvida el "CASE...WHEN".

Ej.
WHERE
Anulado = 0 AND (@Terminales = '0' OR IDTerminal IN (SELECT IDTerminal
FROM #AUXTerminales) )


Saludos

Ricardo Passians


"Cristian Meneses" escribió en el mensaje
news:
Hola Ricardo
La idea es ver si se logra hacer todo en una sola sentencia.
En cuanto al concepto de la condicion, la idea es pasar como parametro
un valor del tipo lista con identificadores primarios. En caso que sea
0 se haria un select de todo, caso contrario se buscaria aquellos que
coincidan con la lista pasada por parametro. Ya uso un funcion que me
convierte esta lista en una tabla temporal de manera tal que la
condicion queda algo asi

WHERE
ANULADO = 0 AND
IDTERMINAL IN (SELECT * FROM #AUXTerminales)

Pero dado lo extenso de mi procedimiento preferiria una unica
sentencia como si fuera

WHERE
Anulado = 0 AND
IDTerminal = CASE WHEN @Terminales = '0' THEN IDTerminal ELSE
IDTerminal IN (SELECT * FROM #AUXTerminales) END

pero asi no funciona.
Gracias


Cristian Meneses





"Cristian Meneses" escribió en el mensaje
news:
Hola Ricardo
La idea es ver si se logra hacer todo en una sola sentencia.
En cuanto al concepto de la condicion, la idea es pasar como parametro
un valor del tipo lista con identificadores primarios. En caso que sea
0 se haria un select de todo, caso contrario se buscaria aquellos que
coincidan con la lista pasada por parametro. Ya uso un funcion que me
convierte esta lista en una tabla temporal de manera tal que la
condicion queda algo asi

WHERE
ANULADO = 0 AND
IDTERMINAL IN (SELECT * FROM #AUXTerminales)

Pero dado lo extenso de mi procedimiento preferiria una unica
sentencia como si fuera

WHERE
Anulado = 0 AND
IDTerminal = CASE WHEN @Terminales = '0' THEN IDTerminal ELSE
IDTerminal IN (SELECT * FROM #AUXTerminales) END

pero asi no funciona.
Gracias


Cristian Meneses





Respuesta Responder a este mensaje
#7 principiante
25/07/2007 - 22:57 | Informe spam

WHERE Campo3=0
AND CASE WHEN @MiVariable='0' THEN 1
WHEN Campo1 IN (SELECT Campo1 FROM TableExtra)
THEN 1
ELSE 0 END=1




Como dije en mi otro mensaje, la segunda condición equivaldría a un OR:

WHERE Campo3=0
AND (@MiVariable='0' OR Campo1 IN (SELECT Campo1 FROM TableExtra) )


Saludos

Ricardo Passians
Respuesta Responder a este mensaje
#8 principiante
25/07/2007 - 22:58 | Informe spam
Saludos

Ricardo Passians




Perdón Ricardo, hice un Copy Paste de tu mensaje y dejé la firma. :)


José TH
Respuesta Responder a este mensaje
#9 principiante
25/07/2007 - 23:03 | Informe spam
La idea es ver si se logra hacer todo en una sola sentencia.




Lo mejor sea tal vez hacerlo con un IF ELSe... para rendimiento como te han
dicho los otros.
Por tanto puedes ver si hay tanta necesidad de hacerlo en una sola
sentencia, a menos que el optimizador internamente te la convierta a un IF
ELSE pero de eso no estoy muy seguro.

José TH
Respuesta Responder a este mensaje
#10 Ricardo Passians
26/07/2007 - 00:10 | Informe spam




Perdón Ricardo, hice un Copy Paste de tu mensaje y dejé la firma. :)







No hay problema... luego me pagas derechos de autor :-)

Saludos

Ricardo Passians
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida