Warum sollte jemand WHERE 1=1 AND <conditions>
in einer SQL-Klausel verwenden (entweder SQL, das durch verkettete Zeichenfolgen erhalten wird, oder Ansichtsdefinition)
Ich habe irgendwo gesehen, dass dies zum Schutz vor SQL Injection verwendet wird, aber es scheint sehr seltsam.
Wenn es eine Injektion gibt, WHERE 1 = 1 AND injected OR 1=1
hätte dies das gleiche Ergebnis wie injected OR 1=1
.
Später bearbeiten: Was ist mit der Verwendung in einer Ansichtsdefinition?
Danke für deine Antworten.
Trotzdem verstehe ich nicht, warum jemand diese Konstruktion zum Definieren einer Ansicht oder in einer gespeicherten Prozedur verwenden sollte.
Nehmen Sie zum Beispiel:
CREATE VIEW vTest AS
SELECT FROM Table WHERE 1=1 AND table.Field=Value
sql
dynamic-sql
Bogdan Maxim
quelle
quelle
Antworten:
Wenn die Liste der Bedingungen zur Kompilierungszeit nicht bekannt ist und stattdessen zur Laufzeit erstellt wird, müssen Sie sich keine Gedanken darüber machen, ob Sie eine oder mehrere Bedingungen haben. Sie können sie alle wie folgt generieren:
und verketten sie alle zusammen. Mit dem
1=1
am Anfang hat die Initialeand
etwas zu assoziieren.Ich habe noch nie gesehen, dass dies für irgendeine Art von Injektionsschutz verwendet wird, wie Sie sagen, es scheint nicht viel zu helfen. Ich habe gesehen, dass es als Implementierungskomfort verwendet wird. Die SQL-Abfrage-Engine ignoriert diese am Ende,
1=1
sodass sie keine Auswirkungen auf die Leistung haben sollte.quelle
where 1=1
(Oracle) oderwhere true
(Postgres) hinzufügen zu können , muss ich für jede Bedingung prüfen, ob es die erste ist. Es macht keinen Sinn, dies zu tun, und es wird nur mehr Boilerplate-Code hinzugefügt.Fügen Sie einfach einen Beispielcode zu Gregs Antwort hinzu:
quelle
Ich habe gesehen, dass es verwendet wird, wenn die Anzahl der Bedingungen variabel sein kann.
Sie können Bedingungen mit einer "UND" -String verknüpfen. Anstatt die Anzahl der Bedingungen zu zählen, die Sie übergeben, setzen Sie am Ende Ihrer SQL-Standardanweisung ein "WHERE 1 = 1" und werfen die verketteten Bedingungen auf.
Grundsätzlich erspart es Ihnen, einen Test für Bedingungen durchzuführen und dann eine "WHERE" -String vor ihnen hinzuzufügen.
quelle
Es scheint ein fauler Weg zu sein, immer zu wissen, dass Ihre WHERE-Klausel bereits definiert ist, und es Ihnen zu ermöglichen, weiterhin Bedingungen hinzuzufügen, ohne prüfen zu müssen, ob es die erste ist.
quelle
where 1=1
(Oracle) oderwhere true
(Postgres) hinzufügen zu können , muss ich für jede Bedingung prüfen, ob es die erste ist. Es macht keinen Sinn, dies zu tun, und es wird nur mehr Boilerplate-Code hinzugefügt.WHERE 1=1
die zusätzliche Arbeit, denselben Code an mehreren Stellen zu verwalten und in all Ihrem generierten SQL zu lesen. Ich bin fauler als du, denke ich!Indirekt relevant: wenn 1 = 2 verwendet wird:
Dadurch wird eine neue Tabelle mit demselben Schema wie die alte Tabelle erstellt. (Sehr praktisch, wenn Sie einige Daten für Vergleiche laden möchten)
quelle
Der Ausdruck 1 = 1 wird üblicherweise im generierten SQL-Code verwendet. Dieser Ausdruck kann das Generieren von SQL-Code vereinfachen und die Anzahl der bedingten Anweisungen reduzieren.
quelle
Eigentlich habe ich so etwas in BIRT-Berichten gesehen. Die an die BIRT-Laufzeit übergebene Abfrage hat folgende Form:
und das '?' wird zur Laufzeit durch einen tatsächlichen Parameterwert ersetzt, der aus einem Dropdown-Feld ausgewählt wurde. Die Auswahlmöglichkeiten in der Dropdown-Liste sind wie folgt:
damit Sie alle möglichen Werte plus "
*
" erhalten. Wenn der Benutzer "*
" aus dem Dropdown-Feld auswählt (dh alle Werte von a sollten ausgewählt werden), muss die Abfrage (von Javascript) geändert werden, bevor sie ausgeführt wird.Seit der "?" ist ein Positionsparameter und MUSS dort bleiben, damit andere Dinge funktionieren. Das Javascript ändert die Abfrage wie folgt:
Dadurch wird der Effekt der where-Klausel im Wesentlichen beseitigt, während der Positionsparameter weiterhin beibehalten wird.
Ich habe auch den AND-Fall gesehen, der von faulen Codierern beim dynamischen Erstellen einer SQL-Abfrage verwendet wird.
Angenommen, Sie müssen dynamisch eine Abfrage erstellen, die mit Folgendes beginnt
select * from t
und Folgendes überprüft:Einige Leute würden das erste mit einem WO und die nachfolgenden mit einem UND hinzufügen, also:
Faule Programmierer (und das ist nicht unbedingt eine schlechte Eigenschaft) würden nicht zwischen den hinzugefügten Bedingungen unterscheiden, sie würden damit beginnen
select * from t where 1=1
und danach einfach AND-Klauseln hinzufügen.quelle
where 1=1
(Oracle) oderwhere true
(Postgres) hinzufügen zu können , muss ich für jede Bedingung prüfen, ob es die erste ist. Es macht keinen Sinn, dies zu tun, und es wird nur mehr Boilerplate-Code hinzugefügt.Ich fand dieses Muster nützlich, wenn ich Dinge in der Datenbank teste oder doppelt überprüfe, damit ich andere Bedingungen sehr schnell kommentieren kann:
verwandelt sich in:
quelle
Dabei ist 1 = 0, um zu überprüfen, ob die Tabelle vorhanden ist. Ich weiß nicht, warum 1 = 1 verwendet wird.
quelle
Während ich sehe, dass 1 = 1 für generiertes SQL nützlich wäre, besteht eine Technik, die ich in PHP verwende, darin, ein Array von Klauseln zu erstellen und dies dann zu tun
Dadurch wird das Problem eines führenden oder nachfolgenden UND vermieden. Dies ist natürlich nur dann nützlich, wenn Sie wissen, dass Sie mindestens eine Klausel haben werden!
quelle
Hier ist ein eng verwandtes Beispiel: Verwenden einer SQL-
MERGE
Anweisung zum Aktualisieren des vorgelegten Ziels unter Verwendung aller Werte aus der Quelltabelle, für die es kein gemeinsames Attribut gibt, an dem Sie teilnehmen können, zquelle
Ich habe gesehen homespun Frameworks Dinge zu tun wie diese ( Röte ), da diese faulen Parsing Praktiken ermöglicht die auf beide angewendet werden
WHERE
undAND
SQL - Schlüsselwörter.Betrachten Sie beispielsweise (ich verwende hier C # als Beispiel) das bedingte Parsen der folgenden Prädikate in einer SQL-Abfrage
string builder
:Der "Vorteil" von
WHERE 1 = 1
bedeutet, dass kein spezieller Code benötigt wird:AND
erforderlich ist. Da wir bereits mindestens ein Prädikat mit dem haben1 = 1
, bedeutet dies, dassAND
es immer in Ordnung ist.WHERE
muss das gelöscht werden. Aber auch hier können wir faul sein, weil wir wieder mindestens ein Prädikat garantieren.Dies ist offensichtlich eine schlechte Idee und würde empfehlen, ein etabliertes Datenzugriffsframework oder ORM zu verwenden, um optionale und bedingte Prädikate auf diese Weise zu analysieren.
quelle
WHERE 1=1
ein fairer Indikator dafür ist, dass dies NICHT der Fall ist, dass die Codebasis mit Zeichenfolgen übersät istWHERE 1=1
, was auf ein Problem mit der Anwendungsarchitektur hinweisen würde, und ich würde nicht das einzige vermuten!Wenn Sie hierher gekommen sind, suchen
WHERE 1
Sie danachWHERE 1
undWHERE 1=1
sind identisch.WHERE 1
wird selten verwendet, da einige Datenbanksysteme dies ablehnen, da sieWHERE 1
nicht wirklich boolesch sind.quelle
Dies ist nützlich, wenn Sie eine dynamische Abfrage verwenden müssen, in der Sie in der where-Klausel einige Filteroptionen anhängen müssen. Zum Beispiel, wenn Sie die Optionen 0 für Status inaktiv und 1 für aktiv einschließen. Basierend auf den Optionen stehen nur zwei Optionen zur Verfügung (0 und 1). Wenn Sie jedoch Alle Datensätze anzeigen möchten, ist es praktisch, in den Bereich 1 = 1 aufzunehmen. Siehe Beispiel unten:
quelle
Nachdem ich alle Antworten überprüft hatte, beschloss ich, ein Experiment wie durchzuführen
Dann habe ich mit anderen Nummern nachgesehen
ect Nachdem alle Überprüfungen durchgeführt wurden, ist die Abfragestadt dieselbe. auch ohne die where-Klausel. Ich bin kein Fan der Syntax
quelle
Ich mache dies normalerweise, wenn ich dynamisches SQL für einen Bericht erstelle, der viele Dropdown-Werte enthält, die ein Benutzer auswählen kann. Da der Benutzer die Werte aus jedem Dropdown-Menü auswählen kann oder nicht, fällt es uns schwer, herauszufinden, welche Bedingung die erste where-Klausel war. Also füllen wir die Abfrage
where 1=1
am Ende mit einem auf und fügen danach alle where-Klauseln hinzu.Etwas wie
Dann würden wir die where-Klausel wie folgt erstellen und sie als Parameterwert übergeben
Da uns die Auswahl der where-Klausel zur Laufzeit unbekannt ist, hilft uns dies sehr bei der Suche, ob wir eine aufnehmen sollen
'AND' or 'WHERE'.
quelle
Die Verwendung eines Prädikats wie
1=1
ist ein normaler Hinweis, der manchmal verwendet wird, um den Zugriffsplan zu zwingen, einen Index-Scan zu verwenden oder nicht. Der Grund, warum dies verwendet wird, liegt darin, dass Sie eine mehrfach verschachtelte verknüpfte Abfrage mit vielen Prädikaten in der where-Klausel verwenden, bei der manchmal sogar die Verwendung aller Indizes dazu führt, dass der Zugriffsplan jede Tabelle liest - ein vollständiger Tabellenscan. Dies ist nur einer von vielen Hinweisen, die von Datenbankadministratoren verwendet werden, um einen Datenbankbetreiber dazu zu verleiten, einen effizienteren Pfad zu verwenden. Wirf einfach keinen rein. Sie benötigen eine Datenbank, um die Abfrage zu analysieren, da sie nicht immer funktioniert.quelle
Hier ist ein Anwendungsfall ... Ich bin jedoch nicht allzu besorgt darüber, warum ich 1 = 1 verwenden sollte oder nicht. Ich schreibe eine Funktion und verwende pyodbc, um einige Daten von SQL Server abzurufen. Ich suchte nach einer Möglichkeit, einen Füllstoff nach dem
where
Schlüsselwort in meinem Code zu erzwingen . Dies war in der Tat ein großartiger Vorschlag:Der Grund dafür ist, dass ich das Schlüsselwort 'where' nicht zusammen in der Klauselvariablen _where implementieren konnte. Ich denke also, dass die Verwendung einer Dummy-Bedingung, die als wahr ausgewertet wird, als Füllstoff dienen würde.
quelle
Ich bin zum ersten Mal mit ADO und klassischem Asp auf dieses Problem gestoßen. Die Antwort war: Leistung. wenn du eine Straße machst
Select * from tablename
und geben Sie das als SQL-Befehl / Text ein. Sie erhalten eine spürbare Leistungssteigerung mit dem
Where 1=1
hinzugefügt, es war ein sichtbarer Unterschied. Etwas, das damit zu tun hat, dass Tabellenüberschriften zurückgegeben werden, sobald die erste Bedingung erfüllt ist, oder mit einer anderen Verrücktheit, die die Dinge beschleunigt hat.
quelle