🙏 Realmente necesitamos su apoyo. Necesitamos financiamiento para continuar nuestra misión: publicar nuevas lecciones y mejorar la plataforma. Si puede, por favor apoye el proyecto con una donación. Ayude al proyecto ahora →
Código SQL copiado al portapapeles

Lección 3.5: Operador Condicional CASE WHEN ... THEN ... END en SQL

El operador CASE en SQL te permite agregar lógica condicional directamente dentro de una consulta. Puedes usarlo para asignar categorías, devolver etiquetas legibles, filtrar datos con reglas ramificadas y controlar la ordenación personalizada. Es una de las herramientas más prácticas cuando necesitas SQL más inteligente sin mover la lógica al código de la aplicación.

En esta lección, cubriremos:

  • cómo funciona CASE;
  • cómo usarlo en SELECT;
  • cómo aplicar CASE en WHERE;
  • cómo construir ordenación personalizada con CASE en ORDER BY.

Sintaxis de CASE

CASE tiene dos formas principales.

1) Forma simple (simple CASE)

CASE expresión
    WHEN valor1 THEN resultado1
    WHEN valor2 THEN resultado2
    ELSE resultado_por_defecto
END

Esta forma compara una expresión (expresión) con múltiples valores.

2) Forma buscada (searched CASE)

CASE
    WHEN condición1 THEN resultado1
    WHEN condición2 THEN resultado2
    ELSE resultado_por_defecto
END

Aquí, cada WHEN contiene una condición completa. Esta forma es más flexible y se usa más comúnmente.

Comportamiento importante:

  • las condiciones se evalúan de arriba hacia abajo;
  • se devuelve la primera rama WHEN que coincide;
  • si ninguna condición coincide, se utiliza ELSE;
  • si se omite ELSE, el resultado es NULL.

CASE en SELECT

El caso de uso más común es agregar una columna calculada con una categoría o etiqueta de estado.

Ejemplo: clasificar pagos

SELECT
    payment_id,
    amount,
    CASE
        WHEN amount < 2 THEN 'Pago bajo'
        WHEN amount BETWEEN 2 AND 6 THEN 'Pago medio'
        ELSE 'Pago alto'
    END AS nivel_pago
FROM payment
LIMIT 10;

Lo que hace esta consulta:

  • evalúa amount para cada fila en payment;
  • asigna una de tres categorías;
  • devuelve la categoría en una nueva columna llamada nivel_pago.

Ejemplo: estado de alquiler legible

SELECT
    rental_id,
    rental_date,
    return_date,
    CASE
        WHEN return_date IS NULL THEN 'No devuelto'
        ELSE 'Devuelto'
    END AS estado_alquiler
FROM rental
LIMIT 10;

Este enfoque es útil en informes y paneles donde los valores en bruto deben mostrarse como estados claros.

CASE en WHERE

Aunque CASE se usa más a menudo en SELECT, también se puede usar para filtrar. Esto es útil cuando las reglas de filtrado dependen de otra columna o necesitan umbrales específicos de rama.

Ejemplo: umbral de cantidad diferente por miembro del personal

SELECT
    payment_id,
    staff_id,
    amount
FROM payment
WHERE amount >= CASE
    WHEN staff_id = 1 THEN 5
    WHEN staff_id = 2 THEN 3
    ELSE 4
END;

Lógica de filtrado:

  • para staff_id = 1, solo se incluyen pagos con amount >= 5;
  • para staff_id = 2, solo se incluyen pagos con amount >= 3;
  • para todos los demás, el umbral es amount >= 4.

Cuándo una alternativa puede ser mejor

Para condiciones muy simples, OR puede ser más fácil de leer. Pero CASE en WHERE es útil cuando la lógica empresarial realmente se ramifica y debe permanecer en una expresión.

CASE en ORDER BY

Un requisito común es ordenar por prioridad empresarial en lugar de orden alfabético o numérico. CASE es ideal para eso.

Ejemplo: orden de clasificación personalizado para calificaciones de películas

SELECT
    title,
    rating
FROM film
ORDER BY CASE rating
    WHEN 'G' THEN 1
    WHEN 'PG' THEN 2
    WHEN 'PG-13' THEN 3
    WHEN 'R' THEN 4
    WHEN 'NC-17' THEN 5
    ELSE 6
END,
 title;

Resultado: las películas con calificaciones más ligeras aparecen primero, luego las calificaciones más estrictas, independientemente de la ordenación de cadenas por defecto.

Ejemplo: mostrar alquileres no devueltos primero

SELECT
    rental_id,
    rental_date,
    return_date
FROM rental
ORDER BY CASE
    WHEN return_date IS NULL THEN 0
    ELSE 1
END,
 rental_date DESC
LIMIT 20;

Esto te permite colocar los registros más importantes en la parte superior.

Uso Práctico

  1. Segmentación de clientes por gasto:

    SELECT
        customer_id,
        SUM(amount) AS total_gastado,
        CASE
            WHEN SUM(amount) < 50 THEN 'Básico'
            WHEN SUM(amount) < 100 THEN 'Activo'
            ELSE 'VIP'
        END AS segmento_cliente
    FROM payment
    GROUP BY customer_id;
    
  2. Contar filas por grupos condicionales:

    SELECT
        SUM(CASE WHEN amount < 2 THEN 1 ELSE 0 END) AS conteo_bajo,
        SUM(CASE WHEN amount BETWEEN 2 AND 6 THEN 1 ELSE 0 END) AS conteo_medio,
        SUM(CASE WHEN amount > 6 THEN 1 ELSE 0 END) AS conteo_alto
    FROM payment;
    
  3. Prioridad de informe personalizada:

    SELECT
        title,
        replacement_cost
    FROM film
    ORDER BY CASE
        WHEN replacement_cost >= 25 THEN 1
        WHEN replacement_cost >= 20 THEN 2
        ELSE 3
    END,
    replacement_cost DESC;
    

Conclusiones Clave de Esta Lección

CASE WHEN ... THEN ... END es una herramienta universal para la lógica condicional en SQL.

Puntos clave:

  • en SELECT, ayuda a construir categorías y estados;
  • en WHERE, apoya la lógica de filtrado ramificada;
  • en ORDER BY, ofrece control total sobre el orden de clasificación personalizado;
  • en la mayoría de los casos, incluye ELSE para evitar valores NULL inesperados.

Una vez que domines CASE, tus consultas SQL se volverán más flexibles, más legibles y más cercanas a la lógica empresarial real.