Werden in der SQL Server- CASE
Anweisung (speziell 2008 oder 2012) alle WHEN
Bedingungen ausgewertet oder wird sie beendet, sobald eine WHEN
Klausel gefunden wird, die als wahr ausgewertet wird? Wenn der gesamte Bedingungssatz durchlaufen wird, bedeutet dies, dass die letzte Bedingung, die als wahr bewertet wurde, die erste Bedingung überschreibt, die als wahr bewertet wurde? Zum Beispiel:
SELECT
CASE
WHEN 1+1 = 2 THEN'YES'
WHEN 1+1 = 3 THEN 'NO'
WHEN 1+1 = 2 THEN 'NO'
END
Das Ergebnis ist "JA", obwohl die Bedingung "Letzter Zeitpunkt" "NEIN" ergeben sollte. Es scheint, dass es beendet wird, sobald es die erste WAHR-Bedingung findet. Kann jemand bitte bestätigen, ob dies der Fall ist .
sql-server
t-sql
case
Juan Velez
quelle
quelle
COALESCE()
in einenCASE
Ausdruck übersetzt.)Antworten:
• Gibt den result_expression des ersten input_expression = when_expression zurück , der zu TRUE ausgewertet wird .
Referenz http://msdn.microsoft.com/en-us/library/ms181765.aspx
Dies ist das Standardverhalten von SQL:
Ein
CASE
Ausdruck wird zur ersten wahren Bedingung ausgewertet.Wenn keine wahre Bedingung vorliegt, wird das
ELSE
Teil ausgewertet .Wenn es keinen wahren Zustand und kein
ELSE
Teil gibt, wird es zu ausgewertetNULL
.quelle
SQL Server führt normalerweise eine Kurzschlussauswertung für CASE-Anweisungen ( SQLFiddle ) durch:
Es gibt jedoch verschiedene Arten von Anweisungen, die ab SQL Server 2012 nicht mehr richtig kurzschließen. Siehe den Link von ypercube in den Kommentaren.
Oracle führt immer eine Kurzschlussauswertung durch . Siehe die 11.2 SQL-Sprachreferenz . Oder vergleichen Sie Folgendes ( SQLFiddle ):
Derselbe Test kann nicht mit MySQL durchgeführt werden, da NULL für die Division durch Null zurückgegeben wird. ( SQL-Geige )
quelle
Es scheint, dass MS SQL Server auch eine Kurzschlussauswertung verwendet.
Im folgenden Test habe ich 3 Tests. Der erste ist immer wahr, der zweite schlägt fehl, ohne auf die Tabelle zu verweisen, und der dritte schlägt nur fehl, wenn die Daten berücksichtigt werden.
In diesem bestimmten Lauf werden beide Zeilen erfolgreich zurückgegeben. Wenn ich das erste WANN oder das erste und das zweite auskommentiere, bekomme ich Fehler.
quelle
Wenn die in der
WHERE
Bedingung verwendete case-Anweisung und die erste when-Anweisung das Auswerten von Spaltenwerten aus der Tabelle umfassen und die erste Zeile in der Tabelle diese Bedingung nicht erfüllt, wird die case-Anweisung mit der when-Anweisung für den nächsten case fortgesetzt.quelle
In MySQL wird die case-Anweisung für die erste true-Option beendet. Wenn Sie die Möglichkeit haben, mehrere wahre Werte anzugeben, möchten Sie die bevorzugte Antwort früher in die Sequenz einfügen.
quelle