So schließen Sie SQL where clause kurz

8

Ich versuche, die folgende Abfrage in SQL Server durchzuführen:

%Vor%

Dies verursacht offensichtlich einen Fehler, weil "asdas" nicht in Date konvertiert werden kann. Obwohl ich ein anderes Verhalten erwartet habe. Das heißt, weil ISDATE(@queryWord) = 1 falsch ist, erwartete ich, dass SQL die zweite Bedingung nicht überprüft, aber anscheinend tut es das.

Ich weiß, dass es andere Möglichkeiten gibt, diese Abfrage durchzuführen, aber das ist nicht meine Frage. Ich frage mich, ob es eine Möglichkeit gibt, die zweite Bedingung nicht zu überprüfen, ist die erste nicht zufrieden stellend. Ich bin neugierig, weil ich dachte, dass SQL das schon getan hat.

    
nachovall 17.10.2013, 14:17
quelle

5 Antworten

11

SQL Server führt keinen Kurzschluss durch (und sollte es auch nicht).

Wenn Sie unter bestimmten Umständen etwas nicht versuchen müssen, müssen Sie dies auf die Art und Weise erzwingen, wie Sie Ihre Abfrage schreiben.

Für diese Abfrage wäre es am einfachsten, einen CASE Ausdruck in Ihrer WHERE Klausel zu verwenden.

%Vor%

Off-hand, CASE und Query-Nesting sind die einzigen unterstützten Möglichkeiten, um eine Reihenfolge der Auswertung für abhängige Bedingungen in SQL zu erzwingen.

    
RBarryYoung 17.10.2013, 14:25
quelle
2

Ich schätze, du könntest es in zwei Pässen tun:

%Vor%

So führt Ihre innere Abfrage den ersten Test und die äußere Abfrage die zweite aus. In einer einzigen Abfrage glaube ich nicht, dass es eine Möglichkeit gibt, eine Reihenfolge der Auswertungsbedingungen zu erzwingen.

    
Andrew 17.10.2013 14:23
quelle
1

Warum nicht einen CASE in der WHERE-Bedingung?

%Vor%     
wergeld 17.10.2013 14:26
quelle
1

Es kann mit einer CASE Anweisung "simuliert" werden. Aber Sie müssen die erste Bedingung machen, die einen TRUE -Wert gibt, um die Überprüfung der 2. Bedingung zu vermeiden:

%Vor%     
Fabien TheSolution 17.10.2013 17:50
quelle
1

Es gibt keine definierte Bewertungsreihenfolge in einer SQL-Anweisung - außer im Fall von Groß- / Kleinschreibungs-Ausdrücken, und selbst dort ist die Reihenfolge nicht so sehr definiert, wie das Ergebnis garantiert ist. Die Bedingungen in Ihrer where-Klausel könnten theoretisch in paralleler oder alternierender Reihenfolge ausgeführt werden.

Case-Ausdrücke unterscheiden sich nicht durch eine definierte Reihenfolge, sondern durch ein garantiertes Ergebnis. IOW, case when 1=1 then 0 When longrunningfunction() = 1 then 2 end wird garantiert Null zurückgeben, aber es gibt kein Versprechen, die LongRunning-Funktion nicht auszuführen.

    
jmoreno 17.10.2013 15:22
quelle

Tags und Links