Short-Circuiting und CASE Ausdrücke

By Frank Kalis

Posted on Mär 4, 2011 von in SQL Server

Bart Duncan hat einen sehr interessanten Blog-Eintrag zu Short-Circuiting und CASE Audrücken verfasst.

Da denkt man lange Zeit, dass SQL Server im Bezug auf die Auswertung von CASE Ausdrücken dem SQL Standard folgt und den ersten result_expression-Ausdruck zurückgibt, der zu TRUE ausgewertet wird und dann auch mit der Auswertung evtl. weiterer WHEN Zweige aufhört und dann stellt Bart's einfaches Repro Skript gerade dies infrage.

Noch mal zur Erinnerung: In den Books Online liest man zu CASE folgendes:

Komplexer CASE-Ausdruck:

  • Für jede WHEN-Klausel werden die Boolean_expression-Ausdrücke in der angegebenen Reihenfolge ausgewertet.
  • Gibt den result_expression-Ausdruck des ersten Boolean_expression-Ausdrucks zurück, der zu TRUE ausgewertet wird.
  • Wird kein Boolean_expression-Ausdruck zu TRUE ausgewertet, gibt Database Engine (Datenbankmodul) den else_result_expression-Ausdruck zurück, falls eine ELSE-Klausel angegeben ist, oder einen NULL-Wert, falls keine ELSE-Klausel angegeben ist.

Dies ist offensichtlich auch im Einklang mit den ANSI SQL 92 Standard, der da spezifiziert:

2) Case:

a) If the <search condition> of some <searched when clause> in
a <case specification> is true, then the value of the <case
specification> is the value of the <result> of the first
(leftmost) <searched when clause> whose <search condition> is
true, cast as the data type of the <case specification>.

b) If no <search condition> in a <case specification> is true,
then the value of the <case expression> is the value of the
<result> of the explicit or implicit <else clause>, cast as
the data type of the <case specification>.

Selbst so international anerkannte Authoritäten wie Itzik Ben-Gan kommen zu dem Schluss, dass man sich auf den Determinismus bei CASE verlassen kann: Short Circuit.

Nun, offensichtlich scheint das nicht immer der Fall zu sein und ich werde zukünftig vorsichtiger mit der Aussage sein, dass man sich auf bei CASE Ausdrücke darauf verlassen kann, dass die Auswertung nach dem ersten TRUE abgebrochen wird.

Dieser Eintrag wurde eingetragen von und ist abgelegt unter SQL Server. Tags: , , ,

Noch kein Feedback


Formular wird geladen...