La sentencia CASE de SQL es tu herramienta para agregar logica condicional a las consultas. Te permite transformar datos, crear categorias y construir salidas dinamicas basadas en condiciones, todo dentro de tu SQL. Ya sea que estes construyendo reportes, limpiando datos o creando columnas derivadas, CASE es esencial.
A lo largo de esta guia, encontraras ejercicios interactivos de SQL que te permiten practicar sentencias CASE en tu navegador, sin necesidad de configurar una base de datos. Escribe consultas, obtiene retroalimentacion instantanea y verifica si tus resultados coinciden con la salida esperada.
Que es la Sentencia CASE?
CASE es la forma de SQL de implementar logica if-then-else. Evalua condiciones y devuelve diferentes valores segun cual condicion sea verdadera. Piensa en ella como una sentencia switch que funciona directamente en tus consultas.
Hay dos formas de la sentencia CASE:
CASE buscado (mas comun):
CASE
WHEN condicion1 THEN resultado1
WHEN condicion2 THEN resultado2
ELSE resultado_default
END
CASE simple (para coincidencias exactas):
CASE expresion
WHEN valor1 THEN resultado1
WHEN valor2 THEN resultado2
ELSE resultado_default
END
CASE Basico: Creando Categorias
El uso mas comun de CASE es transformar valores en categorias. Imagina que tienes una tabla de ventas y quieres etiquetar pedidos por tamano:
SELECT
order_id,
amount,
CASE
WHEN amount < 100 THEN 'Pequeno'
WHEN amount < 500 THEN 'Mediano'
ELSE 'Grande'
END as order_size
FROM orders;
Esta consulta evalua cada fila:
- Si amount es menor a 100, devuelve ‘Pequeno’
- Si amount es menor a 500 (pero no menor a 100), devuelve ‘Mediano’
- De lo contrario, devuelve ‘Grande’
La clausula ELSE es opcional pero recomendada. Sin ella, las condiciones no coincidentes devuelven NULL.
Pruebalo tu mismo:
[[ testData.title ]]
Consulta la tabla products para devolver product_name, price y una columna price_tier. El nivel debe ser ‘Budget’ para precios menores a 50, ‘Standard’ para precios de 50-199, y ‘Premium’ para precios de 200 o mas.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tablas Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
CASE Simple para Coincidencia de Valores Exactos
Cuando estas comparando contra valores especificos en lugar de rangos, la sintaxis CASE simple es mas limpia. Compara una expresion contra multiples valores posibles:
SELECT
product_id,
status,
CASE status
WHEN 'A' THEN 'Activo'
WHEN 'D' THEN 'Descontinuado'
WHEN 'P' THEN 'Pendiente'
ELSE 'Desconocido'
END as status_label
FROM products;
Esto es equivalente a escribir:
CASE
WHEN status = 'A' THEN 'Activo'
WHEN status = 'D' THEN 'Descontinuado'
-- etc.
END
Usa CASE simple cuando estes haciendo comparaciones de igualdad contra una sola columna o expresion. Usa CASE buscado cuando necesites condiciones mas complejas.
Pruebalo tu mismo:
[[ testData.title ]]
Consulta la tabla employees para devolver name, department y department_full_name. Mapea los codigos de departamento a nombres completos: ‘ENG’ a ‘Engineering’, ‘MKT’ a ‘Marketing’, ‘HR’ a ‘Human Resources’. Usa ‘Other’ para codigos no coincidentes.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tablas Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
CASE Dentro de Funciones de Agregacion
Un patron poderoso es usar CASE dentro de funciones de agregacion para contar o sumar condicionalmente. Esto a veces se llama “agregacion condicional”:
SELECT
COUNT(*) as total_clientes,
COUNT(CASE WHEN status = 'activo' THEN 1 END) as clientes_activos,
SUM(CASE WHEN country = 'MX' THEN revenue ELSE 0 END) as ingresos_mx
FROM customers;
Como funciona:
-
COUNT(CASE WHEN ... THEN 1 END)solo cuenta filas donde la condicion es verdadera (los valores NULL son ignorados por COUNT) -
SUM(CASE WHEN ... THEN valor ELSE 0 END)suma valores solo para filas coincidentes
Esta tecnica es increiblemente util para crear reportes resumidos con multiples desgloses en una sola consulta.
Pruebalo tu mismo:
[[ testData.title ]]
Consulta la tabla orders para contar pedidos por estado. Devuelve total_orders, completed_count (pedidos con estado ‘completed’), y pending_count (pedidos con estado ‘pending’ o ‘processing’).
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tablas Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
Manejando Valores NULL con CASE
NULL requiere atencion especial en sentencias CASE. No puedes comparar NULL usando =; debes usar IS NULL o IS NOT NULL:
SELECT
customer_name,
CASE
WHEN email IS NOT NULL THEN email
WHEN phone IS NOT NULL THEN phone
ELSE 'Sin info de contacto'
END as contacto_principal
FROM customers;
Patrones comunes para manejo de NULL:
CASE
WHEN value IS NULL THEN 'Faltante'
WHEN value = '' THEN 'Vacio'
ELSE value
END
Para reemplazo simple de NULL, COALESCE es a menudo mas limpio que CASE. Pero CASE te da mas flexibilidad cuando necesitas manejar multiples condiciones.
Pruebalo tu mismo:
[[ testData.title ]]
Consulta la tabla contacts para devolver name y contact_status. El estado debe ser ‘Has Email’ si email no es NULL, ‘Has Phone’ si email es NULL pero phone no es NULL, y ‘No Contact’ si ambos son NULL.
[[ col ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.your_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ i18n.expected_results ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ error ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
[[ testData.solution ]]
Tablas Disponibles
[[ table.name ]]
| [[ col ]] |
|---|
| [[ formatCell(cell) ]] |
CASE en ORDER BY
Puedes usar CASE para crear ordenes de clasificacion personalizados:
SELECT product_name, category
FROM products
ORDER BY
CASE category
WHEN 'Destacado' THEN 1
WHEN 'Nuevo' THEN 2
WHEN 'Oferta' THEN 3
ELSE 4
END,
product_name;
Esto ordena productos con ‘Destacado’ primero, luego ‘Nuevo’, luego ‘Oferta’, con todo lo demas al final. Dentro de cada categoria, los productos se ordenan por nombre.
CASE en Clausulas WHERE
Aunque puedes usar CASE en clausulas WHERE, a menudo no es el mejor enfoque:
SELECT * FROM orders
WHERE
CASE
WHEN @incluir_cancelados = 1 THEN 1
ELSE status != 'cancelado'
END = 1;
Usualmente, usar logica OR/AND es mas claro y tiene mejor rendimiento:
SELECT * FROM orders
WHERE @incluir_cancelados = 1 OR status != 'cancelado';
Sentencias CASE Anidadas
Las sentencias CASE pueden anidarse para logica compleja:
SELECT
product_name,
CASE category
WHEN 'Electronica' THEN
CASE
WHEN price > 1000 THEN 'Electronica Premium'
ELSE 'Electronica Estandar'
END
WHEN 'Ropa' THEN
CASE
WHEN price > 200 THEN 'Ropa de Disenador'
ELSE 'Ropa Regular'
END
ELSE 'Otros Productos'
END as product_class
FROM products;
Aunque CASE anidado funciona, las sentencias profundamente anidadas se vuelven dificiles de leer. Considera reestructurar tu consulta o usar una tabla de busqueda si el anidamiento se vuelve muy profundo.
Consideraciones de Rendimiento
Las sentencias CASE son generalmente eficientes, pero ten en cuenta estos consejos:
Evalua condiciones en orden: SQL evalua las clausulas WHEN de arriba a abajo y se detiene en la primera coincidencia. Pon las condiciones mas comunes primero:
CASE
WHEN status = 'activo' THEN 'Activo' -- Mas comun, verificar primero
WHEN status = 'pendiente' THEN 'Pendiente' -- Menos comun
WHEN status = 'archivado' THEN 'Archivado' -- Raro
ELSE 'Desconocido'
END
Evita operaciones costosas en CASE: Cada condicion podria ser evaluada, asi que evita subconsultas o calculos complejos dentro de CASE cuando sea posible.
Uso de indices: Las sentencias CASE en clausulas WHERE pueden prevenir el uso de indices. Si el rendimiento importa, reestructura para usar condiciones simples que puedan aprovechar los indices.
Ejemplos del Mundo Real
Visualizacion de Estado
Transforma codigos de base de datos en etiquetas amigables para el usuario:
SELECT
order_id,
CASE status
WHEN 'P' THEN 'Pendiente'
WHEN 'S' THEN 'Enviado'
WHEN 'D' THEN 'Entregado'
WHEN 'C' THEN 'Cancelado'
WHEN 'R' THEN 'Devuelto'
ELSE 'Desconocido'
END as status_display
FROM orders;
Calculos Dinamicos
Aplica diferentes tasas de descuento basadas en el nivel del cliente:
SELECT
customer_name,
order_total,
CASE tier
WHEN 'oro' THEN order_total * 0.15
WHEN 'plata' THEN order_total * 0.10
WHEN 'bronce' THEN order_total * 0.05
ELSE 0
END as monto_descuento
FROM customers c
JOIN orders o ON c.id = o.customer_id;
Reportes Estilo Pivot
Crea resumenes columnares a partir de datos en filas:
SELECT
product_category,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 1 THEN amount ELSE 0 END) as ventas_enero,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 2 THEN amount ELSE 0 END) as ventas_febrero,
SUM(CASE WHEN EXTRACT(MONTH FROM sale_date) = 3 THEN amount ELSE 0 END) as ventas_marzo
FROM sales
GROUP BY product_category;
CASE vs COALESCE vs NULLIF
Elige la herramienta correcta para el trabajo:
| Funcion | Usar Cuando |
|---|---|
| CASE | Logica condicional compleja, multiples condiciones, comparaciones no-NULL |
| COALESCE | Reemplazo simple de NULL con valores de respaldo |
| NULLIF | Convertir valores especificos a NULL |
Comparacion de ejemplo:
COALESCE(apodo, nombre)
CASE
WHEN apodo IS NOT NULL THEN apodo
ELSE nombre
END
Ambos hacen lo mismo, pero COALESCE es mas limpio para este caso de uso.
Trabajando con CASE en Beekeeper Studio
Escribir sentencias CASE complejas es mas facil con las herramientas correctas. Beekeeper Studio proporciona:
- Resaltado de sintaxis: Hace que las palabras clave CASE/WHEN/THEN/ELSE sean faciles de identificar
- Formateo de consultas: Formatea automaticamente sentencias CASE anidadas para legibilidad
- Autocompletado: Sugiere nombres de columnas mientras escribes condiciones
- Comparacion de resultados: Muestra claramente los valores transformados junto a los datos originales
- Soporte multi-base de datos: La sintaxis CASE funciona en PostgreSQL, MySQL, SQLite, SQL Server y mas
La version gratuita incluye todo lo que necesitas para escribir y probar expresiones CASE complejas efectivamente.
Puntos Clave
La sentencia CASE de SQL es esencial para logica condicional en tus consultas:
- Existen dos formas: CASE buscado (con condiciones) y CASE simple (para coincidencias exactas)
- ELSE es opcional pero recomendado para manejar condiciones no coincidentes
- Las condiciones se evaluan de arriba a abajo; la primera coincidencia gana
- NULL requiere manejo especial con IS NULL / IS NOT NULL
- Funciona en SELECT, ORDER BY, WHERE y dentro de funciones de agregacion
- La agregacion condicional (CASE dentro de COUNT/SUM) es poderosa para reportes
- Mantiene el anidamiento al minimo para codigo mantenible
- Usa COALESCE para manejo simple de NULL en lugar de CASE
Domina las sentencias CASE y desbloquearas la capacidad de transformar, categorizar y analizar datos directamente en tus consultas SQL sin necesidad de post-procesamiento en codigo de aplicacion.
Listo para practicar mas? Prueba los ejemplos interactivos de arriba, o explora otros tutoriales de SQL para continuar desarrollando tus habilidades de bases de datos.
Beekeeper Studio Es Una GUI de Base de Datos Gratuita y de Código Abierto
La mejor herramienta de consultas y editor SQL que he usado. Proporciona todo lo que necesito para gestionar mi base de datos. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio es rápido, intuitivo y fácil de usar. Beekeeper soporta muchas bases de datos y funciona muy bien en Windows, Mac y Linux.
Lo Que Dicen Los Usuarios Sobre Beekeeper Studio
"Beekeeper Studio reemplazó por completo mi antiguo flujo de trabajo con SQL. Es rápido, intuitivo y hace que trabajar con bases de datos sea agradable de nuevo."
"He probado muchas GUIs de bases de datos, pero Beekeeper logra el equilibrio perfecto entre características y simplicidad. Simplemente funciona."