Categorias:

Funções de expressão condicional

IFNULL

Se expr1 for NULL, retorna expr2, caso contrário, retorna expr1.

Aliases:

NVL

Sintaxe

IFNULL( <expr1> , <expr2> )
Copy

Argumentos

expr1

Uma expressão geral.

expr2

Uma expressão geral.

Notas de uso

  • Snowflake performs implicit conversion of arguments to make them compatible. For example, if one of the input expressions is a numeric type, the return type is also a numeric type. That is, SELECT IFNULL('17', 1); first converts the VARCHAR value '17' to the NUMBER value 17, and then returns the first non-NULL value.

    When conversion isn’t possible, implicit conversion fails. For example, SELECT IFNULL('foo', 1); returns an error because the VARCHAR value 'foo' can’t be converted to a NUMBER value.

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

  • When implicit conversion converts a non-numeric value to a numeric value, the result is a value of type NUMBER(18,5).

    Para argumentos de cadeia de caracteres numérica que não sejam constantes, se NUMBER(18,5) não for suficiente para representar o valor numérico, então converta o argumento para um tipo que possa representar o valor.

  • Qualquer uma das expressões pode incluir uma instrução SELECT contendo operadores definidos, tais como UNION, INTERSECT, EXCEPT e MINUS. Ao utilizar os operadores do conjunto, certifique-se de que os tipos de dados sejam compatíveis. Para obter mais detalhes, consulte Notas de uso geral no tópico Operadores de conjuntos.

Detalhes do agrupamento

Retornos

Retorna o tipo de dados da expressão retornada.

Se ambas as expressões forem NULL, retorna NULL.

Exemplos

Crie uma tabela que contenha informações de contato dos fornecedores:

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

A tabela contém o número de telefone de cada fornecedor em duas regiões diferentes. O número de telefone pode ser NULL para uma região.

Insira valores na tabela:

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

A instrução SELECT a seguir usa a função IFNULL para recuperar os valores phone_region_1 e phone_region_2.

Este exemplo mostra os seguintes resultados para a função IFNULL:

  • A coluna IF_REGION_1_NULL contém o valor em phone_region_1 ou, se esse valor for NULL, o valor em phone_region_2.

  • A coluna IF_REGION_2_NULL contém o valor em phone_region_2 ou, se esse valor for NULL, o valor em phone_region_1.

  • Se phone_region_1 e phone_region_2 forem NULL, a função retornará 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             |
+-------------+---------------+----------------+----------------+------------------+------------------+