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?
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.
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% 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:
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.
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
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%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?
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.
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.
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
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.
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).