Semântica NULL
NULL significa desconhecido, não zero ou string vazia. Comparações resultam em NULL (desconhecido). Use IS NULL, IS NOT NULL e IS DISTINCT FROM para igualdade segura.
Receita
SELECT * FROM app.customers WHERE phone IS NULL;
SELECT * FROM app.customers
WHERE status IS DISTINCT FROM 'active';
SELECT coalesce(phone, 'unknown') AS phone_display FROM app.customers;Quando usar isso: Este padrão aparece em SQL de aplicação ou relatórios que você mantém.
Exemplo de Trabalho
CREATE TABLE app.status_demo (a text, b text);
INSERT INTO app.status_demo VALUES ('x', NULL), (NULL, NULL);
SELECT a, b, (a = b) AS eq, (a IS NOT DISTINCT FROM b) AS not_distinct
FROM app.status_demo;O que isso demonstra:
- = NULL nunca é verdadeiro
- IS DISTINCT FROM trata dois NULLs como iguais
- COALESCE seleciona o primeiro não-NULL
Mergulho Profundo
Como Funciona
- O PostgreSQL analisa o SQL em uma árvore de consulta.
- O planejador estima os custos usando estatísticas.
- O executor retorna linhas para o protocolo do cliente.
Notas
- Prefira SQL legível; otimizadores reescrevem internamente.
- Teste com contagens de linhas semelhantes à produção.
Armadilhas
- NOT IN subquery com NULL - Todo o predicado se torna desconhecido. Correção: Use NOT EXISTS em vez disso.
- Restrições UNIQUE - Múltiplos NULLs permitidos em UNIQUE padrão. Correção: Use UNIQUE NULLS NOT DISTINCT no PG 15+ se necessário.
- Diferenças de contagem - count(*) vs count(col) - o último ignora NULLs. Correção: Escolha intencionalmente em métricas.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Construtor de consulta ORM | A equipe padroniza em uma única stack | SQL complexo se torna opaco |
| Visão materializada | Repetir agregações caras | Precisa de estratégia de atualização |
| Réplica de data warehouse | Varreduras pesadas de BI | Não para latência OLTP |
FAQs
Devo formatar SQL em strings de aplicação?
Use strings de template multilinhas ou arquivos SQL; use lint em CI.
Quando DISTINCT é suficiente?
Quando você precisa de linhas únicas sem agregações.
ORDER BY prejudica os índices?
A ordenação pode usar a ordem do índice se a consulta corresponder às colunas do índice.
Relacionado
- Restrições CHECK & UNIQUE - NULL em restrições
- Agregados & GROUP BY - FILTER e nulls
Versões da Stack: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.