PostgreSQLLa base de données la plus sophistiquée au monde.

9.13. Expressions conditionnelles

Cette section décrit les expressions conditionnelles respectueuses du standard SQL disponibles avec PostgreSQL™.

[Astuce]

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.