¿Por qué usar WHERE 1 o WHERE 1 = 1?


50

Por lo general, si no se requieren condiciones en nuestras declaraciones de consulta, no utilizamos una WHEREcláusula. Pero he visto una WHERE 1cláusula que se usa en muchos lugares, incluso donde otras condiciones no están presentes.

  • ¿Por qué se hace esto?
  • ¿Hay beneficios específicos para el tiempo de ejecución?
  • ¿Permite otras funcionalidades?
  • ¿Está usando algo WHERE 1=1similar a esto?

Respuestas:


45

Básicamente es solo para conveniencia del programador, ya que puede agregar condiciones adicionales AND...después de eso y no tiene ningún impacto en el tiempo de ejecución.

Consulte estos enlaces a Stackoverflow:

Tenga en cuenta que WHERE 1es idéntico a WHERE 1=1; ambos significan, WHERE TRUEpero el primero es rechazado por muchos sistemas de gestión de bases de datos porque en realidad no es booleano.


16

Mi uso principal es que hace que sea más fácil comentar cosas durante el desarrollo de consultas. Lidero con ,'sy and' s:

SELECT
     A
--  ,B
    ,C
    ,D
--  ,E
FROM TABLE
WHERE 1=1
--  and B='This'
    and C='That'
--  and D is not null

También hace que sea más fácil agregar cosas mediante programación hasta el final.

this  = "SELECT * "
this += "FROM TABLE "
this += "WHERE 1=1 "
if user chooses option a then this += "and A is not null "
if user chooses option b then this += "and B is not null "
if user chooses option b then this += "and C is not null "
if user chooses option b then this += "and D is not null "

De lo contrario, tendría que calificar la primera opción ... y hacer que cada opción siguiente verifique las opciones anteriores. ¿Qué sucede si el usuario solo eligió la Opción D en el ejemplo anterior? Tendrías que asegurarte de que if A, B and C aren't chosenluego usar WHEREuse use and. Con =al principio, sólo puede dar una palmada la fase de clasificación para la final de la instrucción.


1
¿Y escribió ese código como 1980 en un lenguaje sin orientación a objetos, porque a alguien se le ocurrió la idea de un generador SQL basado en objetos?
TomTom

Escribo de manera codesimilar al primer bloque en SSMS o herramientas de consulta similares. Investigando conjuntos de datos y obteniendo los resultados correctos antes de ponerlos en herramientas de informes (como Crystal Reports) para usuarios finales. El segundo bloque es lo que he visto hacer a otras personas, ya que mi trabajo no ha sido demasiado sobre el acceso SQL sin formato. He solucionado problemas con códigos similares de otras personas y puedo entender el razonamiento. (El código estaba en VB, C # y PHP).
WernerCD

10

¿Por qué lo hacemos así?

Me viene a la mente la generación dinámica de código escrita por programadores no demasiado competentes.

Genera SELECCIONAR ... DONDE y luego debe tener ALGO ... así que en lugar de agregar el DÓNDE solo cuando sea necesario, agregan una condición no limitante cuando no hay ninguno. Visto eso - responsable de despedir al "especialista".

O el chico simplemente dice DONDE es obligatorio;)

Cualquier otra cosa que no veo.


5

Estaba programando un montón de funciones definidas por el usuario en C ++ / C para PostgreSQL que fueron utilizadas por otras personas en una gran empresa (10K + personas). Mis funciones tienen un whereparámetro opcional : si no se dio ningún valor, la cláusula no se usó. Esto fue documentado explícitamente. Desafortunadamente, nadie usó esta característica y todos solo proporcionaron where 1=1cláusula. Teóricamente, esto parece imprudente, prácticamente todos los optimizadores de consultas descartan este tipo de declaraciones. Y es difícil educar a 10K personas.


3
¿Nunca nadie llamó a tu UDF WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles

Aún así, no puedo encontrar los conceptos detrás del uso de la cláusula Where 1. ¿Necesitas más aclaraciones? Como no obtuve ninguna mejora en el tiempo de ejecución.
ursitesion

Esto tiene poco que hacer con el tiempo de ejecución. Tiene que ver con la cultura de cómo la gente programa. A veces sucede que su código (programado por personal de TI) es utilizado por ingenieros. Estos tipos tienen su propia forma de pensar e invocar su código
arthur

@Twinkles: este es definitivamente un tema interesante. Hay algunos puntos de puntos aquí para tener en cuenta. (i) la base de datos es de solo lectura para el UDF (ii) Mi función une algunos grupos de tablas por un montón de cosas y, para empeorar las cosas, use las funciones de ventanas de almacenamiento de datos. Esto hace que sea difícil dejar cualquier cosa, aunque no imposible, (iii) los UDF están destinados a código de preproducción. Lo que significa que nunca entra en producción: si la función sobrevive al desafío, otro departamento reescribe por completo todo lo que programamos
arthur

44
En realidad es bastante fácil educar a 10,000 personas. Hacer que la aplicación falle cuando lo hacen mal. Inmediatamente dejarán de hacerlo mal.
Jasmine

2

El uso de "where 1 = 1" reduce la complejidad del código necesario en la generación dinámica de cláusulas sql 'where'. De lo contrario, al crear la cláusula 'where', deberá verificar si este es el primer componente para cada componente agregado. Este es un patrón de código simple para reducir la complejidad del código y reducir la complejidad del código, donde sea posible, es casi siempre la decisión correcta.


0

Aquí tienes ... desde el punto de vista de la programación, un uso de 1 = 1 ...ingrese la descripción de la imagen aquí

En una situación como esta, cuando necesito construir una consulta sobre el tiempo de ejecución y puede ser corta o larga, uso 'where 1 = 1 AND'

string criteria =string.Empty;
        if (txtc1.Text != "")
        {
            criteria += "criteria1=" + "'" + txtc1.Text + "' ";
        }
        if (txtc2.Text != "")
        {
            criteria += "OR criteria2=" + "'" + txtc2.Text + "' ";
        }
        if (ddl1.SelectedItem.Text != "")
        {
            criteria += "OR criteria3=" + "'" + ddl1.SelectedItem.Text + "' ";
        } if (ddl2.SelectedItem.Text != "")
        {
            criteria += "OR criteria4=" + "'" + ddl2.SelectedItem.Text + "' ";
        }
        if (ddl3.SelectedItem.Text != "")
        {
            criteria += "OR criteria5=" + "'" + ddl3.SelectedItem.Text + "' ";
        }
        if (ddl4.SelectedItem.Text != "")
        {
            criteria += "OR criteria6=" + "'" + ddl4.SelectedItem.Text + "' ";

        } 
        if (txtc1.Text == "")  
        {
            //criteria = criteria.Substring(2);
            criteria = criteria.Substring(2,criteria.Length-3);
        }
        if (criteria != string.Empty)
        {
            criteria = "where 1=1 AND " + criteria;
            //Response.Write("<script>alert('query constructed by you is : '+'" +criteria+ "');</script>");
            Response.Write(criteria);
        }

Hacer las cosas más fáciles

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.