Cette section décrit les expressions conditionnelles respectueuses du standard SQL disponibles avec PostgreSQL™.
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.
L'expression SQL CASE est une expression conditionnelle générique, similaire aux instructions if/else des autres langages de programmation :
CASE WHEN condition THEN résultat [WHEN ...] [ELSE résultat] END
Les clauses CASE peuvent être utilisées partout où une expression est valide. Chaque condition est une expression qui renvoie un résultat de type boolean. Si le résultat de la condition est vrai, alors la valeur de l'expression CASE est le résultat qui suit la condition. Si le résultat de la condition n'est pas vrai, 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 CASE 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 qui suit est une variante de la forme générale ci-dessus :
CASE expression WHEN valeur THEN résultat [WHEN ...] [ELSE résultat] END
La première expression est calculée et comparée à chacune des 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). C'est similaire à l'instruction switch du langage 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;
COALESCE(valeur [, ...])
La fonction COALESCE renvoie le premier de ses 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.
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)') ...
Dans cet exemple, si valeur vaut (aucune), la valeur NULL est renvoyée, sinon la valeur de valeur est renvoyée.
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 des extensions habituelles. D'autres SGBD leur imposent de retourner NULL si l'un quelconque des arguments est NULL, plutôt que lorsque tous les arguments sont NULL.