Was ist der Zweck der Verwendung von WHERE 1 = 1 in SQL-Anweisungen? [Duplikat]

8
  

Mögliche Duplikate:
Warum sollte eine SQL-Abfrage" where 1 = 1 "haben
Warum sollte jemand WHERE 1 = 1 UND & lt; conditions & gt; in einer SQL-Klausel?

Ich habe das oft in verschiedenen Abfrage-Beispielen gesehen und es geht wahrscheinlich zu allen SQL-Engines.

Wenn es eine Abfrage gibt, die keine Bedingungen hat, definieren Personen (und speziell ORM-Frameworks) oft immer-wahr Bedingung WHERE 1 = 1 oder etwas ähnliches.

Also statt

%Vor%

benutzen sie

%Vor%

Der einzige mögliche Grund, den ich mir vorstellen kann, wenn Sie dynamisch Bedingungen hinzufügen, müssen Sie sich nicht darum sorgen, das ursprüngliche AND zu entfernen, aber trotzdem wird diese 1 = 1 Bedingung oft entfernt, wenn eine tatsächliche Bedingung in der Abfrage.

Aktuelles Beispiel von CakePHP (generiert von Framework):

(keine Bedingungen)

%Vor%

(mit Bedingung)

%Vor%

Gibt es einen Grund, diese zusätzliche Bedingung hinzuzufügen?

    
RaYell 12.08.2009, 07:18
quelle

6 Antworten

4

Ja, normalerweise, weil es als 'where 1 = 0' beginnt, um die Anweisung zum Fehlschlagen zu zwingen.

Es ist eine naivere Art, es in eine Transaktion einzubinden und am Ende nicht zu committen, um Ihre Anfrage zu testen. (Dies ist die bevorzugte Methode).

    
Noon Silk 12.08.2009, 07:21
quelle
13

Es ist auch eine gängige Praxis, wenn Leute die sql-Abfrage programmatisch erstellen , es ist einfacher, mit 'where 1 = 1' zu beginnen und dann 'and customer.id =: custId' anzuhängen, je nachdem Eine Kunden-ID wird bereitgestellt. Sie können also immer den nächsten Teil der Abfrage anhängen, der mit 'und ...' beginnt.

    
HeDinges 12.08.2009 07:23
quelle
4

Die 1 = 1 wird von immer allen rdbms ignoriert. Es gibt keinen Kompromiss, der eine Abfrage mit WHERE 1 = 1 ausführt.

Erstellen dynamische WHERE-Bedingungen, wie ORM-Frameworks oder andere sehr oft, ist es einfacher, die real an Bedingungen anzuhängen, weil Sie vermeiden, dass ein AND an den Server angehängt wird aktueller Zustand.

%Vor%

So sieht es ohne 1 = 1 aus.

%Vor%     
Christian13467 12.08.2009 07:37
quelle
3

Menschen verwenden es, weil sie beim Erstellen dynamischer SQL-Abfragen inhärent faul sind. Wenn Sie mit einem "where 1 = 1" beginnen, dann beginnen alle Ihre Extra-Klauseln einfach mit "and" und Sie müssen nicht herausfinden.

Nicht, dass irgendetwas falsch daran wäre, von Natur aus faul zu sein. Ich habe doppelt verknüpfte Listen gesehen, bei denen eine "leere" Liste aus zwei Sentinel-Knoten besteht und Sie beginnen mit der Verarbeitung von first->next up bis last->prev inclusive.

Dadurch wurde der Sonderbehandlungscode zum Löschen der Knoten first und last entfernt. In dieser Konfiguration war jeder -Knoten ein mittlerer Knoten, da Sie first oder last nicht löschen konnten. Zwei Knoten wurden verschwendet, aber der Code war einfacher und (etwas) schneller.

Der einzige andere Ort, an dem ich das "1 = 1" -Konstrukt gesehen habe, ist BIRT. Berichte verwenden oft Positionsparameter und werden mit Javascript modifiziert, um alle Werte zuzulassen. Also die Abfrage:

%Vor%

, wenn der Benutzer "*" für den Parameter auswählt, der für col verwendet wird, um zu lesen:

%Vor%

Damit kann die neue Abfrage verwendet werden, ohne mit den Details der Positionsparameter herumzuspielen. Es gibt immer noch genau einen solchen Parameter. Jedes vernünftige DBMS (z. B. DB2 / z) wird diese Abfrage optimieren, um die Klausel im Grunde vollständig zu entfernen, bevor versucht wird, einen Ausführungsplan zu erstellen, so dass es keinen Kompromiss gibt.

    
paxdiablo 12.08.2009 07:52
quelle
2

Die Verwendung von 1 = 1 ist eigentlich keine sehr gute Idee, da dies ganze Tabellen-Scans allein verursachen kann.

Siehe dies - & gt; T-SQL 1 = 1 Leistungstreffer

    
Bhaskar 12.08.2009 07:21
quelle
1
___ qstnhdr ___ Was ist der Zweck der Verwendung von WHERE 1 = 1 in SQL-Anweisungen? [Duplikat] ___ answer1264764 ___

Die 1 = 1 wird von immer allen rdbms ignoriert. Es gibt keinen Kompromiss, der eine Abfrage mit WHERE 1 = 1 ausführt.

Erstellen dynamische WHERE-Bedingungen, wie ORM-Frameworks oder andere sehr oft, ist es einfacher, die real an Bedingungen anzuhängen, weil Sie vermeiden, dass ein AND an den Server angehängt wird aktueller Zustand.

%Vor%

So sieht es ohne 1 = 1 aus.

%Vor%     
___ qstntxt ___
  

Mögliche Duplikate:
Warum sollte eine SQL-Abfrage" where 1 = 1 "haben
Warum sollte jemand WHERE 1 = 1 UND & lt; conditions & gt; in einer SQL-Klausel?

Ich habe das oft in verschiedenen Abfrage-Beispielen gesehen und es geht wahrscheinlich zu allen SQL-Engines.

Wenn es eine Abfrage gibt, die keine Bedingungen hat, definieren Personen (und speziell ORM-Frameworks) oft immer-wahr Bedingung %code% oder etwas ähnliches.

Also statt

%Vor%

benutzen sie

%Vor%

Der einzige mögliche Grund, den ich mir vorstellen kann, wenn Sie dynamisch Bedingungen hinzufügen, müssen Sie sich nicht darum sorgen, das ursprüngliche %code% zu entfernen, aber trotzdem wird diese %code% Bedingung oft entfernt, wenn eine tatsächliche Bedingung in der Abfrage.

Aktuelles Beispiel von CakePHP (generiert von Framework):

(keine Bedingungen)

%Vor%

(mit Bedingung)

%Vor%

Gibt es einen Grund, diese zusätzliche Bedingung hinzuzufügen?

    
___ answer1264819 ___

Menschen verwenden es, weil sie beim Erstellen dynamischer SQL-Abfragen inhärent faul sind. Wenn Sie mit einem %code% beginnen, dann beginnen alle Ihre Extra-Klauseln einfach mit %code% und Sie müssen nicht herausfinden.

Nicht, dass irgendetwas falsch daran wäre, von Natur aus faul zu sein. Ich habe doppelt verknüpfte Listen gesehen, bei denen eine "leere" Liste aus zwei Sentinel-Knoten besteht und Sie beginnen mit der Verarbeitung von %code% up bis %code% inclusive.

Dadurch wurde der Sonderbehandlungscode zum Löschen der Knoten %code% und %code% entfernt. In dieser Konfiguration war jeder -Knoten ein mittlerer Knoten, da Sie %code% oder %code% nicht löschen konnten. Zwei Knoten wurden verschwendet, aber der Code war einfacher und (etwas) schneller.

Der einzige andere Ort, an dem ich das "1 = 1" -Konstrukt gesehen habe, ist BIRT. Berichte verwenden oft Positionsparameter und werden mit Javascript modifiziert, um alle Werte zuzulassen. Also die Abfrage:

%Vor%

, wenn der Benutzer %code% für den Parameter auswählt, der für %code% verwendet wird, um zu lesen:

%Vor%

Damit kann die neue Abfrage verwendet werden, ohne mit den Details der Positionsparameter herumzuspielen. Es gibt immer noch genau einen solchen Parameter. Jedes vernünftige DBMS (z. B. DB2 / z) wird diese Abfrage optimieren, um die Klausel im Grunde vollständig zu entfernen, bevor versucht wird, einen Ausführungsplan zu erstellen, so dass es keinen Kompromiss gibt.

    
___ tag123sql ___ Structured Query Language (SQL) ist eine Sprache für die Abfrage von Datenbanken. Fragen sollten Codebeispiele, Tabellenstruktur, Beispieldaten und ein Tag für die verwendete DBMS-Implementierung (z. B. MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 usw.) enthalten. Wenn sich Ihre Frage nur auf ein bestimmtes DBMS bezieht (verwendet bestimmte Erweiterungen / Funktionen), verwenden Sie stattdessen das Tag des DBMS. Antworten auf mit SQL gekennzeichnete Fragen sollten den ISO / IEC-Standard SQL verwenden. ___ answer1264714 ​​___

Wie Sie gesagt haben:

  

wenn Sie Bedingungen hinzufügen   dynamisch müssen Sie sich keine Sorgen machen   über das Abstreifen des anfänglichen AND   das ist der einzige Grund könnte sein, du hast Recht.

    
___ tag123condition ___ In der Informatik sind bedingte Anweisungen, bedingte Ausdrücke und bedingte Konstrukte Merkmale einer Programmiersprache, die unterschiedliche Berechnungen oder Aktionen ausführen, je nachdem, ob eine vom Programmierer angegebene boolesche Bedingung zu wahr oder falsch auswertet. ___ answer1264690 ___

Die Verwendung von 1 = 1 ist eigentlich keine sehr gute Idee, da dies ganze Tabellen-Scans allein verursachen kann.

Siehe dies - & gt; T-SQL 1 = 1 Leistungstreffer

    
___ tag123where ___ Eine Klausel in der Programmierung, die eine boolesche Bedingung (Prädikat) anwendet. ___ answer1264693 ___

Es ist auch eine gängige Praxis, wenn Leute die sql-Abfrage programmatisch erstellen , es ist einfacher, mit 'where 1 = 1' zu beginnen und dann 'and customer.id =: custId' anzuhängen, je nachdem Eine Kunden-ID wird bereitgestellt. Sie können also immer den nächsten Teil der Abfrage anhängen, der mit 'und ...' beginnt.

    
___ answer1264688 ___

Ja, normalerweise, weil es als 'where 1 = 0' beginnt, um die Anweisung zum Fehlschlagen zu zwingen.

Es ist eine naivere Art, es in eine Transaktion einzubinden und am Ende nicht zu committen, um Ihre Anfrage zu testen. (Dies ist die bevorzugte Methode).

    
___
Wael Dalloul 12.08.2009 07:27
quelle

Tags und Links