Aprende leyendo en orden

Funciones ⑤ — CASE para ramificación de varias condiciones

El quinto artículo sobre funciones SQL. Las dos formas de CASE (forma simple y forma con búsqueda), ramificaciones de tres o más, su combinación con funciones y condiciones compuestas, y su uso junto a ORDER BY — usando datos staff cargados desde CSV.

Datos usados en este artículo — la tabla staff

El IIF que vimos en el artículo anterior tenía solo una condición, así que solo podía hacer una ramificación verdadero/falso de dos vías. La expresión CASE de este artículo evalúa tres o más condiciones en orden y puede devolver un valor distinto para cada una. Es la sintaxis básica para escribir un "if-elseif-else" dentro de SQL, y es la construcción de ramificación más común en el trabajo real — categorización en informes, agrupación por región, ranking por nivel, etc.

El sujeto es la misma tabla staff (10 filas) que antes. Con ejercicios que construyen una clasificación por región sobre la columna city, una clasificación por franja salarial sobre salary y una clasificación por generación sobre birthday, probarás las dos formas de CASE y su aplicación a condiciones compuestas en orden.

Antes de los ejercicios, confirmemos las definiciones de columnas y una muestra de datos de la tabla staff.

① Usa PRAGMA table_info(staff); para revisar los nombres de columna, los tipos y la clave primaria.

② Usa SELECT * FROM staff LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

CASE tiene dos formas de escribirse

La expresión CASE tiene dos formas — la forma simple y la forma con búsqueda — y ambas pueden producir el mismo resultado. Dos reglas son comunes a ambas.

  • El `END` final es obligatorio — olvidarlo es un error de sintaxis.
  • `ELSE` es opcional — si se omite, las filas que no coinciden con ningún WHEN se vuelven NULL. Para evitar NULL, indica un valor por defecto explícito con ELSE.

Forma ① Forma simple — comparación de igualdad sobre una columna

La forma simple se escribe CASE columna WHEN valor1 THEN resultado1 WHEN valor2 THEN resultado2 ... ELSE defecto END. Justo después de CASE colocas una columna a comparar, y a la derecha de WHEN escribes un valor con el que probar la igualdad de la columna. La prueba es solo de igualdad (`=`), y puedes escribir un único valor a la derecha de WHEN — no se permiten varios valores como WHEN ('Tokyo', 'Osaka'). Se ajusta a una sustitución simple columna = valor y es más corta de escribir.

Ramificación en la forma simple
columna objetivovalor WHENvalor devueltoCASE city= 'Tokyo'= 'Osaka'ELSE'TOK''OSA'city original
CASE city mira una columna y hace una comparación de igualdad con cada valor WHEN. Se devuelve el valor THEN del WHEN que coincide; si ninguno coincide, se usa el valor ELSE.
-- Forma simple — reemplaza city por un nombre de región
SELECT name, city,
  CASE city
    WHEN 'Tokyo' THEN 'Kanto'
    WHEN 'Yokohama' THEN 'Kanto'
    WHEN 'Osaka' THEN 'Kansai'
    WHEN 'Kyoto' THEN 'Kansai'
    ELSE 'Other'
  END AS region
FROM staff;

Imagina el requisito "mostrar la columna city como un código corto". (La explicación aparece cuando lo ejecutas correctamente).

① De la tabla staff, toma name y city.

② Usando la forma CASE simple, añade una 3.ª columna con el alias city_code que sea 'TOK' si city es Tokyo, 'OSA' si es Osaka, 'KYO' si es Kyoto, 'YOK' si es Yokohama, 'SAP' si es Sapporo, y el valor original de city si ninguno coincide.

Editor SQL

Ejecutar una consulta para ver el resultado

Forma ② Forma con búsqueda — escribe cualquier condición libremente

La forma con búsqueda se escribe CASE WHEN expr1 THEN resultado1 WHEN expr2 THEN resultado2 ... ELSE defecto END. Justo después de CASE no escribes nada, y a la derecha de cada WHEN pones la condición en sí. Operadores de comparación como salary >= 6000000, LIKE como name LIKE '%Tanaka', IN, y condiciones compuestas con AND / OR — todo lo que puedas escribir en WHERE funciona aquí. WHEN se evalúa de arriba abajo, y el valor lo decide la primera rama que se vuelve TRUE. Por su expresividad, esta es la forma que se usa principalmente en la práctica.

Ramificación en la forma con búsqueda — evaluada de arriba abajo
evalúa WHEN de arriba abajocompruebavalor devueltosalary >= 6000000salary >= 4500000ELSEsi TRUEsi TRUEtodo lo demás'Senior''Mid''Junior'FALSEFALSE
WHEN se evalúa de arriba abajo. En cuanto una condición es TRUE el valor THEN queda fijado y no se comprueba nada más. Si es FALSE pasa al siguiente WHEN; si todos son FALSE, se usa el valor ELSE.
-- Forma con búsqueda — divide salary en 2 franjas
SELECT name, salary,
  CASE
    WHEN salary >= 5000000 THEN 'High'
    ELSE 'Standard'
  END AS pay_band
FROM staff;

Imagina el requisito "clasificar al personal en 3 niveles (Junior / Mid / Senior) por salario".

① De la tabla staff, toma name y salary.

② Usando la forma CASE con búsqueda, añade una 3.ª columna con el alias tier que sea 'Senior' si salary es 6,000,000 o más, 'Mid' si es 4,500,000 o más pero menos de 6,000,000, y 'Junior' si es menor que eso.

Editor SQL

Ejecutar una consulta para ver el resultado

Combinarlo con funciones y condiciones compuestas para una ramificación más compleja

Una cláusula CASE WHEN puede contener expresiones que combinan operadores de comparación, LIKE, IN, AND / OR y llamadas a funciones. Puedes extraer el año de nacimiento con strftime('%Y', birthday) aprendido en Funciones ① funciones de fecha para una clasificación por generación; como name está en orden "nombre apellido", name LIKE '%Tanaka' (coincidencia por sufijo) clasifica a las personas cuyo apellido es Tanaka; y puedes escribir condiciones que combinan varias columnas con AND.

El ejemplo de abajo extrae el año de nacimiento en tramos de 10 años y etiqueta a las personas nacidas en los 1990 como 'Gen Z' y en los 1980 como 'Gen X-Y'. Como strftime devuelve una cadena, las comparaciones se hacen contra literales de cadena ('1990' / '1999').

-- 1) Etiqueta el año de nacimiento en tramos de 5 años
SELECT name, birthday,
  CASE
    WHEN strftime('%Y', birthday) BETWEEN '1985' AND '1989' THEN 'Late 1980s'
    WHEN strftime('%Y', birthday) BETWEEN '1990' AND '1994' THEN 'Early 1990s'
    ELSE 'Other'
  END AS cohort
FROM staff;

-- 2) Condición compuesta: salario alto AND con base en Tokyo
SELECT name, city, salary,
  CASE
    WHEN salary >= 6000000 AND city = 'Tokyo' THEN 'Tokyo senior'
    WHEN salary >= 6000000 THEN 'Senior'
    ELSE 'Other'
  END AS tag
FROM staff;

Imagina el requisito "dividir a todo el personal en generaciones por año de nacimiento en tramos de 10 años".

① De la tabla staff, toma name y birthday.

② Usando la forma CASE con búsqueda, añade una 3.ª columna con el alias generation que sea 'Gen Z' si el año de nacimiento extraído de birthday está en los 1990, 'Gen X-Y' si está en los 1980, y 'Other' en otro caso.

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina el requisito "mostrar el TOP 5 por salario en una pantalla de ranking, cada uno anotado con una etiqueta de franja salarial".

① De la tabla staff, toma name y salary.

② Usando la forma CASE con búsqueda, añade una 3.ª columna con el alias tier con las mismas etiquetas de franja salarial que en la Práctica 2 ('Senior' si salary es 6,000,000 o más, 'Mid' si es 4,500,000 o más, 'Junior' en otro caso).

③ Ordena por `salary` descendente y limita a las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuál de las siguientes es una estructura correcta de expresión CASE?

Pregunta 2¿Cuál es una descripción correcta de la forma simple CASE city WHEN 'Tokyo' THEN 'TOK' WHEN 'Osaka' THEN 'OSA' ELSE city END?

Pregunta 3¿Qué devuelve CASE WHEN salary >= 6000000 THEN 'Senior' WHEN salary >= 4500000 THEN 'Mid' ELSE 'Junior' END para una fila con salary = 7,000,000?