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.
CASE
L'expression SQL CASE
est une expression
conditionnelle générique, similaire aux instructions if/else des
autres langages de programmation :
CASE WHENcondition
THENré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 :
CASEexpression
WHENvaleur
THENré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.
COALESCE
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)') ...
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.
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)') ...
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 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 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.