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

9.13. Expressions conditionnelles

Cette section décrit les expressions conditionnelles respectant le standard SQL disponibles avec PostgreSQL™.

[Astuce]

Astuce

Si vos besoins dépassent les possibilités des expressions conditionnelles, vous devez 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, toute clause WHEN suivante est recherchée de la même façon. Si la condition WHEN 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 'autres'
       END
    FROM test;

 a | case
---+-------
 1 | un
 2 | deux
 3 | autres

Les types de données de toutes les expressions résultat doivent être convertibles dans un même type de sortie. Voir la Section 10.5, « Constructions UNION, CASE et constructions relatives » pour plus de détails.

La « simple » expression CASE suivante 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. Si aucune ne correspond, le résultat dans 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 'autres'
       END
    FROM test;

 a | case
---+-------
 1 | un
 2 | deux
 3 | autres

Une expression CASE n'évalue pas les sous-expressions qui ne sont pas nécessaires pour déterminer le résultat. Par exemple, voici 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 est renvoyée seulement si tous les arguments sont nuls. Cette fonction est souvent utile pour substituer une valeur par défaut pour les valeurs NULL lorsque la donnée est récupérée pour affichage. Par exemple :

SELECT COALESCE(description, description_courte, '(aucune)') ...

Comme une expression CASE, COALESCE n'évaluera pas les arguments non nécessaires à 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, il renvoie valeur1. Ceci est réalisé pour disposer de 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 à partir d'une liste d'un certain nombre d'expressions. Elles doivent être toutes convertibles en un type de données commun qui sera le 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 sera NULL seulement si toutes les expressions sont NULL.

Notez que GREATEST et LEAST ne sont pas dans le standard SQL mais sont une extension habituelle.