SQL 'Oder' - operator. Wie funktioniert das bei folgendem Szenario?
Ich habe eine Abfrage optimieren und lief in eine situation, die macht mich Frage wie ich haben immer verwendet SQL ODER der Betreiber. (SQL Server 2000)
Ich habe eine Abfrage, wo die Bedingung (WHERE) - Klausel sieht wie folgt aus:
WHERE (Column1 = @Param1 or Column1 LIKE @Param1 + '%')
AND (@Param2 = '' OR Column2 = @Param2 OR Column2 LIKE @Param2 + '%')
Nun, ich habe immer verstanden, dass ODER in SQL ausgewertet werden beide Ausdrücke. Also alle Datensätze, die ausgewertet true für den linken Ausdruck zurückgegeben werden, zusammen mit alle Datensätze, die "true" ausgewertet wird, auf den richtigen Ausdruck. Zum Beispiel:
SELECT * FROM TABLE1
WHERE COL1 = 'Test' OR Col2 = 'Data'
Dieser würde zurück alle Datensätze, in denen COL1'Test' sowie jedem Datensatz, in dem Col2 'Daten'
In dem Beispiel oben habe ich geändert, die Spalte 2 die bedingte der folgenden:
AND(Column2 LIKE ISNULL(@Param2, '') + '%')
Ganz plötzlich, bekomme ich 0 Zeilen zurückgegeben.
Habe ich das verwechselt, ODER nur Ausdrücke ausgewertet werden, bis es ein WAHRES Ergebnis oder eine Bedingung, die bewirkt, dass das 2 verschiedene, um unterschiedliche Ergebnisse zurückgeben?
- Können Sie nach dem abschließen, wo Sie nach Ihrer änderung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
"ODER nur Ausdrücke ausgewertet werden, bis es ein WAHRES Ergebnis"
Es hat nur zu, aber das ist nicht dein problem (das ist eigentlich das, was sparen Sie in Ihrem ursprünglichen Fall). Deine beiden Abfragen sind nicht wirklich gleichwertig.
Ich denke, Sie haben
NULL
s in Spalte 2, das wird nie dazu führen(Column2 LIKE ISNULL(@Param2, '') + '%')
um wahr zu sein - und in Ihrer ursprünglichen version der@Param2 = ''
war Maskierung diesem Fall, da es wahr IST (manchmal)Vielleicht:
Erinnere mich an die drei-wertige Logik für Null-Werte:
Aber ich bin mir nicht sicher, ob Ihr-Optimierung wirklich hilft.
BZW. ist nicht allumfassend, vor allem, weil es in Klammern. Was haben Sie in größeren da ist:
WHERE X AND Y
. Die Tatsache, dass X und Y selbst sind Boolesche Ausdrücke, die Gebrauch machen von einem ODER ist es nicht wichtig: Sie werden separat ausgewertet und anschließend die Ergebnisse sind gefüttert, um den UND-operator.[edit]:
Lese nochmal, vielleicht habe ich deine Frage missverstanden. Mit dem im Verstand, werde ich gehen müssen mit den anderen Antworten, weil
NULL LIKE '%'
gibt NULL zurück, das ist das gleiche wie false in diesem Fall. Sie könnten versuchen, diese stattdessen:Zur info, es gibt sehr einfache Experimente, die Sie tun können, um zu sehen, dass nicht alle Bedingungen unbedingt ausgewertet.
Habe ich diese in Oracle, aber ich erwarte, dass Sie hätte ein ähnliches Ergebnis in SQL Server.
Den Zustand nach der ODER darf nicht ausgewertet wurden, da es würde eine Division durch null Fehler.
Dieser Umgang mit booleschen Operatoren ist im Allgemeinen bekannt als "Kurzschluss" und,, soweit ich weiß, ist ziemlich standard in den modernen Sprachen. Es können auch in ein-UND Ausdruck-wenn die erste Bedingung false ist, gibt es keinen Punkt in der Auswertung der zweiten Bedingung, da der ganze Ausdruck kann unmöglich WAHR sein.
Mehr info: http://en.wikipedia.org/wiki/Short-circuit_evaluation
Sowieso als Cade sagte, Ihr problem ist wahrscheinlich eine falsche Handhabung der Null-Werte.
MS-SQL auswerten der linken Seite die erste und nicht gehen, es sei denn, es muss.
Dies ist das gleiche mit dem UND-Konnektor, der linken Seite wird ausgewertet und wenn false, wird das Recht nicht evaulated.