9.17.1. CASE

L’expression SQL CASE est une expression conditionnelle générique, similaire aux instructions if/else dans d’autres langages de programmation :

CASE WHEN condition THEN result END

Les clauses CASE peuvent être utilisées partout où une expression est valide. Chaque condition est une expression qui renvoie un résultat booléen. Si le résultat de la condition est vrai, la valeur de l’expression CASE est le résultat qui suit la condition, et le reste de l’expression CASE n’est pas traité. Si le résultat de la condition n’est pas vrai, toutes les clauses WHEN suivantes sont examinées de la même manière. Si aucune condition WHEN ne donne un résultat vrai, la valeur de l’expression CASE est le résultat de la clause ELSE. Si la clause ELSE est omise et qu’aucune condition n’est vraie, le résultat est nul.

Un exemple:

SELECT * FROM test; a--- 1 2 3SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other

Les types de données de toutes les expressions de résultat doivent être convertibles en un seul type de sortie. Voir la section 10.5 pour plus de détails.

Il existe une forme « simple » d’expression CASE qui est une variante de la forme générale ci-dessus :

CASE expression WHEN value THEN result END

La première expression est calculée, puis comparée à chacune des expressions de valeur dans les clauses WHEN jusqu’à ce qu’on en trouve une qui lui soit égale. Si aucune correspondance n’est trouvée, le résultat de la clause ELSE (ou une valeur nulle) est renvoyé. Ceci est similaire à l’instruction switch en C.

L’exemple ci-dessus peut être écrit en utilisant la syntaxe CASE simple :

SELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other

Une expression CASE n’évalue pas les sous-expressions qui ne sont pas nécessaires pour déterminer le résultat. Par exemple, voici une façon possible d’éviter un échec de division par zéro:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

Note : Comme décrit dans la section 4.2.14, il existe diverses situations dans lesquelles les sous-expressions d’une expression sont évaluées à différents moments, de sorte que le principe selon lequel « CASE n’évalue que les sous-expressions nécessaires » n’est pas infaillible. Par exemple, une sous-expression constante 1/0 entraînera généralement un échec de division par zéro au moment de la planification, même si elle se trouve à l’intérieur d’une arme CASE qui ne serait jamais saisie au moment de l’exécution.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.