Aprende SQL · lección gratuita

Lección 08 · Lógica condicional: CASE y manejo de NULL

Resumen

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.

Sintaxis / Conceptos

CASE buscado vs. CASE simple

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: la ausencia de valor y su lógica de tres estados

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 y NULLIF

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

Ejemplos

-- 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 un LEFT JOIN usa COALESCE(valor, 0) o COALESCE(texto, 'N/D'). Y recuerda: WHERE col = NULL nunca encuentra nada; debe ser WHERE col IS NULL.

Cheatsheet

ConstrucciónQué hace
CASE WHEN c THEN v ... ELSE d ENDLógica condicional (if/else)
CASE col WHEN x THEN v ... ENDCompara una columna contra valores
col IS NULL / col IS NOT NULLComprueba 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 →

Ver todas las lecciones de Aprende SQL →