Catégories :

Fonctions d’expressions conditionnelles

IFNULL

Si expr1 vaut NULL, renvoie expr2, sinon renvoie expr1.

Alias:

NVL

Syntaxe

IFNULL( <expr1> , <expr2> )
Copy

Arguments

expr1

Une expression générale.

expr2

Une expression générale.

Notes sur l’utilisation

  • Snowflake effectue une conversion implicite des arguments pour les rendre compatibles. Par exemple, si l’une des expressions en entrée est un type numérique, le type de retour est également un type numérique. Autrement dit, SELECT IFNULL('17', 1); convertit d’abord la valeur VARCHAR '17' en valeur NUMBER 17, puis renvoie la première valeur non-NULL.

    Lorsque la conversion n’est pas possible, la conversion implicite échoue. Par exemple, SELECT IFNULL('foo', 1); renvoie une erreur, car la valeur VARCHAR 'foo' ne peut pas être convertie en valeur NUMBER.

    We recommend passing in arguments of the same type or explicitly converting arguments if needed.

  • Lorsque la conversion implicite convertit une valeur non numérique en valeur numérique, le résultat est une valeur de type NUMBER(18,5).

    Pour les arguments numériques de type chaîne qui ne sont pas des constantes, si NUMBER(18,5) n’est pas suffisant pour représenter la valeur numérique, vous devez convertir l’argument en un type qui peut représenter la valeur.

  • L’une ou l’autre expression peut inclure une instruction SELECT contenant des opérateurs Set, tels que UNION, INTERSECT, EXCEPT et MINUS. Lorsque vous utilisez des opérateurs Set, assurez-vous que les types de données sont compatibles. Pour plus d’informations, voir Notes générales sur l’utilisation dans la rubrique Définir les opérateurs.

Détails du classement

Renvoie

Renvoie le type de données de l’expression renvoyée.

Si les deux expressions sont NULL, renvoie NULL.

Exemples

Créer une table contenant les coordonnées des fournisseurs :

CREATE TABLE IF NOT EXISTS suppliers (
  supplier_id INT PRIMARY KEY,
  supplier_name VARCHAR(30),
  phone_region_1 VARCHAR(15),
  phone_region_2 VARCHAR(15));
Copy

La table contient le numéro de téléphone de chaque fournisseur dans deux régions différentes. Le numéro de téléphone peut être NULL pour une région.

Insérer des valeurs dans la table :

INSERT INTO suppliers(supplier_id, supplier_name, phone_region_1, phone_region_2)
  VALUES(1, 'Company_ABC', NULL, '555-01111'),
        (2, 'Company_DEF', '555-01222', NULL),
        (3, 'Company_HIJ', '555-01333', '555-01444'),
        (4, 'Company_KLM', NULL, NULL);
Copy

L’instruction SELECT suivante utilise la fonction IFNULL pour récupérer les valeurs phone_region_1 et phone_region_2.

Cet exemple montre les résultats suivants pour la fonction IFNULL :

  • La colonne IF_REGION_1_NULL contient la valeur de phone_region_1 ou, si cette valeur est NULL, la valeur de phone_region_2.

  • La colonne IF_REGION_2_NULL contient la valeur de phone_region_2 ou, si cette valeur est NULL, la valeur de phone_region_1.

  • Si phone_region_1 et phone_region_2 sont tous deux NULL, la fonction renvoie NULL.

SELECT supplier_id,
       supplier_name,
       phone_region_1,
       phone_region_2,
       IFNULL(phone_region_1, phone_region_2) IF_REGION_1_NULL,
       IFNULL(phone_region_2, phone_region_1) IF_REGION_2_NULL
  FROM suppliers
  ORDER BY supplier_id;
Copy
+-------------+---------------+----------------+----------------+------------------+------------------+
| SUPPLIER_ID | SUPPLIER_NAME | PHONE_REGION_1 | PHONE_REGION_2 | IF_REGION_1_NULL | IF_REGION_2_NULL |
|-------------+---------------+----------------+----------------+------------------+------------------|
|           1 | Company_ABC   | NULL           | 555-01111      | 555-01111        | 555-01111        |
|           2 | Company_DEF   | 555-01222      | NULL           | 555-01222        | 555-01222        |
|           3 | Company_HIJ   | 555-01333      | 555-01444      | 555-01333        | 555-01444        |
|           4 | Company_KLM   | NULL           | NULL           | NULL             | NULL             |
+-------------+---------------+----------------+----------------+------------------+------------------+