Executando verificação de segurança...
6

💡 PostgreSQL: Null é Null

Recentemente precisei buscar em um banco de dados PostgreSQL os valores de uma tabela de compras onde o valor da coluna idempresaemitente deve ser diferente do valor da coluna idempresa.

Nessa tabela havia os seguintes registros.

imagem-registros-tabela-compras.JPG

No primeiro e no segundo registro o idempresa é diferente do idempresaemitente, então fiz a seguinte consulta SQL com a intenção de carregar esses registros.

SELECT * FROM compra WHERE idempresa != idempresaemitente;

E como resultado o SQL não retornou nenhum registro.

Isso acontece porque no SQL o null não é um valor comum e também não é vazio, ele é tratado de uma forma especial e não pode ser comparado com outros valores como inteiro, booleano ou string.

Sabendo que um campo com valor null não pode ser comparado com outros valores eu usei o COALESCE para fazer o tratamento desses valores.

A função COALESCE recebe dois parametros, o primeiro é o valor que ela vai validar, e o segundo é o valor que ela vai usar caso o primeiro valor seja null.

Minha consulta SQL final ficou assim.

SELECT * FROM compra WHERE idempresa != COALESCE(idempresaemitente, -1);

Assim tive como resultado os registros que eu esperava.

imagem-registros-tabela-compras-filtrados.JPG

É uma dica bem simples, mas espero que tenham gostado e que ajude de alguma forma ;)

Carregando publicação patrocinada...
2
1
1

Obrigado tashima42 ;)
Nas próximas eu vou fazer como você sugeriu, assim vou ter um pouco mais de controle e organização com as imagens.

1

Interessantíssimo edipo!! Eu passei por um sufoco para entender como que o Postgres entende o que é o null, tanto que até agora eu fiz uma implementação na qual eu não sei se realmente entendi o que fiz.

O que eu queria fazer era procurar por todas as linhas na tabela contents, onde o parent_id era null e não funcionava de jeito algum eu passar algo simples como:

select * from contents where parent_id = null;

Para eu ter algum resultado, eu preciso passar:

select * from contents where parent_id IS NOT DISTINCT FROM null;

Até agora eu não parei para pesquisar porque é assim.

2

Obrigado Filipe 😉
Pior que eu também não tinha visto esse código antes.
Nesse caso não daria de usar um código assim?

select * from contents where parent_id IS null;

1
1