2010-09-14 17 views
9

Tengo una consulta SQL que se parametriza por un marco interno muy limitado. La consulta tiene este aspecto:Cláusula SQL In con cero a muchos parámetros

Select * from somewhere 
where name IN (:parameter); 

El código inyectará cero en muchas cadenas en la ubicación especificada por: parámetro. El indicador ": parámetro" solo se puede usar dentro de la cláusula "IN" (por lo tanto, no se puede mover después de la cláusula where para insertar condicionalmente la sección 'name IN').

A veces, el usuario tendrá que establecer el parámetro a:

'perro', 'gato'

Otras veces, el usuario no va a poner ningún valor en el: variable de parámetro. Esto causa un problema ya que la consulta SQL resultante será:

Select * from somewhere 
where name IN(); 

Mi código puede atrapar el caso en que el parámetro está vacío, pero necesito algo que puedo inyectar en el comunicado en el que se garantiza que nunca coincidir con una real cuerda.

¿Hay alguna expresión regular SQL que pueda inyectar que NUNCA coincidiría con ninguna cadena? Algo como%.% O algo ...

Gracias!

+0

Esto podría necesitar más reflexión. Suponiendo que la consulta es su consulta real, básicamente está seleccionando cada registro y cada columna en una tabla de base de datos (presumiblemente grande, si requiere una IN), que puede no ser la mejor estrategia. –

+0

mirándolo desde la otra dirección, ¿por qué no se permite que el usuario envíe la página si ese campo está vacío? –

+0

@Robert: en realidad hay otras partes en la consulta; Lo simplifiqué para los propósitos de stackoverflow; sin embargo, las otras partes no eliminan el problema con el parámetro de nombre – David

Respuesta

16

Usted puede decir:

where name in (null) 

Esto nunca va a coincidir, ya que no hay nada igual a null

+1

Buena respuesta, pero ¿por qué 'null' no coincide con' null' ? – fastcodejava

+2

@fastcodejava: "las comparaciones con Null nunca pueden dar como resultado True o False, pero siempre en un tercer resultado lógico, Desconocido" http://en.wikipedia.org/wiki/Null_(SQL) So 'null = null' results en 'unknown', y la cláusula' where' solo coincide con 'true'. – Andomar

+0

extracto (días de ts.triggered_at) IN (nulo) No funciona para mí en postgresql –

0

No creo que pueda garantizar que nunca coincidirá con una cadena existente. Lo mejor que podría hacer es manejar el caso en el que la declaración no funciona en la base de datos; Sin embargo, sin saber cómo se está ejecutando el guión, no puedo deducir mucho más de allí.

4

null no debe coincidir con nada (ni siquiera null sí mismo.).

0

El nombre no puede ser nulo, por lo que puede hacer una cadena vacía?

Cuestiones relacionadas