Where / And condicional

charl1

Buenas,

A lo largo del tiempo que llevo programando me he encontrado innumerables veces con el caso de construir sentencias SQL y condicionar el WHERE.
Solo quería comentar como solucionais éste tema, quizás no es para darle vueltas, pero a veces la solución dada no me parece "limpia". Para muestra un botón:

(...)

var query = "SELECT nombre, apellidos, sexo FROM personas";
if ( Object.keys(where).length > 0 ) {
  query += " WHERE 1 = 1";
}
for ( var i in where ){
  query += " AND " + where[i].field + " = " + where[i].value;
}

(...)

Como podéis ver en el ejemplo anterior escrito en javascript, para no tener que preguntar cada vez en la adición de "AND campo = valor " he escrito un 1 = 1 que resuelve como true. Ésta solución / recurso la manejáis de alguna otra forma? O propondríais otra fórmula para componer la sentencia?

Como todo, a veces, lo práctico/cómodo vence frente a otras opciones pero me gustaría saber vuestra opinión/experiencia.

Gracias

babri

ahorrate la condición y pon siempre el 1=1 y luego agregas las condiciones que necesites de esta forma si no tienes condiciones siempre tienes el where puesto pero no te salta un error en la consulta. Y si tienes condiciones las pones en el orden que quieras que el where ya le tienes.

1 respuesta
bLero
(...)

var query = "SELECT nombre, apellidos, sexo FROM personas";
var whereSize = Object.keys(where).length;
for (var i = 0; i <  whereSize; i++) {
    query += i == 0 ? " WHERE " : " AND ";
    query += where[i].field + " = " + where[i].value;
}

(...)
1 respuesta
charl1

#2 Es la práctica que hago desde hace años pero nunca me había preguntado como lo hacen los demás.
#3 Ésta es la razón del post, no me parece óptimo preguntar cada vez, y menos en el caso muestras que ya sabes que tienes campos.

Como he dicho quizás es un poco absurdo discutir esto, seré inquieto en ese aspecto, no me gusta que algo funcione si hay otra forma lógica de hacerlo.

Era simplemente por comentar la solución que aplicáis.

De todas formas gracias por dedicar unos minutos a conversar.

MTX_Anubis
"WHERE " + where.map(function(elem) { return elem.toEqParam(); }).join(" AND ");

toEqParam creo que es facil saber lo que hace

2 respuestas
Amazon

¿Para qué le pones el 1 = 1? No se si llego a comprenderlo

1 respuesta
Lecherito

#6 Si pones el 1=1 será siempre true y ya tendrás una condición por lo que luego le puedes agregar el "AND x = ?" sin problemas y no tener que estar mirando cada vez, if x == 0 "WHERE X = ?" else "AND X = ?"

1 respuesta
Amazon

#7 pero... si no lo pones no sería lo mismo que poner where 1 == 1 ?

1 respuesta
Lecherito

#8 A ver, select * from table where 1=1; es lo mismo que select * from table;

La diferencia está si vas a construir la select dinámicamente, con el 1=1 vas a poder añadirle condiciones del tipo

for ( var i in where ){
  query += " AND " + where[i].field + " = " + where[i].value;
}

Si no, tendrás que hacer como una respuesta de aquí

for (var i = 0; i <  whereSize; i++) {
    query += i == 0 ? " WHERE " : " AND ";
    query += where[i].field + " = " + where[i].value;
}

Simplemente te ahorras un if en cada pasada del bucle

1 respuesta
Amazon

#9 pues yo lo haría así xD

O en su defecto como dice #5

Fyn4r

A ver en este caso esta bien que lo mireis de cara a la legibilidad del codigo porque por rendimiento... estamos hablando de 5 ns xd

charl1

Gracias #5.

No conocía este método ( map() ). Le echaré un vistazo de nuevo a la API de JS seguro que hay más métodos que no conozco y ahora con ECMAScript 6.0 en 3 meses estará la documentación en el horno.

Usuarios habituales

  • charl1
  • Fyn4r
  • Amazon
  • Lecherito
  • MTX_Anubis
  • bLero
  • babri