Esta seção descreve as expressões condicionais em conformidade com o SQL disponíveis no PostgreSQL.
Dica: Havendo alguma necessidade não atendida pelas funcionalidades destas expressões condicionais, deve ser considerado o desenvolvimento de um procedimento armazenado usando uma linguagem de programação com mais recursos.
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 teste; a --- 1 2 3 => SELECT a, -> CASE WHEN a=1 THEN 'um' -> WHEN a=2 THEN 'dois' -> ELSE 'outro' -> END AS caso -> FROM teste; a | caso ---+------- 1 | um 2 | dois 3 | outro
Os tipos de dado de todas as expressões resultado devem ser conversíveis em um único tipo de dado de saída. Consulte a Seção 10.5 para obter mais detalhes.
A expressão CASE "simplificada", mostrada abaixo, é uma variante especializada da forma geral mostrada acima [1] [2] :
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 teste; a | caso ---+------- 1 | um 2 | dois 3 | outro
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(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(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)') ...
Exemplo 9-15. Inserir nulo quando a cadeia de caracteres estiver vazia
Neste exemplo são utilizadas as funções NULLIF e TRIM para inserir o valor nulo na coluna da tabela quando a cadeia de caracteres passada como parâmetro para o comando INSERT preparado estiver vazia ou só contiver espaços. [3]
=> CREATE TEMPORARY TABLE t (c1 SERIAL PRIMARY KEY, c2 TEXT); => PREPARE inserir (TEXT) AS -> INSERT INTO t VALUES(DEFAULT, nullif(trim(' ' from $1),'')); => EXECUTE inserir('linha 1'); => EXECUTE inserir(''); => EXECUTE inserir(' '); => EXECUTE inserir(NULL); => \pset null (nulo) => SELECT * FROM t; c1 | c2 ----+--------- 1 | linha 1 2 | (nulo) 3 | (nulo) 4 | (nulo)
[1] |
SQL Server 2000 — Aceita tanto a forma geral quanto a forma simplificada da expressão CASE. (N. do T.) |
[2] |
Oracle 10g — Aceita tanto a forma geral quanto a forma simplificada da expressão CASE. (N. do T.) |
[3] |
Exemplo escrito pelo tradutor, não fazendo parte do manual original. |