¿Por qué alguien usaría WHERE 1=1 AND <conditions>
una cláusula SQL? (SQL obtenido a través de cadenas concatenadas, o definición de vista)
He visto en alguna parte que esto se usaría para proteger contra la inyección de SQL, pero parece muy extraño.
Si hay inyección WHERE 1 = 1 AND injected OR 1=1
tendría el mismo resultado que injected OR 1=1
.
Edición posterior: ¿Qué pasa con el uso en una definición de vista?
Gracias por sus respuestas.
Aún así, no entiendo por qué alguien usaría esta construcción para definir una vista, o la usaría dentro de un procedimiento almacenado.
Toma esto por ejemplo:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Bogdan Maxim
fuente
fuente
Respuestas:
Si la lista de condiciones no se conoce en el momento de la compilación y, en cambio, se crea en el tiempo de ejecución, no tiene que preocuparse por si tiene una o más de una condición. Puedes generarlos a todos como:
y concatenarlos a todos juntos. Con el
1=1
al principio, la inicialand
tiene algo con qué asociarse.Nunca he visto esto usado para ningún tipo de protección de inyección, ya que usted dice que no parece que ayude mucho. Lo he visto usado como una conveniencia de implementación. El motor de consulta SQL terminará ignorando el,
1=1
por lo que no debería tener ningún impacto en el rendimiento.fuente
where 1=1
(Oracle) owhere true
(Postgres), tendré que verificar para cada condición si es la primera. No tiene sentido hacerlo, y solo agrega más código repetitivo.Simplemente agregue un código de ejemplo a la respuesta de Greg:
fuente
Lo he visto usar cuando el número de condiciones puede ser variable.
Puede concatenar condiciones utilizando una cadena "AND". Luego, en lugar de contar el número de condiciones que está pasando, coloca un "WHERE 1 = 1" al final de su declaración SQL de valores y aplica las condiciones concatenadas.
Básicamente, le ahorra tener que hacer una prueba de condiciones y luego agregar una cadena "WHERE" antes de ellos.
fuente
Parece una forma perezosa de saber siempre que su cláusula WHERE ya está definida y le permite seguir agregando condiciones sin tener que verificar si es la primera.
fuente
where 1=1
(Oracle) owhere true
(Postgres), tendré que verificar para cada condición si es la primera. No tiene sentido hacerlo, y solo agrega más código repetitivo.WHERE 1=1
genera el trabajo adicional de mantener el mismo código en varios lugares y leerlo en todo el SQL generado. ¡Soy más vago que tú, creo!Indirectamente relevante: cuando se usa 1 = 2:
esto creará una nueva tabla con el mismo esquema que la tabla anterior. (Muy útil si desea cargar algunos datos para comparar)
fuente
La expresión 1 = 1 se usa comúnmente en el código sql generado. Esta expresión puede simplificar el código de generación de SQL reduciendo el número de declaraciones condicionales.
fuente
En realidad, he visto este tipo de cosas usadas en los informes de BIRT. La consulta pasada al tiempo de ejecución BIRT tiene la forma:
y el '?' se reemplaza en tiempo de ejecución por un valor de parámetro real seleccionado de un cuadro desplegable. Las opciones en el menú desplegable están dadas por:
para que obtenga todos los valores posibles más "
*
". Si el usuario selecciona "*
" en el cuadro desplegable (lo que significa que todos los valores de a deben seleccionarse), la consulta debe modificarse (mediante Javascript) antes de ejecutarse.Desde el "?" es un parámetro posicional y DEBE permanecer allí para que otras cosas funcionen, el Javascript modifica la consulta para que sea:
Básicamente, eso elimina el efecto de la cláusula where y deja el parámetro posicional en su lugar.
También he visto el caso AND utilizado por los codificadores perezosos al crear dinámicamente una consulta SQL.
Supongamos que tiene que crear dinámicamente una consulta que comienza con
select * from t
y comprueba:algunas personas agregarían el primero con un DÓNDE y los siguientes con un Y así:
Los programadores perezosos (y eso no es necesariamente un mal rasgo) no distinguirían entre las condiciones agregadas, comenzarían
select * from t where 1=1
y simplemente agregarían cláusulas AND después de eso.fuente
where 1=1
(Oracle) owhere true
(Postgres), tendré que verificar para cada condición si es la primera. No tiene sentido hacerlo, y solo agrega más código repetitivo.Encontré útil este patrón cuando estoy probando o haciendo doble comprobación en la base de datos, por lo que puedo comentar muy rápidamente otras condiciones:
se convierte en:
fuente
donde 1 = 0, esto se hace para verificar si la tabla existe. No sé por qué se usa 1 = 1.
fuente
Si bien puedo ver que 1 = 1 sería útil para el SQL generado, una técnica que uso en PHP es crear una matriz de cláusulas y luego hacer
evitando así el problema de tener un AND inicial o final. ¡Obviamente, esto solo es útil si sabe que tendrá al menos una cláusula!
fuente
Aquí hay un ejemplo estrechamente relacionado: el uso de una
MERGE
instrucción SQL para actualizar la tabla de destino utilizando todos los valores de la tabla de origen donde no hay un atributo común en el que unirse, por ejemplofuente
He visto los marcos de andar por casa hacen cosas como esta ( rubor ), ya que esto permite que las prácticas de análisis perezosos que se aplicarán tanto a los
WHERE
yAND
palabras clave de SQL.Por ejemplo (estoy usando C # como ejemplo aquí), considere el análisis condicional de los siguientes predicados en una consulta SQL
string builder
:El "beneficio" de
WHERE 1 = 1
significa que no se necesita un código especial:AND
se requiere el primero . Como ya tenemos al menos un predicado con el1 = 1
, significaAND
que siempre está bien.WHERE
debe descartar. Pero, de nuevo, podemos ser perezosos, porque de nuevo estamos garantizados de al menos un predicado.Obviamente, esta es una mala idea y recomendaría usar un marco de acceso a datos establecido u ORM para analizar predicados opcionales y condicionales de esta manera.
fuente
WHERE 1=1
es un indicador justo de que ese NO es el caso, que la base del código está llena de trozos de cadenasWHERE 1=1
, lo que me indicaría un problema de arquitectura de la aplicación, ¡y supongo que no es el único!Si usted vino aquí en busca de
WHERE 1
, nota queWHERE 1
yWHERE 1=1
son idénticos.WHERE 1
se usa raramente porque algunos sistemas de bases de datos lo rechazan considerando queWHERE 1
realmente no es booleano.fuente
Esto es útil en un caso en el que tiene que usar una consulta dinámica en la que en la cláusula where debe agregar algunas opciones de filtro. Como si incluye opciones 0 para el estado está inactivo, 1 para activo. Según las opciones, solo hay dos opciones disponibles (0 y 1), pero si desea mostrar Todos los registros, es útil incluir en donde cierre 1 = 1. Vea a continuación la muestra:
fuente
Después de revisar todas las respuestas, decidí realizar un experimento como
Luego verifiqué con otros números
ect Después de haber realizado todas las comprobaciones, la consulta ejecutar ciudad es la misma. incluso sin la cláusula where. No soy fanático de la sintaxis
fuente
Por lo general, hago esto cuando estoy creando SQL dinámico para un informe que tiene muchos valores desplegables que un usuario puede seleccionar. Dado que el usuario puede o no seleccionar los valores de cada menú desplegable, terminamos teniendo dificultades para descubrir qué condición era la primera cláusula where. Así que rellenamos la consulta con un
where 1=1
al final y agregamos todas las cláusulas where después de eso.Algo como
Luego construiríamos la cláusula where como esta y la pasaríamos como un valor de parámetro
Como la selección de la cláusula where es desconocida para nosotros en tiempo de ejecución, esto nos ayuda mucho a encontrar si se incluye un
'AND' or 'WHERE'.
fuente
El uso de un predicado como
1=1
es una pista normal que a veces se usa para forzar al plan de acceso a usar o no un escaneo de índice. La razón por la que se usa esto es cuando está utilizando una consulta unida con múltiples anidamientos con muchos predicados en la cláusula where, donde a veces incluso el uso de todos los índices hace que el plan de acceso lea cada tabla, un análisis completo de la tabla. Este es solo uno de los muchos consejos utilizados por los DBA para engañar a un dbms para que use una ruta más eficiente. Simplemente no tires uno; necesita un dba para analizar la consulta, ya que no siempre funciona.fuente
Aquí hay un caso de uso ... sin embargo, no estoy demasiado preocupado por los tecnicismos de por qué debería usar o no 1 = 1. Estoy escribiendo una función, usando pyodbc para recuperar algunos datos de SQL Server. Estaba buscando una manera de forzar un relleno después de la
where
palabra clave en mi código. Esta fue una gran sugerencia de hecho:La razón es porque no pude implementar la palabra clave 'where' juntos dentro de la variable de cláusula _where. Entonces, creo que usar cualquier condición ficticia que se evalúe como verdadera funcionaría como relleno.
fuente
La primera vez que encontré esto fue con ADO y asp clásico, la respuesta que obtuve fue: rendimiento. si haces una escalera
Select * from tablename
y pásalo como un comando / texto sql obtendrás un notable aumento de rendimiento con el
Where 1=1
agregado, era una diferencia visible. algo relacionado con los encabezados de las tablas que se devuelven tan pronto como se cumple la primera condición, o alguna otra locura, de todos modos, aceleró las cosas.
fuente