Hoje vou demonstrar uma funcionalidade interessante que é nativa do PostgreSQL, o Nulls First e Nulss Last, com elas é possível realizar a ordenação de consultas demonstrando os registros que não possuem informações, ou seja, nulos, no início ou no fim do resultado.
Para trabalharmos melhor o exemplo, façamos:
1º – Criação da Tabela:
CREATE TABLE valores_nulos
(
id bigint NOT NULL,
nome character varying(20),
dt_nascimento date,
CONSTRAINT valores_nulos_pkey PRIMARY KEY (id )
)
WITH (
OIDS=FALSE
);
Vejam que as colunas nome e dt_nascimento aceitam valores nulos, ao invés da coluna id que possui a condição NOT NULL.
2º – Inserindo os registros:
Insert Into valores_nulos(id,nome,dt_nascimento)
Values(1,'PAPO SQL','2011-06-18')
,(2,'VALOR NULO 1',NULL)
,(3,'VALOR NULO 2',NULL)
,(4,'VALOR NULO 3','2012-01-01')
,(5,'VALOR NULO 4',NULL);
Acima, propositalmente inseri registros nulos na coluna dt_nascimento, então temos três registros sem data de nascimento na tabela valores_nulos.
3º – Vamos montar uma simples consulta para retornar os registros armazenados:
Select *
From valores_nulos; id nome dt_nascimento
1 PAPO SQL 18/06/2011
2 VALOR NULO 1 null
3 VALOR NULO 2 null
4 VALOR NULO 3 01/01/2012
5 VALOR NULO 4 null
Registrados temos VALOR NULO 1, 2 e 4 que não possuem data de nascimento.
4º – Agora vamos realizar uma ordenação simples nesta tabela (Order By):
Select *
From valores_nulos
Order By dt_nascimento;
id nome dt_nascimento
1 PAPO SQL 18/06/2011
4 VALOR NULO 3 01/01/2012
2 VALOR NULO 1
3 VALOR NULO 2
5 VALOR NULO 4
Curiosamente a consulta apresenta os registros que possuem data primeiro do que os registros que não possuem, isto porque, por padrão todo valor nulo é considerado maior, independente do valor dos demais.
Agora vamos aplicar a ordenação destes registros de forma a apresentar nulos primeiro, ou por último, isto vai depender de cada situação.
5º – Ordenando os registros nulos por último:
Select *
From valores_nulos
Order By dt_nascimento Nulls Last
id nome dt_nascimento
1 PAPO SQL 18/06/2011
4 VALOR NULO 3 01/01/2012
2 VALOR NULO 1
3 VALOR NULO 2
5 VALOR NULO 4
Vejam que, com o uso da função os registros nulos foram apresentados ao final dos resultados.
6º – Vejamos agora a ordenação dos registros nulos primeiro:
Select *
From valores_nulos
Order By dt_nascimento Nulls First
id nome dt_nascimento
2 VALOR NULO 1
3 VALOR NULO 2
5 VALOR NULO 4
1 PAPO SQL 18/06/2011
4 VALOR NULO 3 01/01/2012
Dica simples que pode ajudar e muito naquelas situações atípicas que somos submetidos no dia a dia.
Espero mais uma vez ter sido útil, um grande abraço e até a próxima.
Material de referência:
http://www.postgresql.org/docs/8.3/static/queries-order.html
http://www.bau-de-dev.com/banco-de-dados/postgresql/alterando-ordem-dos-valores-null-utilizando-nulls-first-e-nulls-last
