sexta-feira, 2 de maio de 2014

COALESCE: Trate decisões envolvendo campos nulos!

A função COALESCE permite que se selecione, entre dois ou mais parâmetros, o primeiro valor não nulo, retornando nulo caso todos os valores passados como parâmetro sejam nulos. É um recurso que pode ser utilizado para dar mais elegância ao tratamento de valores nulos e ao mesmo tempo reduzir o tamanho das consultas, tornando-as  mais fáceis de manter.

A sintaxe é bem simples, pois a função COALESCE recebe uma lista de valores como parâmetro, separados por vírgula.

Exemplo 1: Apenas um parâmetro fornecido

postgres=# SELECT COALESCE(1);
 coalesce
----------
        1
(1 registro)

Exemplo 2: Dois parâmetros fornecidos

postgres=# SELECT COALESCE(null,2);
 coalesce
----------
        2
(1 registro)

Exemplo 3: Três parâmetros fornecidos

postgres=# SELECT COALESCE(1,2,3);
 coalesce
----------
        1
(1 registro)

Exemplo 4: O primeiro parâmetro é nulo.

postgres=# SELECT COALESCE(null,2,3);
 coalesce
----------
        2
(1 registro)

Exemplo 5: Os dois primeiros parâmetros são nulos.

postgres=# SELECT COALESCE(null,null,3);
 coalesce
----------
        3
(1 registro)

Exemplo 6: Exemplo com cinco parâmetros e valor do tipo data.

postgres=# SELECT COALESCE(null, null, null, null, current_date);
  coalesce 
------------
 2014-05-02
(1 registro)

Exemplo 7: Exemplo utilizando campos de uma tabela como parâmetro.

postgres=# CREATE TEMP TABLE TBL_COA(campo1 INTEGER, campo2 INTEGER, campo3 INTEGER);
postgres=# INSERT INTO TBL_COA VALUES (null,1,2);
postgres=# INSERT INTO TBL_COA VALUES (null,null,2);
postgres=# INSERT INTO TBL_COA VALUES (null,null,null);

postgres=# SELECT COALESCE(campo1,campo2, campo3) FROM TBL_COA;
 coalesce
----------
        1
        2
        
(3 registros)

Exemplo 8: Implementação das condições do exemplo anterior utilizando a cláusula CASE. O plano de execução é o mesmo, mas o código fica bem mais complexo.
postgres=# SELECT
postgres-# CASE WHEN campo1 IS NOT NULL THEN campo1
postgres-# WHEN campo1 IS NULL AND campo2 IS NOT NULL THEN campo2
postgres-# WHEN campo1 IS NULL AND campo2 IS NULL AND campo3 IS NOT NULL THEN campo3
postgres-# ELSE null END AS simula_coalesce
postgres-# FROM TBL_COA;
 simula_coalesce
-----------------
               1
               2
               
(3 registros)

* Conclusões

- O uso de COALESCE pode tornar seu código mais enxuto e fácil de manter;

- Pode substituir a cláusula CASE no tratamento de valores NULOS, embora não haja ganho de desempenho.

Um comentário:

Anônimo disse...

Muito útil... obrigado! Vou seguir seu blog a partir de agora. Tem bastante dica boa! Parabéns!