CodeGym /Cursos /SQL SELF /Expresiones condicionales: CASE <expresión> ...

Expresiones condicionales: CASE <expresión> WHEN ... THEN ... ELSE ... END

SQL SELF
Nivel 10 , Lección 1
Disponible

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 valores value1, value2, etc.
  • THEN indica 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 = NULLno 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 → obtienes NULL si ningún valor coincide.
  • Comparas con NULL → no funciona, usa IS NULL y el CASE de búsqueda.
  • Comparas tipos incompatibles → por ejemplo, CASE grade WHEN '5' si grade es 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.

2
Tarea
SQL SELF, nivel 10, lección 1
Bloqueada
Asignación de descripciones textuales a las calificaciones
Asignación de descripciones textuales a las calificaciones
2
Tarea
SQL SELF, nivel 10, lección 1
Bloqueada
Comparación de categorías de productos
Comparación de categorías de productos
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION