web-dev-qa-db-fra.com

Ordre d'exécution des clauses WHEN dans une instruction CASE

Compte tenu du corps suivant d'une déclaration de cas:

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'

Je suppose que la ligne 2 sera toujours exécutée avant la ligne 4? Ensuite, j'ai lu des instructions telles que 'SQL est un langage déclaratif, ce qui signifie qu'il indique au moteur SQL quoi faire, et non pas comment' dans

Ordre d'exécution de la requête SQL

et je me demande si cela concerne également l'ordre d'exécution dans l'instruction CASE. Est-ce que je peux laisser le code ci-dessus tel quel sans changer de ligne 4? 

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

La valeur renvoyée sera la valeur de l'expression THEN pour la clause WHEN la plus ancienne (textuellement) qui correspond. Cela signifie que si les conditions de la ligne 2 sont remplies, le résultat sera A2.

Mais, si vos expressions THEN étaient plus complexes que de simples valeurs littérales, une partie du travail visant à évaluer ces expressions peut survenir même lorsque cette expression n'est pas requise.

Par exemple.

 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'

pourrait générer une division par zéro erreur même si r.code n’est pas égal à 0120, et même si c’est égal à 00, disons. Je ne sais pas ce que la norme doit dire sur cette question particulière, mais je sais que cela est vrai pour certains produits.

15

Ça ne fait rien:

"L'instruction CASE évalue ses conditions séquentiellement et s'arrête à la première condition dont la condition est remplie."

http://msdn.Microsoft.com/en-gb/library/ms181765.aspx

3
The Ghost

Autant que je sache, l'ordre d'évaluation CASE sera l'ordre que vous avez spécifié dans votre requête. Donc, dans votre cas, l'ordre d'évaluation sera 1,2,3,4 ... , 7

puis-je laisser le code ci-dessus tel quel sans avoir à changer de ligne 4

Vous pouvez changer votre 2ème variable CASE et inclure une partie ELSE comme ci-dessous qui se chargera de la 4ème évaluation CASE et vous pourrez supprimer complètement la 4ème évaluation.

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