Pregunta

  

Duplicados posibles:
   ¿Por qué una consulta SQL tienen “donde 1 = 1”
   ¿Por qué alguien puede usar donde 1 = 1 Y <> condiciones en una cláusula SQL?

He visto que una gran cantidad de diferentes ejemplos de consulta y va a probablemente todos los motores SQL.

Si hay una consulta que no tiene condiciones definidas personas (y especialmente los marcos ORM) a menudo añaden siempre verdadera condición WHERE 1 = 1 o algo por el estilo.

Así que en lugar de

SELECT id, name FROM users;

que utilizan

SELECT id, name FROM users WHERE 1 = 1;

La única razón posible que podía pensar si va a agregar condiciones dinámicamente usted no tiene que preocuparse por separar el AND inicial, pero todavía muy a menudo está despojado esta condición 1 = 1 si hay una condición real en la consulta.

ejemplo real de CakePHP (generado por el marco):

(no hay condiciones)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` WHERE 1 = 1 
ORDER BY `User`.`id` ASC;

(con condiciones)

SELECT `User`.`id`, `User`.`login`
FROM `users` AS `User` 
WHERE `User`.`login` = 'me@example.com'
LIMIT 1;

¿Hay alguna razón para añadir esa condición adicional?

¿Fue útil?

Solución

Sí, es por lo general debido a que comienza como 'en la que 1 = 0', para obligar a que falle el comando.

Es una forma más ingenua de envolverlo en una transacción y no se comprometía al final, para poner a prueba su consulta. (Este es el método preferido).

Otros consejos

También es una práctica común cuando las personas están construcción de la consulta SQL mediante programación , es simplemente más fácil comenzar con 'donde 1 = 1' y a continuación, añadiendo 'y customer.id =: CustID' dependiendo de si se proporciona un ID de cliente. Así que siempre se puede añadir la siguiente parte de la consulta que empiezan con 'y ...'.

La 1 = 1 es ignorado por siempre todos los RDBMS. No hay ninguna solución de compromiso ejecutar una consulta con donde 1 = 1 .

La construcción dinámica, donde las condiciones, como marcos ORM u otra no muy a menudo, es más fácil añadir el real , donde las condiciones porque se evita la comprobación de anteponiendo un y para el condición actual.

stmt += "WHERE 1=1";
if (v != null) {
   stmt += (" AND col = " + v.ToString());
}

Esto es lo que parece y sin 1 = 1.

var firstCondition = true;
...
if (v != null) {
   if (!firstCondition) {
      stmt += " AND ";
   }
   else {
       stmt += " WHERE ";
       firstCondition = false;
   }
   stmt += "col = " + v.ToString());
}

La gente lo usa porque son inherentemente perezosos a la creación de consultas SQL dinámicas. Si usted comienza con un "where 1 = 1" entonces todas sus cláusulas adicionales sólo comenzar con "and" y usted no tiene que averiguar.

No es que haya nada malo en ser inherentemente vago. He visto listas doblemente enlazadas en una lista de "vacío" se compone de dos ganglios centinela y comenzar a procesar en el first->next hasta last->prev inclusive.

Esta todo el código de manejo especial realmente eliminado para eliminar first y last nodos. En esta configuración, todos nodo era un nodo intermedio, ya que no fueron capaces de eliminar o first last. Dos nodos fueron en vano, pero el código era más simple y (muy ligeramente) más rápido.

El único otro lugar que he visto el constructo "1 = 1" está en BIRT. Los informes suelen utilizar parámetros de posición y se modifican con Javascript para permitir que todos los valores. Por lo que la consulta:

select * from tbl where col = ?

cuando el usuario selecciona "*" para el parámetro que se utiliza para col se modifica como sigue:

select * from tbl where ((col = ?) or (1 = 1))

Esto permite la consulta nueva para ser utilizado sin perder el tiempo con los detalles de los parámetros posicionales. Todavía hay exactamente un parámetro de este tipo. Cualquier DBMS decente (por ejemplo, DB2 / z) que optimizarán consulta para quitar la cláusula básicamente por completo antes de intentar construir un plan de ejecución, así que no hay compensación.

Uso 1 = 1 no es en realidad una muy buena idea ya que esto puede causar escaneos completos de tabla por sí mismo.

Vea este -> T-SQL 1 = 1 impacto en el rendimiento

Como usted ha dicho:

  

si va a agregar condiciones   dinámicamente usted no tiene que preocuparse   sobre despojar a la inicial y   esa es la única razón podría ser, usted tiene razón.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top