Aprende SQL · lección gratuita
CASE es el "if/else" de SQL: evalúa condiciones y devuelve un valor distinto según cuál se cumpla, permitiéndote crear columnas calculadas, categorías y métricas condicionales. Por su parte, NULL representa la ausencia de valor (desconocido) y se comporta de forma especial: no es igual a nada, ni siquiera a otro NULL. Funciones como COALESCE y NULLIF te ayudan a controlarlo. Como la semilla no tiene NULL, aquí los generamos con LEFT JOIN (filas sin coincidencia) y con NULLIF.
CASE buscado: CASE WHEN cond1 THEN v1 WHEN cond2 THEN v2 ELSE v3 END. Evalúa condiciones libres.CASE simple: CASE col WHEN val1 THEN v1 ... END. Compara una columna contra valores fijos.NULL: ausencia de dato. Se comprueba con IS NULL / IS NOT NULL, nunca con = NULL.COALESCE(a, b, ...): devuelve el primer argumento que no sea NULL (ideal para "valor por defecto").NULLIF(a, b): devuelve NULL si a = b, si no devuelve a (útil para evitar divisiones por cero).Hay dos formas. El CASE buscado evalúa una condición booleana completa en cada WHEN, así que admite rangos y operadores:
SELECT nombre, salario,
CASE
WHEN salario >= 9000 THEN 'Alto'
WHEN salario >= 5000 THEN 'Medio'
ELSE 'Bajo'
END AS rango_salarial
FROM empleados
ORDER BY salario DESC;
El CASE simple compara una sola columna contra valores concretos (solo igualdad):
SELECT id, estado,
CASE estado
WHEN 'Completado' THEN 'Cerrado OK'
WHEN 'Cancelado' THEN 'Perdido'
ELSE 'En curso'
END AS resultado
FROM pedidos
ORDER BY id;
Los WHEN se evalúan de arriba abajo y gana el primero que se cumple. Si ninguno coincide y no hay ELSE, el resultado es NULL.
NULL no es 0 ni cadena vacía: es "desconocido". Cualquier comparación con NULL (= NULL, <> NULL, salario > NULL) da UNKNOWN, no verdadero ni falso. Por eso la única forma correcta de comprobarlo es IS NULL / IS NOT NULL. Generamos NULL con un LEFT JOIN: los empleados que no aparecen como vendedores en pedidos quedan con columnas de pedido en NULL.
-- Empleados sin pedidos: el LEFT JOIN deja p.id en NULL
SELECT e.nombre, e.cargo, p.id AS pedido_id
FROM empleados e
LEFT JOIN pedidos p ON p.empleado_id = e.id
WHERE p.id IS NULL
ORDER BY e.nombre;
COALESCE sustituye NULL por un valor por defecto: muy usado para que un SUM/COUNT sobre filas inexistentes muestre 0 en vez de NULL. NULLIF(a, b) hace lo contrario, convierte a NULL cuando dos valores son iguales: su uso clásico es algo / NULLIF(divisor, 0) para que una división por cero devuelva NULL en lugar de error.
SELECT nombre, salario, CASE WHEN salario > 10000 THEN 'Senior' WHEN salario > 6000 THEN 'Mid' ELSE 'Junior' END AS nivel FROM empleados LIMIT 6
-- CASE buscado: clasificar empleados por salario
SELECT nombre, salario,
CASE
WHEN salario >= 9000 THEN 'Alto'
WHEN salario >= 5000 THEN 'Medio'
ELSE 'Bajo'
END AS rango_salarial
FROM empleados
ORDER BY salario DESC;
-- CASE dentro de agregado: contar completados por canal en una sola pasada
SELECT canal,
SUM(CASE WHEN estado = 'Completado' THEN 1 ELSE 0 END) AS completados,
COUNT(*) AS total
FROM pedidos
GROUP BY canal
ORDER BY canal;
-- NULL vía LEFT JOIN + COALESCE: pedidos por empleado (0 si no vendió nada)
SELECT e.nombre,
COALESCE(COUNT(p.id), 0) AS num_pedidos
FROM empleados e
LEFT JOIN pedidos p ON p.empleado_id = e.id
GROUP BY e.id, e.nombre
ORDER BY num_pedidos DESC, e.nombre;
-- Productos sin ventas (21-24): COALESCE convierte el SUM NULL en 0
SELECT p.nombre,
COALESCE(SUM(d.cantidad), 0) AS unidades_vendidas
FROM productos p
LEFT JOIN detalle_pedidos d ON d.producto_id = p.id
WHERE p.id BETWEEN 21 AND 24
GROUP BY p.id, p.nombre
ORDER BY p.nombre;
-- NULLIF: marca con NULL los productos cuyo precio iguala al costo (no hay ninguno → todos muestran el precio)
SELECT nombre, precio, costo,
NULLIF(precio, costo) AS precio_si_hay_margen
FROM productos
ORDER BY id
LIMIT 5;
💡 Para "rellenar huecos" de unLEFT JOINusaCOALESCE(valor, 0)oCOALESCE(texto, 'N/D'). Y recuerda:WHERE col = NULLnunca encuentra nada; debe serWHERE col IS NULL.
| Construcción | Qué hace |
|---|---|
CASE WHEN c THEN v ... ELSE d END | Lógica condicional (if/else) |
CASE col WHEN x THEN v ... END | Compara una columna contra valores |
col IS NULL / col IS NOT NULL | Comprueba ausencia de valor |
COALESCE(a, b, c) | Primer valor no nulo |
NULLIF(a, b) | NULL si a = b, si no a |
SUM(CASE WHEN c THEN 1 ELSE 0 END) | Conteo condicional |
---
← Búsqueda de texto: LIKE y patronesFunciones numéricas y de redondeo →