Categorias:

Funções de expressão condicional

CASE

Funciona como uma instrução em cascata “if-then-else”. Em uma forma mais geral, uma série de condições são avaliadas em sequência. Quando uma condição é avaliada como TRUE, a avaliação é parada e o resultado associado (após THEN) é retornado. Se nenhuma das condições forem avaliadas como TRUE, então o resultado após o opcional ELSE é retornado, se presente; caso contrário NULL é retornado.

Na segunda forma, “abreviada”, a expressão após CASE é comparada com cada uma das expressões WHEN em sequência, até que uma corresponda; então o resultado associado (após THEN) é retornado. Se nenhuma das expressões forem correspondentes, o resultado após o opcional ELSE é retornado, se presente; caso contrário NULL é retornado.

Observe que na segunda forma, uma expressão NULL CASE não corresponde a nenhuma das expressões WHEN, mesmo que uma das expressões WHEN seja também NULL.

Consulte também:

IFF

Sintaxe

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END
Copy

Argumentos

condition#

Na primeira forma de CASE, cada condição é uma expressão que deve ser avaliada com um valor BOOLEAN (True, False ou NULL).

expr

Uma expressão geral.

value

Na segunda forma de CASE, cada value é uma correspondência potencial para expr. value pode ser um literal ou uma expressão. value deve ser do mesmo tipo de dados que o expr ou deve ser um tipo de dados que possa ser convertido no tipo de dados do expr.

result#

Na primeira forma da cláusula CASE, se condition# for verdadeiro, então a função retorna o result# correspondente. Se mais de uma condição for verdadeira, então o resultado associado à primeira condição verdadeira é retornado.

Na segunda forma da instrução CASE, se value# corresponder a expr, então o result correspondente é retornado. Se mais de um value corresponder a expr, então o primeiro valor correspondente a result é retornado.

O resultado deve ser uma expressão que avalie como um único valor.

Em ambas as formas de CASE, se a cláusula opcional ELSE estiver presente, e se não forem encontradas correspondência, então a função retorna o resultado na cláusula ELSE. Se nenhuma cláusula ELSE estiver presente, e nenhuma correspondência for encontrada, então o resultado é NULL.

Notas de uso

  • Observe que, ao contrário de DECODE, um valor NULL na condição não corresponde a um valor NULL em outro lugar na condição. Por exemplo WHEN <null_expr> = NULL THEN 'Return me!' não retorna “Return me!” Se você quiser comparar com valores NULL, use IS NULL em vez de = NULL.

  • condition#, expr, value e result podem ser todos expressões gerais e, portanto, podem incluir subconsultas que incluem 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

Na primeira forma de CASE, cada expressão é independente, e as especificações de agrupamento em diferentes ramos são independentes. Por exemplo, a seguir, as especificações de agrupamento em condition1 são independentes da(s) especificação(ões) de agrupamento em condition2, e essas especificações de agrupamento não precisam ser idênticas ou mesmo compatíveis.

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
Copy

Na segunda forma de CASE, embora todas as operações relacionadas ao agrupamento devam utilizar especificações de agrupamento compatíveis, as especificações de agrupamento não precisam ser idênticas. Por exemplo, na seguinte instrução, as especificações de agrupamento de value1 e value2 devem ser compatíveis com a especificação de agrupamento de expr, mas as especificações de agrupamento de value1 e value2 não precisam ser idênticas entre si ou com a especificação de agrupamento de expr.

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  ...
Copy

O valor retornado da função tem o agrupamento de maior precedência dos argumentos THEN/ELSE.

Exemplos

Isso mostra um uso típico de CASE:

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
        ELSE 'other'
    END AS result
FROM (values(1),(2),(3)) v;
Copy

Saída:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+
Copy

Isso mostra que se nenhum dos valores corresponde, e não há nenhuma cláusula ELSE, então o valor retornado é NULL:

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
    END AS result
FROM (values(1),(2),(3)) v;
Copy

Saída:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+
Copy

Este exemplo trata NULL explicitamente.

SELECT
    column1,
    CASE 
        WHEN column1 = 1 THEN 'one'
        WHEN column1 = 2 THEN 'two'
        WHEN column1 IS NULL THEN 'NULL'
        ELSE 'other'
    END AS result
FROM VALUES (1), (2), (NULL);
Copy

Saída:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+
Copy

O exemplo a seguir combina CASE com o agrupamento:

SELECT CASE COLLATE('m', 'upper')
    WHEN 'M' THEN TRUE
    ELSE FALSE
END;
+----------------------------+
| CASE COLLATE('M', 'UPPER') |
|     WHEN 'M' THEN TRUE     |
|     ELSE FALSE             |
| END                        |
|----------------------------|
| True                       |
+----------------------------+
SELECT CASE 'm'
    WHEN COLLATE('M', 'lower') THEN TRUE
    ELSE FALSE
END;
+------------------------------------------+
| CASE 'M'                                 |
|     WHEN COLLATE('M', 'LOWER') THEN TRUE |
|     ELSE FALSE                           |
| END                                      |
|------------------------------------------|
| True                                     |
+------------------------------------------+
Copy