usar - Lista de parámetros de la cláusula Empty IN en MySQL
variable en consulta mysql php (6)
¿Qué sucede cuando haces una consulta SQL donde la cláusula IN
está vacía?
Por ejemplo:
SELECT user WHERE id IN ();
¿MySQL manejará esto como se espera (es decir, siempre es falso) y, de no ser así, cómo puede manejar mi aplicación este caso al construir la cláusula IN
forma dinámica?
Esto me da 0 resultados también:
SELECT id FROM User
WHERE id IN (NULL);
Probado en MYSQL 5.6
La aproximación más aproximada de su consulta con sintaxis válida es:
SELECT user FROM tbl1 WHERE id IN (SELECT id FROM tbl1 WHERE FALSE);
que devolverá incondicionalmente un conjunto de resultados vacío. La subconsulta en el corchete siempre devuelve un conjunto vacío, y como mencioné anteriormente, no se puede encontrar ningún valor en un conjunto vacío, ya que un conjunto vacío no contiene ningún valor.
Si tengo una aplicación en la que estoy compilando la lista IN
dinámica, y podría terminar vacía, lo que a veces hago es inicializar la lista con un valor imposible y agregar a eso. Por ejemplo, si se trata de una lista de nombres de usuario, comenzaré con una cadena vacía, ya que ese no es un posible nombre de usuario. Si es un ID de auto_increment, usaré -1 porque los valores reales son siempre positivos.
Si esto no es factible porque no hay valores imposibles, debe usar un condicional para decidir si se incluye AND column IN ($values)
expresión en la cláusula WHERE
.
Si usa AUTO_INCREMENT para id (1,2,3, ...) y si la matriz está vacía, puede agregar un elemento [0]. Así será
if (empty($arr)) {
$arr[] = 0;
}
SELECT user WHERE id IN (0);
Y no habrá ningún error de análisis mysql. Este caso es muy útil en las subconsultas, cuando su consulta principal no depende de los resultados de la subconsulta.
Mejor manera: no llame a la consulta si la matriz está vacía.
$data = null;
if (!empty($arr)) {
$data = ... call query
}
Supongo que aún necesita ejecutar la consulta cuando su IN
esté vacía; por ejemplo con LEFT JOIN ... ON ... AND IN ()
.
Como ya está construyendo dinámicamente el IN
en la capa de aplicación, manejaría el caso vacío allí.
Aquí hay un ejemplo básico en PHP
$condition = ''FALSE'' // Could feasibly want TRUE under different circumstances
if($values){
$condition = *dynamically_generate_IN_condition_from_values*
}
$sql = ''SELECT * FROM `user` WHERE ''.$condition;
Si no necesita ejecutar la consulta con un IN
vacío, entonces no; ¡ahórrate un viaje a la base de datos!
NB En caso de que no lo esté ya, construiría / usaría una función que da la vuelta y enlaza los parámetros de IN
correctamente, en lugar de solo concatenarlos en bruto en el SQL. Esto le dará cierta protección contra la inyección de SQL si se usa en datos sin formato.
Use una declaración siempre falsa
Antes de crear el SQL, verifique el tamaño de la matriz. Si el tamaño es 0, genere la instrucción where como 1 = 2
, como en:
SELECT * FROM USERS WHERE name in ()
se convierte
SELECT * FROM USERS WHERE 1 = 2
Para "no en" en una matriz vacía, genera una declaración siempre verdadera como en:
SELECT * FROM USERS WHERE name not in ()
se convierte
SELECT * FROM USERS WHERE 1 = 1
Esto debería funcionar para consultas más complejas como:
SELECT * FROM USERS WHERE (name in () OR name = ''Alice'')
se convierte
SELECT * FROM USERS WHERE (1 = 2 OR name = ''Alice'')