Contenido de esta guía
Qué significa
NULLIF(valor1, valor2) devuelve NULL cuando ambos valores son iguales. Si son diferentes, devuelve valor1. Es una forma compacta de transformar un valor marcador —por ejemplo, cero— en ausencia de dato para un cálculo concreto.
Qué problema resuelve
Puede evitar que un valor especial participe en una agregación o convertir un denominador igual a cero en NULL. No modifica la tabla: solo cambia el valor producido por la expresión dentro de la consulta.
No lo confundas con COALESCE: NULLIF puede crear un NULL; COALESCE elige una alternativa cuando encuentra NULL.
Sintaxis básica
NULLIF(valor1, valor2)Su lógica se puede leer así: “si valor1 y valor2 son iguales, devuelve NULL; si no, conserva valor1”.
Ejemplo guiado
| nombre | stock |
|---|---|
| Ratón | 18 |
| Portátil Pro | 0 |
| Auriculares | 11 |
| Altavoz | 0 |
Queremos calcular el stock medio solo entre productos disponibles. Convertimos los ceros en NULL porque AVG ignora valores nulos:
SELECT ROUND(AVG(NULLIF(stock, 0)), 2) AS stock_medio_disponible
FROM productos;| stock_medio_disponible |
|---|
| 11.57 |
Cómo funciona
- Para un stock distinto de cero, NULLIF devuelve el valor original.
- Para un stock igual a cero, devuelve NULL.
AVGcalcula el promedio de los valores no nulos.ROUNDlimita la presentación a dos decimales.
Error frecuente
Usarlo sin justificar el significado
SELECT AVG(NULLIF(precio, 0)) FROM productos;Excluir precios iguales a cero solo es correcto si cero significa “dato no informado”. Si cero representa un producto gratuito, eliminarlo del promedio cambia la pregunta. Decide primero qué significa el valor en tus datos.
Comprueba lo aprendido
Evita un denominador igual a cero
Devuelve nombre y precio_por_unidad_stock para los productos con id 1 y 4. Divide precio entre NULLIF(stock, 0) y ordena por id.
Solución razonada
SELECT nombre,
precio / NULLIF(stock, 0) AS precio_por_unidad_stock
FROM productos
WHERE id IN (1, 4)
ORDER BY id;El Ratón produce un cociente numérico. El Portátil Pro produce NULL porque su stock es cero. Así la expresión no intenta representar una cantidad por unidad inexistente.
Cuenta pedidos no cancelados sin filtrar filas
Devuelve una única columna pedidos_no_cancelados usando COUNT y NULLIF. Convierte el estado 'cancelado' en NULL y no uses WHERE.
COUNT(expresión) no cuenta resultados NULL.NULLIF(estado, 'cancelado') produzca NULL solo en los pedidos cancelados.COUNT directamente sobre esa expresión y usa el alias pedido.Solución razonada
SELECT COUNT(NULLIF(estado, 'cancelado')) AS pedidos_no_cancelados
FROM pedidos;El resultado es 15. Hay 18 pedidos y 3 tienen estado cancelado; NULLIF convierte esos tres valores en NULL y COUNT ignora los NULL. Para reglas con varias condiciones, CASE suele ser más explícito.
Compatibilidad y tipos
NULLIF está ampliamente soportado. El tipo del resultado suele derivarse de la primera expresión, pero las conversiones implícitas y el tratamiento de una división entre cero pueden variar entre motores. Utiliza expresiones de tipos compatibles y prueba el comportamiento en el sistema real.
Qué debes recordar
- Devuelve NULL cuando las dos expresiones son iguales.
- Si son diferentes, conserva la primera expresión.
- No conviertas valores legítimos en NULL solo para obtener un resultado conveniente.
Conceptos relacionados
Fuentes técnicas consultadas
Se utilizaron para comprobar el comportamiento y el tipo de retorno. La explicación y los ejemplos son originales.