- Categorias:
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:
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
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
, cadavalue
é uma correspondência potencial paraexpr
.value
pode ser um literal ou uma expressão.value
deve ser do mesmo tipo de dados que oexpr
ou deve ser um tipo de dados que possa ser convertido no tipo de dados doexpr
.result#
Na primeira forma da cláusula
CASE
, secondition#
for verdadeiro, então a função retorna oresult#
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
, sevalue#
corresponder aexpr
, então oresult
correspondente é retornado. Se mais de umvalue
corresponder aexpr
, então o primeiro valor correspondente aresult
é retornado.O resultado deve ser uma expressão que avalie como um único valor.
Em ambas as formas de
CASE
, se a cláusula opcionalELSE
estiver presente, e se não forem encontradas correspondência, então a função retorna o resultado na cláusulaELSE
. Se nenhuma cláusulaELSE
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, useIS NULL
em vez de= NULL
.condition#
,expr
,value
eresult
podem ser todos expressões gerais e, portanto, podem incluir subconsultas que incluem operadores definidos, tais comoUNION
,INTERSECT
,EXCEPT
eMINUS
. 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> ]
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> ] ...
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;Saída:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | 3 | other | +---------+--------+
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;Saída:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | 3 | NULL | +---------+--------+
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);Saída:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | NULL | NULL | +---------+--------+
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 | +------------------------------------------+