9.13. Expressions conditionnelles

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

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 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 fausse, 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 Section 10.5 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. Ceci 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, short_description, '(none)') ...

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.

9.13.3. NULLIF

NULLIF(valeur1,
valeur2)

La fonction NULLIF renvoie une valeur NULL si et seulement 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(value, '(none)') ...