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 |
Hola
Cita:
Ejemplo de uso:
Saludos :) |
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) |
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 :) |
Te propongo lo siguiente
Saludos cordiales |
Cita:
Saludos :) |
Son unos genios
:eek:
Sigo intentando procesar que hace pero, funciona. muchas gracias |
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. |
Disculpa la neofita pregunta ¿Por qué ineficiente?
Cita:
Cita:
mamcx podrias darnos un luz sobre el asunto? |
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 |
Cita:
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? |
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) :eek: FUNCIONA ^\||/ tienes razón no era necesario pero estoy seguro que lo aprendido me será útil en otras ocasiones. |
La franja horaria es GMT +2. Ahora son las 04:50:14. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi