Semántica de NULL
NULL significa desconocido, no cero ni cadena vacía. Las comparaciones producen NULL (desconocido). Usa IS NULL, IS NOT NULL e IS DISTINCT FROM para una igualdad segura.
Receta
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;Cuándo usar esto: Este patrón aparece en SQL de aplicaciones o informes que mantienes.
Ejemplo de Trabajo
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;Lo que esto demuestra:
- = NULL nunca es verdadero
- IS DISTINCT FROM trata dos NULL como iguales
- COALESCE elige el primer valor no NULL
Análisis Profundo
Cómo Funciona
- PostgreSQL analiza SQL en un árbol de consulta.
- El planificador estima los costos utilizando estadísticas.
- El ejecutor devuelve filas al protocolo del cliente.
Notas
- Prefiere SQL legible; los optimizadores reescriben internamente.
- Prueba con recuentos de filas similares a los de producción.
Trampas Comunes
- NOT IN subconsulta con NULL - El predicado completo se vuelve desconocido. Solución: Usa NOT EXISTS en su lugar.
- Restricciones UNIQUE - Se permiten múltiples NULL en UNIQUE estándar. Solución: Usa UNIQUE NULLS NOT DISTINCT en PG 15+ si es necesario.
- Diferencias en el conteo - count(*) vs count(col) - este último ignora los NULL. Solución: Elige intencionalmente en las métricas.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| ORM query builder | El equipo se estandariza en una pila | SQL complejo se vuelve opaco |
| Vista materializada | Repetir agregaciones costosas | Necesita estrategia de actualización |
| Réplica de almacén de datos | Escaneos pesados de BI | No para latencia OLTP |
Preguntas Frecuentes
¿Debo formatear SQL en cadenas de aplicación?
Usa cadenas de plantilla multilínea o archivos SQL; usa lint en CI.
¿Cuándo es DISTINCT suficiente?
Cuando necesitas filas únicas sin agregados.
¿ORDER BY perjudica a los índices?
El ordenamiento puede usar el orden del índice si la consulta coincide con las columnas del índice.
Relacionado
- Restricciones CHECK y UNIQUE - NULL en restricciones
- Agregados y GROUP BY - FILTER y nulos
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x y PostGIS 3.5+.