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.
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.
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.
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.
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:
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.
Tags und Links sql sql-server tsql