Expressões condicionais CASE, COALESCE e NULLIF

Esta seção descreve as expressões condicionais em conformidade com o SQL disponíveis no PostgreSQL.

CASE

A expressão CASE do SQL é uma expressão condicional genérica, semelhante às declarações if/else de outras linguagens.

CASE WHEN condição THEN resultado
    [WHEN ...]
    [ELSE resultado]
END

A cláusula CASE pode ser usada em qualquer lugar onde uma expressão for válida. A condição é uma expressão que retorna um resultado boolean. Se o resultado for verdade, então o valor da expressão CASE é o resultado que segue a condição. Se o resultado for falso, todas as cláusulas WHEN seguintes são analisadas da mesma maneira. Se o resultado de nenhuma condição WHEN for verdade, então o valor da expressão CASE é o valor do resultado na cláusula ELSE. Se a cláusula ELSE for omitida, e nenhuma condição for satisfeita, o resultado será nulo.

Exemplo:

SELECT * FROM tabela;

Resultado:

 a
---
 1
 2
 3

(3 registros)

Agora uma consulta usando CASE.

SELECT a,
    CASE WHEN a = 1 THEN 'um'
         WHEN a = 2 THEN 'dois'
         ELSE 'outro'
    END AS caso
FROM tabela;

Resultado:

 a | caso
---+-------
 1 | um
 2 | dois
 3 | outro

(3 registros)

Os tipos de dados de todas os resultados das expressões devem ser conversíveis em um único tipo de dado de saída.

A expressão CASE "simplificada", mostrada abaixo, é uma variante especializada da forma geral mostrada acima.

CASE expressão
    WHEN valor THEN resultado
    [WHEN ...]
    [ELSE resultado]
END

A expressão é computada e comparada com todas as especificações de valor nas cláusulas WHEN, até encontrar um que seja igual. Se não for encontrado nenhum valor igual, é retornado o resultado na cláusula ELSE (ou o valor nulo). Esta forma é semelhante à declaração switch da linguagem C.

O exemplo mostrado acima pode ser escrito utilizando a sintaxe simplificada da expressão CASE:

SELECT a,
    CASE a WHEN 1 THEN 'um'
           WHEN 2 THEN 'dois'
           ELSE 'outro'
    END AS caso
FROM tabela;

Resultado:

 a | caso
---+-------
 1 | um
 2 | dois
 3 | outro

(3 registros)

A expressão CASE não processa nenhuma subexpressão que não seja necessária para determinar o resultado. Por exemplo, esta é uma forma possível de evitar o erro gerado pela divisão por zero:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;


COALESCE

COALESCE(valor [, ...])

A função COALESCE retorna o primeiro de seus argumentos que não for nulo. Só retorna nulo quando todos os seus argumentos são nulos. Geralmente é útil para substituir o valor padrão quando este é o valor nulo, quando os dados são usados para exibição. Por exemplo:

SELECT coalesce(descrição, descrição_curta, '(nenhuma)') ...

Como a expressão CASE, a função COALESCE não processa os argumentos que não são necessários para determinar o resultado, ou seja, os argumentos à direita do primeiro argumento que não for nulo não são avaliados.


NULLIF

NULLIF(valor1, valor2)

A função NULLIF retorna o valor nulo se, e somente se, valor1 e valor2 forem iguais. Senão, retorna valor1. Pode ser utilizada para realizar a operação inversa do exemplo para COALESCE mostrado acima:

SELECT nullif(valor, '(nenhuma)') ...

Comentários