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'
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.
Keine Ursache:
"Die CASE-Anweisung wertet ihre Bedingungen nacheinander aus und stoppt mit der ersten Bedingung, deren Bedingung erfüllt ist."
AFAIK, Die Reihenfolge der CASE
Auswertung 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 ELSE
name__-Teil wie unten einfügen, der die vierte CASE
name__-Auswertung übernimmt und die vierte Auswertung insgesamt entfernen kann
2 WHEN r.code ='01' AND r.source = 'PXWeb' then 'A2' ELSE 'A4'