wake-up-neo.com

Ausführungsreihenfolge von WHEN-Klauseln in einer CASE-Anweisung

Angesichts des folgenden Hauptteils einer Fallerklärung:

1    WHEN r.code= '00'                        then 'A1'
2    WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2'   <
3    WHEN r.code ='0120'                      then 'A3'
4    WHEN r.code ='01'                        then 'A4'   <
5    WHEN r.code ='1560'                      then 'A5'
6    WHEN r.code ='1530'                      then 'A6'
7    WHEN r.code ='1550'                      then 'A7'

Ich gehe davon aus, dass Zeile 2 immer vor Zeile 4 ausgeführt wird. Dann lese ich Anweisungen wie ' SQL ist eine deklarative Sprache, was bedeutet, dass die SQL-Engine sagt, was zu tun ist, und nicht wie '

Reihenfolge der Ausführung der SQL-Abfrage

und sich fragen, ob dies auch die Reihenfolge der Ausführung in der CASE-Anweisung betrifft. Im Wesentlichen kann ich den Code oben belassen, ohne Zeile 4 in ändern zu müssen 

4    WHEN r.code ='01' AND r.source != 'PXWeb' then 'A4'   
15
The Ghost

Der zurückgegebene Wert ist der Wert des THEN-Ausdrucks für die früheste WHEN-Klausel (textlich), die übereinstimmt. Das bedeutet, dass das Ergebnis A2 ist, wenn die Bedingungen für Zeile 2 erfüllt sind.

Wenn Ihre THEN-Ausdrücke jedoch komplexer waren als nur wörtliche Werte, können einige der auszuführenden auswertenden - Ausdrücke auch dann auftreten, wenn dieser Ausdruck nicht erforderlich ist.

Z.B.

 WHEN r.code= '00'                        then 'A1'
 WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2'
 WHEN r.code ='0120'                      then 1/0
 WHEN r.code ='01'                        then 'A4'

könnte einen Fehler durch Division durch Null erzeugen, auch wenn r.code nicht 0120 und sogar 00 gleich ist. Ich weiß nicht, was der Standard zu diesem speziellen Thema zu sagen hat, aber ich weiß, dass es für einige Produkte gilt.

15

Keine Ursache:

"Die CASE-Anweisung wertet ihre Bedingungen nacheinander aus und stoppt mit der ersten Bedingung, deren Bedingung erfüllt ist."

http://msdn.Microsoft.com/de-de/library/ms181765.aspx

3
The Ghost

AFAIK, Die Reihenfolge der CASEAuswertung entspricht der Reihenfolge, die Sie in Ihrer Abfrage angegeben haben. In Ihrem Fall lautet die Reihenfolge der Auswertung also 1,2,3,4 ... , 7

kann ich den Code oben belassen, ohne Zeile 4 in ändern zu müssen?

Sie können Ihren zweiten CASEändern und einen ELSEname__-Teil wie unten einfügen, der die vierte CASEname__-Auswertung übernimmt und die vierte Auswertung insgesamt entfernen kann

2    WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2' ELSE 'A4'  
1
Rahul