9.13. Expressions conditionnelles
Cette section décrit les expressions conditionnelles respectueuses du
standard SQL disponibles avec
PostgreSQL™.
Astuce
S'il s'avère nécessaire d'aller au-delà des possibilités offertes
par les expressions conditionnelles, il faut considérer
l'écriture d'une procédure stockée dans un langage de
programmation plus expressif.
9.13.1. CASE
L'expression SQL
CASE est une expression conditionnelle générique,
similaire aux instructions if/else des autres langages :
CASE WHEN condition THEN résultat
[WHEN ...]
[ELSE résultat]
END
Les clauses CASE peuvent être utilisées
partout où une expression est valide.
condition
est une expression qui
renvoie un résultat de type boolean. Si
le résultat est vrai, alors la valeur de l'expression CASE est le
résultat
qui suit la condition. Si le
résultat est faux, toutes les clauses WHEN suivantes sont parcourues de la même façon. Si
aucune
condition
WHEN n'est vraie, alors la valeur de l'expression
est le
résultat
de la clause
ELSE. Si la clause ELSE est omise et qu'aucune condition ne correspond,
alors le résultat est nul.
Un exemple :
SELECT * FROM test;
a
---
1
2
3
SELECT a,
CASE WHEN a=1 THEN 'un'
WHEN a=2 THEN 'deux'
ELSE 'autre'
END
FROM test;
a | case
---+-------
1 | un
2 | deux
3 | autre
Les types de données de toutes les expressions
résultat
doivent être convertibles dans
un type de sortie unique. Voir la Section 10.5,
« Constructions UNION, CASE et constructions relatives » pour plus
de détails.
L'expression CASE « simple » qui suit est une variante spécialisée
de la forme générale ci-dessus :
CASE expression
WHEN valeur THEN
résultat
[WHEN ...]
[ELSE résultat]
END
L'
expression
est calculée et
comparée à toutes les spécifications de
valeur
des clauses WHEN jusqu'à en trouver une égale. Si aucune ne
correspond, le
résultat
de la
clause ELSE (ou une valeur NULL) est
renvoyée. Ceci est similaire à l'instruction switch en C.
L'exemple ci-dessus peut être réécrit en utilisant la syntaxe
CASE simple :
SELECT a,
CASE a WHEN 1 THEN 'un'
WHEN 2 THEN 'deux'
ELSE 'autre'
END
FROM test;
a | case
---+-------
1 | un
2 | deux
3 | autre
Une expression CASE n'évalue pas les
sous-expressions qui ne sont pas nécessaires pour déterminer le
résultat. Par exemple, une façon possible d'éviter une division par
zéro :
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
9.13.2. COALESCE
COALESCE(valeur [, ...])
La fonction COALESCE renvoie le premier
de ces arguments qui n'est pas nul. Une valeur NULL n'est renvoyée
que si tous les arguments sont nuls. Cette fonction est souvent
utile pour substituer une valeur par défaut aux valeurs NULL
lorsque la donnée est récupérée pour affichage. Par exemple :
SELECT COALESCE(description, description_courte, '(aucune)') ...
À l'instar d'une expression CASE,
COALESCE n'évalue pas les arguments
inutiles à la détermination du résultat ; c'est-à-dire que tous les
arguments à la droite du premier argument non nul ne sont pas
évalués. Cette fonction SQL standard fournit des fonctionnalités
similaires à NVL et IFNULL, qui sont utilisées dans d'autres systèmes
de bases de données.
9.13.3. NULLIF
NULLIF(valeur1, valeur2)
La fonction NULLIF renvoie une valeur
NULL si
valeur1
et
valeur2
sont égales ; sinon, elle
renvoie
valeur1
.
On peut s'en servir pour effectuer l'opération inverse de l'exemple
de COALESCE donné ci-dessus :
SELECT NULLIF(valeur, '(aucune)') ...
Si
valeur1
est (aucune), renvoie une valeur NULL. Sinon, renvoie
valeur1
.
9.13.4. GREATEST et LEAST
GREATEST(valeur [, ...])
LEAST(valeur [, ...])
Les fonctions GREATEST et LEAST sélectionnent, respectivement, la valeur la
plus grande et la valeur la plus petite d'une liste d'expressions.
Elles doivent être toutes convertibles en un type de données
commun, type du résultat (voir la Section 10.5,
« Constructions UNION, CASE et constructions relatives » pour les
détails). Les valeurs NULL contenues dans la liste sont ignorées.
Le résultat est NULL uniquement si toutes les expressions sont
NULL.
GREATEST et LEAST ne sont pas dans le standard SQL mais sont
une extension habituelle.