it-swarm.com.de

Warum WHERE 1 oder WHERE 1 = 1 verwenden?

Wenn in unseren Abfrageanweisungen keine Bedingungen erforderlich sind, verwenden wir normalerweise keine WHERE -Klausel. Aber ich habe gesehen, dass an vielen Stellen eine WHERE 1 - Klausel 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 Funktionen?
  • Ist die Verwendung von WHERE 1=1 Ähnlich?
52
ursitesion

Grundsätzlich dient dies nur der Bequemlichkeit des Programmierers, da Sie danach mit AND... Zusätzliche Bedingungen hinzufügen können und dies keine Auswirkungen auf die Ausführungszeit hat.

Schauen Sie sich diese Links zu Stackoverflow an:

Beachten Sie, dass WHERE 1 Mit WHERE 1=1 Identisch ist. beide bedeuten WHERE TRUE, aber ersteres wird von vielen Datenbankverwaltungssystemen als nicht wirklich boolesch abgelehnt.

47
Twinkles

Meine Hauptanwendung ist, dass es einfacher ist, Dinge während der Entwicklung von Abfragen zu kommentieren. Ich führe mit , 's und and' s:

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

Erleichtert auch das programmgesteuerte Anheften von Dingen bis zum Ende.

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 überprüfen lassen. Was ist, wenn der Benutzer im vorherigen Beispiel nur Option D gewählt hat? Sie müssten sicherstellen, dass if A, B and C aren't chosen dann benutze WHERE sonst benutze and. Mit = Zu Beginn können Sie die Qualifizierer einfach bis zum Ende der Anweisung schlagen.

19
WernerCD

Warum machen wir das?

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

Erzeugt SELECT .... WHERE und dann muss ETWAS vorhanden sein. 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 nur Dinge WO ist obligatorisch;)

Alles andere sehe ich nicht.

10
TomTom

Ich habe eine Reihe von benutzerdefinierten Funktionen in C++/C für PostgreSQL programmiert, die von anderen Personen in einem großen Unternehmen (über 10.000 Personen) verwendet wurden. Meine Funktionen haben einen optionalen Parameter where: Wenn kein Wert angegeben wurde, wurde die Klausel nicht verwendet. Dies wurde explizit dokumentiert. Leider hat niemand diese Funktion verwendet und jeder hat nur where 1=1 Klausel. Theoretisch erscheint dies unklug, praktisch alle Abfrageoptimierer schließen diese Art von Anweisungen aus. Und es ist schwierig, 10.000 Menschen zu erziehen.

5
arthur

Die Verwendung von "where 1 = 1" reduziert die Komplexität des Codes, der für die Generierung dynamischer SQL-Where-Klauseln benötigt wird. 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 reduzieren, und wenn möglich, ist die Reduzierung der Codekomplexität fast immer die richtige Entscheidung.

3
Niall

Einige Tools, wie DataGrip oder das Datenbank-Plugin für Intellij, beenden die Ausführung mit einer unsicheren Abfragewarnung, wenn die Abfrage update oder delete keine where -Klausel enthält. Dies kann manuell deaktiviert werden. Wenn Sie jedoch mit der Konsole arbeiten und gewarnt werden möchten, aber solche Skripte häufig ausführen möchten, ist es am einfachsten, etwas hinzuzufügen, das immer in true aufgelöst wird.

0
Andronicus

Los geht's ... aus Programmiersicht eine Verwendung von 1 = 1 ... enter image description here

In einer Situation wie dieser, in der ich zur Laufzeit eine Abfrage 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 einfacher

0
Saurabh