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 fonction côté serveur dans un langage de programmation plus expressif.
Bien que COALESCE, GREATEST et
LEAST soient similaires syntaxiquement aux fonctions, ce ne
sont pas des fonctions ordinaires, et de ce fait elles ne peuvent pas être
utilisées avec des arguments de tableaux VARIADIC.
CASE
L'expression SQL CASE est une expression
conditionnelle générique, similaire aux instructions if/else des
autres langages de programmation :
CASE WHENconditionTHENrésultat[WHEN ...] [ELSEré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 pour plus de
détails.
L'expression CASE qui suit est une variante de la forme
générale ci-dessus :
CASEexpressionWHENvaleurTHENrésultat[WHEN ...] [ELSEré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;
Comme décrit dans Section 4.2.14, il existe plusieurs
situations dans lesquelles les sous-expressions d'une expression sont
évaluées à des moments différents. De fait, le principe suivant lequel
« CASE évalue seulement les sous-expressions
nécessaires » n'est pas garanti. Par exemple, une sous-expression
constante 1/0 renvoie normalement une erreur de division
par zéro lors de la planification, même s'il s'agit d'une branche de
CASE qui ne serait jamais choisie à l'exécution.
COALESCECOALESCE(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)') ...
Cela renvoie description si sa valeur est non NULL.
Sinon courte_description s'il est lui-même non NULL, et
enfin (aucune).
Les arguments doivent tous être convertible vers un type de données commun, qui* sera le type du résultat (voir Section 10.5 pour les détails).
À 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.
NULLIFNULLIF(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.
Les deux arguments doit être de types comparables. Pour être spécifique,
ils sont comparés exactement comme si vous aviez écrit
, donc il doit y avoir un
opérateur value1
= value2= convenable de disponible.
Le résultat a le même type que le premier argument -- mais il existe
une subtilité. Ce qui est réellement renvoyé est le premier argument de
l'opérateur = impliqué et, dans certains cas, aura été
promu pour correspondre au type du deuxième argument. Par exemple,
NULLIF(1, 2.2) renvoie numeric parce qu'il
n'y a pas d'opérateur integer =
numeric, seulement un numeric
= numeric.
GREATEST et LEASTGREATEST(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 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.