quinta-feira, 8 de maio de 2014

O PostgreSQL Não Implementa o comando INSERT com a Cláusula SET

Você já utilizou a cláusula SET em um comando INSERT?  No postgresql, com certeza, não, pois a mesma não está implementada até a versão atual, a 9.3. Esta sintaxe pode ser descrita conforme aparece abaixo:
 

INSERT INTO nome_tabela SET coluna1 = expressão1, coluna2 = expressão2, .... ;
 
O fato é que esta sintaxe pouco acrescentaria em termos de valor. É pouco conhecida e pouco utilizada, embora eu acredite que esteja implementada em outros SGBDs. Sua funcionalidade seria idêntica à do comando INSERT já implementado, agregando possivelmente um pouco em termos de compatibilidade, embora não me recorde de ferramentas ou sistemas que utilizem esta sintaxe nas minhas andanças. 

Então porque estou comentando o fato do postgresql não implementar esta sintaxe?

Bom, justifico esta postagem por ter encontrado esta sintaxe em provas de concursos públicos, como nos exemplos abaixo. Não sei se a cláusula SET no INSERT faz parte do padrão ISO, mas não deixa de ser uma limitação, ainda que bem pequena.
 
Exemplos: 

Prova: FCC - 2012 - MPE-PE - Analista Ministerial - Informática
Disciplina: Banco de Dados | Assuntos: SQL;

Após a execução dos seguintes comandos SQL:

CREATE TABLE livros (id INT, nome TEXT);
INSERT INTO livros VALUES(1,'livro 1');
INSERT INTO livros (2,'livro 2');
INSERT INTO livros SET id=3,nome='livro 3';
SELECT id FROM livros;

O resultado da consulta para a coluna id será 
 
a) 3, apenas. b) 1, apenas. c) 1, 2 e 3. d) 2 e 3, apenas. e) 1 e 3, apenas.


Prova: FCC - 2012 - MPE-PE - Técnico Ministerial - Informática
Disciplina: Banco de Dados | Assuntos: SQL;

Analise os seguintes comandos em SQL:

CREATE TABLE nota (id INT PRIMARY KEY,data TEXT,valor REAL);
INSERT INTO nota SET id=1,data='01012012',valor=15.5;
INSERT INTO nota SET id=1,data='03022012',valor=11.5;
INSERT INTO nota SET id=2,data='01042012',valor=25.5;
INSERT INTO nota SET id=20,data='10062012',valor=12.5;
SELECT COUNT(*) FROM nota WHERE valor < 20;

O resultado para a consulta efetuada será: 
 
a) 12.5 b) 3 c) 11.5, 12.5 e 15.5 d) 2 e) 12.5 e 15.5
 
 

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.