Warum WHERE 1 oder WHERE 1 = 1 verwenden?


50

Wenn in unseren Abfrageanweisungen keine Bedingungen erforderlich sind, wird normalerweise keine WHEREKlausel verwendet. Aber ich habe eine WHERE 1Klausel gesehen, die an vielen Orten verwendet wird, auch wenn andere Bedingungen nicht vorliegen.

  • Warum wird das gemacht?
  • Gibt es bestimmte Vorteile für die Ausführungszeit?
  • Ermöglicht es andere Funktionalitäten?
  • Ist die Verwendung WHERE 1=1ähnlich?

Antworten:


43

Grundsätzlich dient dies nur dem Komfort des Programmierers, da Sie anschließend einfach zusätzliche Bedingungen hinzufügen können, ohne AND...dass sich dies auf die Ausführungszeit auswirkt.

Schauen Sie sich diese Links zu Stackoverflow an:

Beachten Sie, dass dies WHERE 1identisch ist mit WHERE 1=1; beides bedeutet, WHERE TRUEaber das erstere wird von vielen Datenbankverwaltungssystemen als nicht wirklich boolesch abgelehnt.


16

Meine Hauptanwendung besteht darin, dass es einfacher ist, während der Entwicklung von Abfragen Kommentare abzugeben. Ich führe mit ,und and:

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

Erleichtert außerdem das programmgesteuerte Beenden von Aufgaben.

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 "

Andernfalls müssten Sie die erste Option qualifizieren ... und jede der folgenden Optionen die vorherigen Optionen prüfen lassen. Was ist, wenn der Benutzer im vorherigen Beispiel nur Option D gewählt hat? Sie müssten sicherstellen, dass Sie if A, B and C aren't chosendann WHEREelse use verwenden and. Mit =am Anfang können Sie die Qualifier einfach an das Ende der Anweisung setzen.


1
Und Sie haben diesen Code wie 1980 in einer Sprache ohne Objektorientierung geschrieben, bevor jemand auf die Idee eines objektbasierten SQL-Generators kam?
TomTom

Ich schreibe codeähnlich wie der erste Block in SSMS oder ähnlichen Abfragetools. Durchsuchen von Datensätzen und Erhalten der richtigen Ergebnisse, bevor diese in Berichterstellungstools (wie Crystal Reports) für Endbenutzer eingegeben werden. Der zweite Block ist das, was ich bei anderen gesehen habe, da es bei meinem Job nicht so sehr um Raw-SQL-Zugriff ging. Ich habe Probleme mit dem ähnlichen Code anderer Leute und kann die Argumentation verstehen. (Code war in VB, C # und PHP).
WernerCD

10

Warum machen wir das?

Mir fällt die dynamische Codegenerierung ein, die von nicht allzu kompetenten Programmierern geschrieben wurde.

Generiert SELECT .... WHERE und dann müssen Sie ETWAS haben. Anstatt das WHERE nur bei Bedarf hinzuzufügen, fügen sie eine nicht einschränkende Bedingung hinzu, wenn keine vorhanden ist. Gesehen - verantwortlich für die Entlassung des "Spezialisten".

Oder der Typ macht einfach Sachen WO ist Pflicht;)

Alles andere sehe ich nicht.


5

Ich programmierte eine Reihe von benutzerdefinierten Funktionen in C ++ / C für PostgreSQL, die von anderen Mitarbeitern in einem großen Unternehmen (über 10.000 Mitarbeiter) verwendet wurden. Meine Funktionen haben einen optionalen whereParameter: Wenn kein Wert angegeben wurde, wurde die Klausel nicht verwendet. Dies wurde ausdrücklich dokumentiert. Leider hat niemand diese Funktion verwendet und jeder hat nur where 1=1Klausel geliefert. Theoretisch scheint dies unklug, praktisch alle Abfrageoptimierer schließen diese Art von Anweisungen aus. Und es ist schwierig, 10K-Leute auszubilden.


3
Hat noch niemand Ihre UDF angerufen WHERE 1=1; DROP TABLE CUSTOMERS?
Twinkles

Ich bin jedoch nicht in der Lage, die Konzepte hinter der Where 1-Klausel zu finden. Benötigen Sie weitere Erläuterungen? Da habe ich keine Verbesserung in der Ausführungszeit bekommen.
Ursitesion

Dies hat wenig mit der Ausführungszeit zu tun. Es hat mit der Kultur zu tun, wie Menschen programmieren. Es kommt manchmal vor, dass Ihr Code (von IT-Mitarbeitern programmiert) von Ingenieuren verwendet wird. Diese Jungs haben ihre eigene Art und Weise zu denken und rufen Sie Ihren Code
arthur

@ Twinkles: das ist definitiv ein interessantes Thema. Hier sind einige Punkte zu beachten. (i) Die Datenbank ist schreibgeschützt für die UDF. (ii) Meine Funktion verbindet einige Tabellengruppen durch eine Reihe von Dingen und um die Situation zu verschlimmern, verwenden Sie Data Warehousing-Fensterfunktionen. Dies macht es schwierig, irgendetwas fallen zu lassen, obwohl dies nicht unmöglich ist. (Iii) Die UDFs sind für Code vor der Produktion gedacht. Was bedeutet , dass es wird nie in die Produktion: wenn die Funktion der Herausforderung überlebt völlig andere Abteilung alles umschreibt wir programmiert
arthur

4
Tatsächlich ist es ziemlich einfach, 10.000 Menschen auszubilden. Lassen Sie die Anwendung fehlschlagen, wenn sie es falsch macht. Sie werden sofort aufhören, es falsch zu machen.
Jasmine

2

Die Verwendung von "where 1 = 1" reduziert die Komplexität des Codes, der für die dynamische Generierung von SQL-WHERE-Klauseln erforderlich ist. Andernfalls müssten Sie beim Erstellen der 'where'-Klausel prüfen, ob dies die erste Komponente für jede hinzugefügte Komponente ist. Dies ist ein einfaches Codemuster, um die Codekomplexität zu verringern. Wenn möglich, ist die Reduzierung der Codekomplexität fast immer die richtige Entscheidung.


0

Hier gehts ... aus Programmiersicht eine Verwendung von 1 = 1 ...Bildbeschreibung hier eingeben

In einer Situation wie dieser, in der ich eine Abfrage zur Laufzeit erstellen muss und diese kurz oder lang sein kann, verwende ich 'wobei 1 = 1 UND'.

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);
        }

Machen Sie es sich leichter

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.