CASE en SQL: qué es, cómo se usa y ejemplos prácticos

En SQL, la expresión CASE permite realizar comparaciones condicionales dentro de una consulta. Funciona de manera similar a las sentencias IF/ELSE en lenguajes de programación: evalúa condiciones y devuelve un valor dependiendo del resultado.

CASE es extremadamente útil cuando queremos transformar valores, clasificar datos o crear columnas calculadas directamente desde la consulta sin modificar los datos almacenados en la tabla.

¿Qué es CASE en SQL?

  • Es una expresión condicional que devuelve un valor.
  • Se puede usar en SELECT, WHERE, ORDER BY, GROUP BY y otras partes de la consulta.
  • Existen dos formas principales:
    1. CASE simple: compara un valor con una lista de posibles coincidencias.
    2. CASE buscado (searched CASE): evalúa condiciones lógicas más complejas.

Sintaxis de CASE

CASE simple

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

CASE buscado

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

👉 En ambos casos, ELSE es opcional. Si no se incluye y ninguna condición se cumple, devuelve NULL.

Ejemplos prácticos de CASE

1. Clasificar valores según condiciones

SELECT nombre,
       CASE 
         WHEN salario > 5000 THEN 'Alto'
         WHEN salario BETWEEN 3000 AND 5000 THEN 'Medio'
         ELSE 'Bajo'
       END AS rango_salarial
FROM empleados;

👉 Clasifica empleados en Alto, Medio o Bajo según su salario (con BETWEEN)

2. CASE simple con valores exactos

SELECT id_pedido,
       CASE estado
         WHEN 'P' THEN 'Pendiente'
         WHEN 'E' THEN 'Enviado'
         WHEN 'C' THEN 'Cancelado'
         ELSE 'Desconocido'
       END AS estado_legible
FROM pedidos;

👉 Traduce códigos de estado (P, E, C) a descripciones legibles.

3. Usar CASE en ORDER BY

SELECT nombre, tipo_cliente
FROM clientes
ORDER BY CASE tipo_cliente
           WHEN 'VIP' THEN 1
           WHEN 'Regular' THEN 2
           ELSE 3
         END;

👉 Ordena clientes priorizando a los VIP primero, luego Regulares, después el resto.

4. CASE en cláusulas WHERE

SELECT *
FROM empleados
WHERE CASE 
        WHEN departamento = 'Ventas' THEN salario
        ELSE 0
      END > 3000;

👉 Filtra empleados de ventas cuyo salario supere 3000. (Dependiendo del SGBD, puede ser más eficiente usar una condición directa, pero es válido.)

5. CASE combinado con funciones de agregación

SELECT 
  SUM(CASE WHEN genero = 'M' THEN 1 ELSE 0 END) AS hombres,
  SUM(CASE WHEN genero = 'F' THEN 1 ELSE 0 END) AS mujeres
FROM empleados;

👉 Cuenta cuántos hombres y mujeres hay (ejemplo de uso con SUM())

6. CASE en funciones de ventana

SELECT nombre, 
       salario,
       AVG(CASE WHEN departamento = 'IT' THEN salario END) 
         OVER () AS promedio_it
FROM empleados;

👉 Calcula el salario promedio de IT con AVG() y funciones de ventana.

Diferencias entre CASE simple y CASE buscado

  • CASE simple: evalúa igualdad contra un valor.
  • CASE buscado: permite condiciones complejas con operadores (>, <, BETWEEN, LIKE, etc.).

Ejemplo simple:

CASE estado
  WHEN 'A' THEN 'Activo'
  WHEN 'I' THEN 'Inactivo'
END

Ejemplo buscado:

CASE 
  WHEN salario > 5000 THEN 'Alto'
  WHEN salario <= 2000 THEN 'Bajo'
  ELSE 'Medio'
END

Usos más comunes de CASE

  1. Transformar códigos en descripciones legibles (ej.: 1 = Activo, 0 = Inactivo).
  2. Clasificar datos en rangos o categorías.
  3. Crear métricas personalizadas en reportes (ej.: sumar solo ventas mayores a 100).
  4. Ordenar resultados personalizados (ej.: priorizar ciertos clientes).
  5. Contar registros por condición dentro de la misma consulta.

Errores comunes con CASE

  1. Olvidar el END: cada CASE debe cerrarse con END.
  2. Confundirlo con IF: en SQL estándar no existe IF ... ELSE, se usa CASE.
  3. No usar ELSE cuando es necesario: puede devolver NULL inesperado.
  4. CASE mal anidado: al combinar varios CASE dentro de otro, hay que asegurarse de cerrar cada uno correctamente.
  5. Esperar que CASE modifique datos: para eso se usan sentencias como UPDATE.

Buenas prácticas al usar CASE

  • Usar alias claros en las columnas calculadas (AS rango, AS estado_legible).
  • Incluir ELSE para manejar casos no previstos.
  • Usar CASE buscado para mayor flexibilidad en condiciones.
  • Evitar expresiones demasiado largas dentro de CASE: dividir en subconsultas o vistas.
  • Documentar reglas de negocio dentro de la consulta para facilitar mantenimiento.

Ejemplo avanzado: reporte de ventas

SELECT vendedor_id,
       SUM(CASE WHEN total >= 1000 THEN total ELSE 0 END) AS ventas_grandes,
       SUM(CASE WHEN total < 1000 THEN total ELSE 0 END) AS ventas_pequeñas
FROM ventas
GROUP BY vendedor_id;

👉 Separa el monto vendido en ventas grandes y ventas pequeñas dentro de la misma consulta.

Preguntas frecuentes (FAQ)

1. ¿CASE puede reemplazar a IF en SQL?
Sí. En SQL estándar, CASE es la forma de manejar condicionales. Algunos motores tienen funciones específicas (IF, IIF, DECODE), pero CASE es más portable.

2. ¿Puedo usar múltiples CASE en la misma consulta?
Sí, se pueden usar tantos como necesites en SELECT, WHERE, ORDER BY, etc.

3. ¿CASE es compatible con todas las bases de datos?
Sí, forma parte del estándar SQL y funciona en MySQL, PostgreSQL, SQL Server, Oracle y otros.

4. ¿Qué devuelve CASE si ninguna condición se cumple?
Devuelve NULL, a menos que hayas definido un ELSE.

5. ¿CASE afecta la performance de la consulta?
Generalmente no de forma significativa, pero expresiones complejas dentro de CASE pueden ralentizar en tablas muy grandes.

Conclusión

El uso de CASE en SQL es esencial para realizar consultas más dinámicas y expresivas. Permite clasificar, transformar y calcular datos de forma flexible, sin necesidad de modificar la base de datos.

Dominarlo es clave para generar reportes personalizados, métricas complejas y consultas legibles. Con CASE, podés llevar tus habilidades en SQL a un nivel más profesional.

Explora el uso de CASE (incluye ejemplos con ventanas) en CASE y funciones de ventana y visita el Glosario SQL completo.

Scroll al inicio