FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
construir sql dinamico con if
buenos dias a todos tengo un problema con una consulta
este es mi codigo la idea es contruir el sql segun los valores que me manden en los parametros si es cero y no enviaron nada muestra todos los datos sino entonces lo que manden no se si se puede hacer de esta forma gracias por su tiempo Última edición por Casimiro Notevi fecha: 22-10-2015 a las 19:10:49. |
#3
|
||||
|
||||
Exacto
Banthas, bienvenido a clubdelphi, como siempre aconsejamos a los nuevos, no olvides leer nuestra guía de estilo, gracias por tu colaboración Y recuerda poner los tags al código fuente, ejemplo: Gracias |
#4
|
||||
|
||||
El SQL que pones:
1- Esta errado (o incompleto?) 2- Tiene una condicion innecesaria 3- La concatenacion tiene 2 errores 4- Usa una clausula que aunque correcta en sintaxis y comportamiento, no es la que se usa normalmente para comparar contra un solo valor 5- La invocacion del metodo tiene error Si el SQL directo no funciona, menos va a funcionar de forma dinamica. Por otro lado... lo que haces es la idea y por lo tanto la pregunta estrictamente hablando ya te la respondiste vos mismo...
__________________
El malabarista. |
#5
|
||||
|
||||
lo del where 1=1 lo hace para ya "tener" un where. No se si me explico
El problema que se enfrentan es siempre el mismo: Lo que esta entre [] vendria a ser opcional en mi pseudocodigo
Llegados al punto [1] si, ejecuto ese SQL, que pasa, me trae "todo". Obvio, no filtra no hay where Ahora, seria deseable poder hacer esto
Las preguntas del millon: 1. Quien pone el WHERE? si todos los filtros vienen "vacios" entonces si pongo el where la consulta se rompe 2. Quien pone los AND? O los OR? Ese es basicamente el problema que tiene |
#6
|
||||
|
||||
Cierto, SQL es un lenguaje que no esta hecho para programar en el, sino para usarlo de forma "ad-hoc", lo cual es desafortunado, porque el modelo relacional no es tan limitado.
Como hacer eso no es tan dificil, despues de todo. Quien pone el WHERE? Lo mismo de quien pone todo lo demas, manualmente: El SQL no se puede modificar, solo re-crear desde zero una y otra vez. Hacer un codigo que genere el SQL de forma generica puede ser un poco molesto y repetitivo, pero para el caso en particular de este hilo es muy simple: Si hay que filtrar por "op" es solo agregar " WHERE datos.id_operador = ?" y ya.
__________________
El malabarista. |
#7
|
||||
|
||||
Cita:
Buscar('Juan', '', [pgCasado]) el SQL va quedando asi:
Primero pregunta por Apellido, como mande nada, sige Despues pregunta por Nombre, como mande Juan, agrega la sentencia SQL y el parametro Despues hace lo del grupo, como le pedi los Casados, agrega la sentencia, pero me falta un AND en el medio, quien lo pone? Si lo pongo despues de poner "Juan", como me aseguro que despues alguien va a poner algo despues de mi AND? Y si antes de agregar lo del grupo, pongo un AND, como me aseguro que antes habia una condicion? Yo lo termine solucionando a lo bestia, poniendo siempre el AND (u OR) al final, y despues sacandoselo a la ultima linea. A lo bestia si, pero hacer algo generico como decis vos, es bastante molesto En un mundo feliz, habria que implementar alguna clase que opere estilo LINQ, y vaya armando el SQL solita, masomenos asi:
Eso si, despues te regalo los join, las funciones agregadas, los group by, etc |
#8
|
||||
|
||||
Sip, armar SQL con la especificacion completa es practicamente re-implementar un Parser de SQL. Sin embargo, el caso de los where es relativamente simple.
Uno de los ORMS que hice (obj-c) lo muestra: https://bitbucket.org/elmalabarista/...e-view-default Código PHP:
OFF-TOPIC: Ahora estoy en la tarea (por hobby) de hacer un lenguaje de programacion relacional, donde es normal programar estilo LINQ, asi que tengo por ejemplo esto:
La idea es que es redudante hacer "SELECT campo1, ..." en el caso de , y como el lenguaje es relacional, puede hacer composicion de querys (unir q1 & q2 que combina la projeccion y el filtro y luego aplica el orden) Para que quede claro."where data ? this < 4 end" no requiere decirle "select" ni "from" porque es redundante con lo que ya se. Esa es una de las cosas que le falto al SQL para hacerlo mas amigable. Esto no es usando una base de datos relacional, todo es en memoria. Pasarlo a SQL es algo extra que se resuelve mucho mas facil si en vez de hacer concatenacion de STRINGs genero un AST y un mini-interprete de eso para armar los SQL.
__________________
El malabarista. |
#9
|
||||
|
||||
Cita:
En lugar de tratar de ver si hay condiciones antes o después, mejor junta todas y, al final, armas la cláusula, si es que quedó algo. Por ejemplo, Código PHP:
Código PHP:
// Saludos Última edición por roman fecha: 23-10-2015 a las 17:31:33. |
#10
|
|||
|
|||
mil disculpas la verdad es q estoy aprendiendo a programar y me va peor con las consultas en base de datos.... tengo esta consulta en java
esto quiero hacerlo en una consulta sql y la verdad ni siquiera se porq caminos me fui perdon |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
¿Como construir un IDE? | JXJ | Varios | 11 | 12-01-2009 22:59:36 |
Construir Manual SQL | GustavoCruz | SQL | 1 | 30-05-2008 18:36:41 |
Problema al Construir un TRegistry | D-MO | Varios | 3 | 24-08-2006 19:55:33 |
Construir un KEYLOGGER | SPARROW | Varios | 3 | 18-02-2004 14:27:00 |
Error al construir el .EXE | ADN | Varios | 8 | 24-07-2003 12:49:22 |
|