9.13. Expressões condicionais

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.

9.13.1. 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 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;

9.13.2. 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.

9.13.3. 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)') ...

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)

Notas

[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.

SourceForge.net Logo CSS válido!