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'
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.
Ç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."
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'