FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Se puede Usar CASE WHEN, IF() O IIF() DENTRO DE LA CLAUSULA WHERE
Muy buenas:
tengo un procedimiento almadenado en firebird que me retorna un cojunto de datos, el procedimiento ya me funciona pero ahora necesito hacer que dicho procedimento "filtre" de acuerdo a un parametro que envio a ella. Mi pregunta se puede hacer algo así en la sentencia WHERE
talvez sea un disparate pero bueno, la idea es: Si el parámetro cod_cliente es -1 (Que devuelva todos los registros de todos los clientes) Si el parámetra cod_cliente es >1 (que devuelva todos los registros de ese cliente) Mil gracias de antemano
__________________
Saludos desde Sucre - Bolivia "Si te lo puedes imaginar lo puedes resolver" Pyriel |
#2
|
||||
|
||||
Hola
Cita:
Ejemplo de uso:
Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#3
|
|||
|
|||
Mil gracias por la respueta
Es justamente lo que quiero evitar hacer, pues haría que el código de la consulta dentro del
se repita dos veces y como es una consulta larga y compleja me parece "desperdicio de código" si a eso le sumas que en realidad son dos campos por los cuales debo filtrar la consulta eso implica que el código se repetiría 4 veces. Por eso estaba interesado en saber si es posible ejecutar partes de una sentencia WHERE en forma condicional, algo así como hacemos con código en Delphi, remplazar, agregar o eliminar una fila de la consulta antes de ejecutarla. Espero que sea posible, si no la solución que me sugieres sería la única por el momento. A seguir trabajando..... Y mil gracias (excelente tu ayuda)
__________________
Saludos desde Sucre - Bolivia "Si te lo puedes imaginar lo puedes resolver" Pyriel Última edición por ronalg fecha: 11-11-2016 a las 13:08:38. |
#4
|
||||
|
||||
Hola.
Sinceramente no veo manera de hacer lo que consultas en el primer mensaje pero, dependiendo del formato de la sentencia SQL original, se podría optimizar un poco el código anterior del SP para evitar la repetición: Eso siempre que la sentencia SQL original no sea muy compleja y lo permita... Saludos
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#6
|
||||
|
||||
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#7
|
|||
|
|||
Son unos genios
Sigo intentando procesar que hace pero, funciona. muchas gracias
__________________
Saludos desde Sucre - Bolivia "Si te lo puedes imaginar lo puedes resolver" Pyriel Última edición por ronalg fecha: 11-11-2016 a las 19:47:15. |
#8
|
||||
|
||||
Lo que hace es procesar de forma ineficiente la consulta, aunque logicamente correcto.
Ten en cuenta que SQL es un deficiente lenguaje que no se puede "recomponer" de forma arbitraria. Para eso estan los procedimientos almacenados.
__________________
El malabarista. |
#9
|
|||
|
|||
Disculpa la neofita pregunta ¿Por qué ineficiente?
Cita:
Cita:
mamcx podrias darnos un luz sobre el asunto?
__________________
Saludos desde Sucre - Bolivia "Si te lo puedes imaginar lo puedes resolver" Pyriel |
#10
|
||||
|
||||
el where que te entiendo es el anterior, no hace falta case ni nada más, coloco esos dos entre parentesis para que se solucione como una sola condición pensando que necesites luego agregar un and o algo más. Respecto a un case en un where sería así:
Osea, cuando el parametro :cod_cliente sea mayor a -1 manda el valor del campo llamado ref_cliente si no, mande un -1
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H" |
#11
|
||||
|
||||
Debes hacer lo mismo cuando no entiendes el codigo, ejecutarlo paso a paso. Esta es la parte clave
Cuando el motor lo recibe, lo sustituye por los valores. Que pasa si lo haces?
Lo cual se ejecuta POR CADA FILA DE LA TABLA. Es probable que FB pueda optimizar este caso (no estoy seguro: Hay que chequear el plan de ejecucion) El problema es con el otro caso:
Estas anulando la posibilidad de usar el indice, porque tiene que chequear fila a fila. Ves?
__________________
El malabarista. |
#12
|
|||
|
|||
Muy agradecido mamcx
Ahora entiendo lo que hace el código y tienes razón, pero como dije, esa línea es una de varias en el where de mi consulta creo que vale la pena usarla pues me ahora mucho código, además de que es para el reporte de ventas por DIA o entre fechas o sea que primero recupero los códigos entre un rango de fechas; probare como sube o baja el rendimiento con muchos registros para decidir si usarlo así o en definitiva hacer mas largo el procedimiento almacenado. RONPABLO muchas gracias lo probé y sorprendentemente (para mi) FUNCIONA tienes razón no era necesario pero estoy seguro que lo aprendido me será útil en otras ocasiones.
__________________
Saludos desde Sucre - Bolivia "Si te lo puedes imaginar lo puedes resolver" Pyriel |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
If o Case en cláusula WHERE | Jere_84 | SQL | 6 | 26-03-2013 22:15:16 |
Como usar el CASE en 2 SubConsultas ???? | AGAG4 | Firebird e Interbase | 13 | 16-10-2006 23:08:45 |
Problemas al usar case | David | OOP | 5 | 28-07-2006 17:14:19 |
Case Anidados ¿Se puede? | jam888 | MS SQL Server | 5 | 31-01-2006 14:39:38 |
Incluir un IF dentro de un CASE | Javi2 | SQL | 1 | 21-04-2005 11:59:31 |
|