CASE WHEN: decidir dentro de la consulta
BásicoCASE evalúa condiciones en orden y devuelve el resultado de la primera que se cumple. Si ninguna se cumple, devuelve lo que diga ELSE; si no hay ELSE, devuelve NULL. Sirve para crear segmentos, tramos y etiquetas.
Sintaxis
CASE
WHEN condición_1 THEN resultado_1
WHEN condición_2 THEN resultado_2
ELSE resultado_por_defecto
END AS nombreEjemplo
SELECT
t.title,
t.duration_seconds,
CASE
WHEN t.duration_seconds < 150 THEN 'corta'
WHEN t.duration_seconds < 240 THEN 'media'
ELSE 'larga'
END AS duracion,
CASE WHEN t.is_explicit THEN 'explícita' END AS aviso
FROM tracks AS t
WHERE t.album_id = 35
ORDER BY t.id;Resultado
| title | duration_seconds | duracion | aviso |
|---|---|---|---|
| Sin Vos por la Radio | 205 | media | NULL |
| Tu Nombre por la Radio | 127 | corta | explícita |
| Playa otra vez | 186 | media | explícita |
| Nadie de Madrugada | 533 | larga | NULL |
| Nadie de Vuelta | 263 | larga | NULL |
| Ya No en Silencio | 311 | larga | NULL |
Cómo leerlo
La canción de 127 segundos cumple las dos primeras condiciones (es menor que 150 y menor que 240), pero queda como corta porque CASE se detiene en la primera que se cumple. Por eso el segundo WHEN no necesita repetir >= 150. La columna aviso no tiene ELSE: en las canciones que no son explícitas devuelve NULL.
Error común
Así no
SELECT
t.title,
CASE
WHEN t.duration_seconds < 240 THEN 'media'
WHEN t.duration_seconds < 150 THEN 'corta'
ELSE 'larga'
END AS duracion
FROM tracks AS t;Poner primero la condición más amplia. Toda canción de menos de 150 segundos también tiene menos de 240, así que se queda en el primer WHEN y el tramo corta nunca aparece. No hay error ni aviso: el resultado simplemente es incorrecto. Ordena los tramos de un extremo al otro.
En otros motores: MySQL, BigQuery, SQL Server, Snowflake
MySQLBigQuery
IF(condición, si_verdadero, si_falso)es un atajo para unCASEde una sola condición.CASEfunciona igual en todos los motores.IF(duration_seconds < 150, 'corta', 'otra')SQL Server
IIFes el mismo atajo en SQL Server.IIF(duration_seconds < 150, 'corta', 'otra')Snowflake
En Snowflake el atajo se llama
IFF, con dos letras F.IFF(duration_seconds < 150, 'corta', 'otra')
Estos fragmentos no se ejecutan en el curso: se muestran como referencia de cada motor.