Warum sollte jemand bei einer Abfrage "where 1 = 1" eingeben?

18

Ich bin heute auf eine Ansicht in unserer Datenbank gestoßen, in der die erste Aussage in der where-Klausel war where 1 = 1. Sollte dies nicht für jeden Datensatz zutreffen? Warum würde jemand dies schreiben, wenn es keine Datensätze filtert?

goric
quelle
Beantwortet hier: dba.stackexchange.com/questions/667/…
Gaius
3
Weil sie die Website von jemandem hacken wollen ;-)
Tim Schmelter

Antworten:

40

Einige Builder für dynamische Abfragen enthalten diese Bedingung, so dass beliebige "echte" Bedingungen mit einem hinzugefügt werden können, ANDohne dass eine Prüfung durchgeführt werden muss if (first condition) 'WHERE' else 'AND'.

BenV
quelle
Es klingt seltsam, dass ein Abfrage-Generator nicht feststellen kann, ob eine Bedingung die erste in einer Zeile ist, aber ich denke auch, dass Sie Recht haben.
ern0
3
Es ist oft der Fall, wenn der "Query Builder" jemand ist, der Code schreibt, der von Hand auf die SQL-Anweisung verkettet werden soll. Manchmal beseitigt die Einführung einer formaleren Abfrageerstellungsbibliothek diese.
Araknid
1
Ich musste mich mit "altem" Code wie diesem auseinandersetzen, und das ist sehr richtig. Wenn Sie die gesamte SQL-Anweisung zu einer einzigen Zeichenfolge zusammensetzen, gibt es eine Reihe von if / then- oder case-Anweisungen, die möglicherweise ausgelöst werden oder nicht. Da Sie nie wissen, ob einer dieser Codepfade verwendet wird, ABER Sie ein UND in Ihre WHERE-Klausel eingebettet haben (aufgrund einer Klausel, die durchweg Teil der Zeichenfolge ist), müssen Sie entweder (a) das störende UND entfernen oder ( b) übergebe es einfach als logische Binsenweisheit. Das Hinzufügen von "1 = 1" ist einfacher, als die Zeichenfolge korrekt zu redigieren.
Avery Payne
5

Wenn Ihr Programm viele SQL-Anweisungserstellungspunkte enthält, die ähnliche Abfragen generieren , können Sie die untersuchte Abfrage mit diesem Trick markieren. Wenn es um das Zählen des Satzes geht, können Sie den folgenden Code verwenden, um 42aus einem SQL-Protokoll herauszugreifen .

select count(42) from table
ern0
quelle
4

Es stellt eine Situation dar, die immer wahr ist, sodass die Ergebnisse nicht beeinflusst werden. Sie wissen jedoch, dass die WHERE-Klausel bereits ein Element enthält.

SchwartzE
quelle