Expressions conditionnelles en langage SQL standard

Les expressions conditionnelles imposent des contraintes sur l'ordre d'évaluation de leurs entrées. En substance, elles sont évaluées de gauche à droite (avec possibilité de court-circuitage) et l'évaluation ne porte que sur la valeur de sortie qui a été choisie. Par opposition, les entrées des fonctions standards sont quant à elles toutes évaluées avant l'appel de la fonction. L'option de court-circuitage disponible avec les expressions conditionnelles peut être exploitée pour la gestion des erreurs ou l'optimisation des performances.

Expression CASE

CASE expr
  WHEN expr_to_match THEN result
  [ ... ]
  [ ELSE else_result ]
END

Description

Compare successivement expr à expr_to_match de chaque clause WHEN et renvoie le premier résultat pour lequel cette comparaison renvoie "true". Les clauses WHEN restantes et else_result ne sont pas évaluées. Si la comparaison expr = expr_to_match renvoie false ou NULL pour toutes les clauses WHEN, renvoie else_result si celui-ci est présent, renvoie NULL s'il ne l'est pas.

expr et expr_to_match peuvent correspondre à n'importe quel type. Ils doivent pouvoir être convertis implicitement (coercition) en un supertype commun ; les comparaisons d'égalité sont effectuées sur des valeurs "contraintes". Il peut y avoir plusieurs types result. Les expressions result et else_result doivent pouvoir être converties (coercition) en un supertype commun.

Type de données renvoyé

Supertype de result[, ...] et else_result.

Exemple

WITH Numbers AS
 (SELECT 90 as A, 2 as B UNION ALL
  SELECT 50, 8 UNION ALL
  SELECT 60, 6 UNION ALL
  SELECT 50, 10)
SELECT A, B,
  CASE A
    WHEN 90 THEN 'red'
    WHEN 50 THEN 'blue'
    ELSE 'green'
  END
  AS result
FROM Numbers

+------------------+
| A  | B  | result |
+------------------+
| 90 | 2  | red    |
| 50 | 8  | blue   |
| 60 | 6  | green  |
| 50 | 10 | blue   |
+------------------+

CASE

CASE
  WHEN condition THEN result
  [ ... ]
  [ ELSE else_result ]
  END

Description

Évalue la condition de chaque clause WHEN successive et renvoie le premier résultat pour lequel la condition est "true". Les autres clauses WHEN et else_result ne sont pas évaluées. Si toutes les conditions sont "false" ou NULL, la fonction renvoie else_result si celui-ci est présent et NULL s'il ne l'est pas.

condition doit être une expression booléenne. Il peut y avoir plusieurs types result. Les expressions result et else_result doivent pouvoir être converties implicitement (coercition) en un supertype commun.

Type de données renvoyé

Supertype de result[, ...] et else_result.

Exemple

WITH Numbers AS
 (SELECT 90 as A, 2 as B UNION ALL
  SELECT 50, 6 UNION ALL
  SELECT 20, 10)
SELECT A, B,
  CASE
    WHEN A > 60 THEN 'red'
    WHEN A > 30 THEN 'blue'
    ELSE 'green'
  END
  AS result
FROM Numbers

+------------------+
| A  | B  | result |
+------------------+
| 90 | 2  | red    |
| 50 | 6  | blue   |
| 20 | 10 | green  |
+------------------+

COALESCE

COALESCE(expr[, ...])

Description

Renvoie la valeur de la première expression non nulle. Les expressions restantes ne sont pas évaluées. Une expression en entrée peut être de n'importe quel type. Il existe plusieurs types d'expressions en entrée. Toutes les expressions en entrée doivent pouvoir être converties implicitement (coercition) en un supertype commun.

Type de données renvoyé

Supertype de expr[, ...].

Exemples

SELECT COALESCE('A', 'B', 'C') as result

+--------+
| result |
+--------+
| A      |
+--------+
SELECT COALESCE(NULL, 'B', 'C') as result

+--------+
| result |
+--------+
| B      |
+--------+

IF

IF(expr, true_result, else_result)

Description

Si expr est "true", la fonction renvoie true_result, sinon elle renvoie else_result. else_result n'est pas évalué si expr est "true". true_result n'est pas évalué si expr est "false" ou NULL.

expr doit être une expression booléenne. true_result et else_result doivent pouvoir être convertis (coercition) en un supertype commun.

Type de données renvoyé

Supertype de true_result et else_result.

Exemple

WITH Numbers AS
 (SELECT 10 as A, 20 as B UNION ALL
  SELECT 50, 30 UNION ALL
  SELECT 60, 60)
SELECT
  A, B,
  IF( A<B, 'true', 'false') as result
FROM Numbers

+------------------+
| A  | B  | result |
+------------------+
| 10 | 20 | true   |
| 50 | 30 | false  |
| 60 | 60 | false  |
+------------------+

IFNULL

IFNULL(expr, null_result)

Description

Si la valeur de expr est NULL, renvoie null_result. Sinon, la fonction renvoie expr. Si la valeur de expr n'est pas NULL, null_result n'est pas évalué.

expr et null_result peuvent être de n'importe quel type et doivent pouvoir être convertis implicitement (coercition) en un supertype commun. Synonyme de COALESCE(expr, null_result).

Type de données renvoyé

Supertype de expr ou null_result.

Exemples

SELECT IFNULL(NULL, 0) as result

+--------+
| result |
+--------+
| 0      |
+--------+
SELECT IFNULL(10, 0) as result

+--------+
| result |
+--------+
| 10     |
+--------+

NULLIF

NULLIF(expr, expr_to_match)

Description

Renvoie NULL si expr = expr_to_match est "true", sinon elle renvoie expr.

expr et expr_to_match doivent pouvoir être convertis implicitement (coercition) en un supertype commun et doivent être comparables.

Type de données renvoyé

Supertype de expr et expr_to_match.

Exemple

SELECT NULLIF(0, 0) as result

+--------+
| result |
+--------+
| NULL   |
+--------+
SELECT NULLIF(10, 0) as result

+--------+
| result |
+--------+
| 10     |
+--------+