Si ya conoces CASE, sabes cómo meter lógica directamente en la consulta. Pero no todo el mundo sabe que CASE tiene dos formas. Si CASE WHEN ... es como un if-else, entonces el CASE simple es como el switch-case de otros lenguajes: compara una expresión con varios valores y ejecuta el bloque correspondiente.
Se ve más compacto e intuitivo cuando comparas un solo campo con valores fijos.
Sintaxis de un CASE simple
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
Es fácil:
expression— es la expresión o campo que se compara con los valoresvalue1,value2, etc.THENindica qué devolver si hay coincidencia.ELSE— qué devolver si nada coincide (puedes omitirlo, pero mejor no lo hagas).
Ejemplo: Notas de estudiantes
Imagina una tabla students con una columna grade que contiene un número entero del 2 al 5. Queremos mostrar la interpretación en texto de las notas.
SELECT
name,
grade,
CASE grade
WHEN 5 THEN 'Excelente'
WHEN 4 THEN 'Bien'
WHEN 3 THEN 'Suficiente'
WHEN 2 THEN 'Insuficiente'
ELSE 'Desconocido'
END AS nota_en_palabras
FROM students;
Aquí CASE compara el valor del campo grade con los valores fijos 2, 3, 4, 5.
Ejemplo: Categorías de productos por código
En la tabla products hay un campo category_code donde se guardan etiquetas cortas: 'el', 'frn', 'bks', etc. Queremos mostrar el nombre legible de la categoría.
SELECT
product_name,
category_code,
CASE category_code
WHEN 'el' THEN 'Electrónica'
WHEN 'frn' THEN 'Muebles'
WHEN 'bks' THEN 'Libros'
ELSE 'Otro'
END AS category_name
FROM products;
Este truco es especialmente útil cuando necesitas mostrar texto "humano" en vez de un código.
Ejemplo: Nombres de los meses
A veces quieres mostrar los nombres de los meses en texto según el número:
SELECT
EXTRACT(MONTH FROM order_date) AS month_number,
CASE EXTRACT(MONTH FROM order_date)
WHEN 1 THEN 'Enero'
WHEN 2 THEN 'Febrero'
WHEN 3 THEN 'Marzo'
WHEN 4 THEN 'Abril'
WHEN 5 THEN 'Mayo'
WHEN 6 THEN 'Junio'
WHEN 7 THEN 'Julio'
WHEN 8 THEN 'Agosto'
WHEN 9 THEN 'Septiembre'
WHEN 10 THEN 'Octubre'
WHEN 11 THEN 'Noviembre'
WHEN 12 THEN 'Diciembre'
ELSE 'Desconocido'
END AS month_name
FROM orders;
Aquí el CASE simple hace comprensible lo que de otra forma serían solo números del 1 al 12.
Trabajando con NULL en un CASE simple
Es importante entender que si el valor se compara con NULL, el resultado será NULL, porque NULL = NULL — no es verdadero, sino desconocido.
Ejemplo con NULL:
SELECT
user_id,
status,
CASE status
WHEN 'active' THEN 'Activo'
WHEN 'blocked' THEN 'Bloqueado'
WHEN NULL THEN 'Sin estado' -- ¡no funcionará!
ELSE 'Desconocido'
END AS estado_usuario
FROM users;
En vez de WHEN NULL deberías usar ELSE, o simplemente aplicar el CASE de búsqueda (que vimos en la lección anterior):
CASE
WHEN status IS NULL THEN 'Sin estado'
...
Comparación con el CASE de búsqueda
| Característica | CASE simple | CASE de búsqueda |
|---|---|---|
| Comparación con valores concretos | ✅ Cómodo | ❌ No sirve |
| Flexibilidad de condiciones (>, IS NULL) | ❌ No se puede | ✅ Se puede |
| Análogo en programación | switch-case |
if-else |
Casos prácticos
Ejemplo: Visualización del estado de una solicitud
| request_id | status |
|---|---|
| 101 | new |
| 102 | in_progress |
| 103 | done |
| 104 | cancelled |
| 105 | NULL |
SELECT
request_id,
CASE status
WHEN 'new' THEN '🟡 Nueva'
WHEN 'in_progress' THEN '🔵 En proceso'
WHEN 'done' THEN '🟢 Finalizada'
ELSE '⚪ Desconocido'
END AS status_label
FROM requests;
| request_id | status_label |
|---|---|
| 101 | 🟡 Nueva |
| 102 | 🔵 En proceso |
| 103 | 🟢 Finalizada |
| 104 | ⚪ Desconocido |
| 105 | ⚪ Desconocido |
Aquí CASE actúa como traductor: convierte estados técnicos en etiquetas comprensibles (y hasta simpáticas). Y si el estado es desconocido o NULL — el usuario verá ⚪ «Desconocido».
Ejemplo: Agrupación por categorías para un informe
| employee_id | name | department |
|---|---|---|
| 1 | Alex Lin | HR |
| 2 | Maria Chi | IT |
| 3 | Anna Song | IT |
| 4 | Otto Art | FIN |
| 5 | Jane Doe | HR |
| 6 | Max Gray | SALES |
| 7 | Zoe Black | IT |
| 8 | Tom Brown | FIN |
| 9 | Liam Park | NULL |
| 10 | Eva Gold | HR |
SELECT
CASE department
WHEN 'HR' THEN 'Recursos Humanos'
WHEN 'IT' THEN 'Tecnología'
WHEN 'FIN' THEN 'Finanzas'
ELSE 'Otro'
END AS dept_name,
COUNT(*) AS staff_count
FROM employees
GROUP BY
CASE department
WHEN 'HR' THEN 'Recursos Humanos'
WHEN 'IT' THEN 'Tecnología'
WHEN 'FIN' THEN 'Finanzas'
ELSE 'Otro'
END;
Resultado:
| dept_name | staff_count |
|---|---|
| Recursos Humanos | 3 |
| Tecnología | 3 |
| Finanzas | 2 |
| Otro | 2 |
¿Qué pasa aquí?
- Los empleados del departamento HR van a la categoría Recursos Humanos.
- IT — es Tecnología.
- FIN — es Finanzas.
- Todo lo demás, incluyendo SALES y NULL, va a Otro. Este enfoque es genial para crear informes amigables y claros.
Errores comunes
- Olvidaste
ELSE→ obtienesNULLsi ningún valor coincide. - Comparas con
NULL→ no funciona, usaIS NULLy elCASEde búsqueda. - Comparas tipos incompatibles → por ejemplo,
CASE grade WHEN '5'sigradees numérico.
El CASE simple es tu herramienta cuando necesitas comparar un valor con un conjunto de posibles. Es compacto, legible y especialmente útil para clasificación de texto, visualización, conversión de códigos y agrupación cómoda.
Si necesitas comprobar rangos, NULL o condiciones más complejas — usa el CASE de búsqueda. A SQL le gusta la claridad. Y CASE es tu herramienta para darle forma a esa claridad.
GO TO FULL VERSION