Pregunta 1¿Cuál de las siguientes es una estructura correcta de expresión CASE?
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.
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
WHENse vuelven NULL. Para evitar NULL, indica un valor por defecto explícito conELSE.
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.
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;
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.
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;
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;
Verificación de conocimientos
Responde cada pregunta una a una.
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?