La expresión CASE
Lógica IF/THEN dentro de una consulta
La expresión CASE es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Lógica condicional en SQL
A veces necesita que una consulta tome una decisión: si ocurre esto, entonces aquello; de lo contrario, otra cosa. SQL proporciona la expresión CASE exactamente para este propósito.
CASE permite devolver distintos valores según las condiciones, directamente dentro de un SELECT. Considérela la versión de SQL de una cadena if/else.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
ELSE 'affordable'
END AS price_band
FROM products;Estructura de una expresión CASE
Una expresión CASE consta de varias partes:
WHEN condition THEN value— una o más ramasELSE value— un valor alternativo opcionalEND— cierra la expresión (¡obligatorio!)
SQL evalúa las ramas WHEN de arriba abajo y devuelve el valor de la primera que sea verdadera.
CASE WHEN condition1 THEN result1
WHEN condition2 THEN result2
ELSE default_result
ENDCASE devuelve un valor
La idea clave: una expresión CASE se evalúa como un único valor por fila. Como produce un valor, puede usarla en cualquier lugar donde se permita un valor — en la lista de SELECT, en WHERE, en ORDER BY e incluso dentro de funciones.
Aquí etiqueta cada pedido con un estado sencillo.
SELECT order_id,
CASE WHEN shipped_at IS NOT NULL THEN 'shipped'
WHEN paid_at IS NOT NULL THEN 'paid'
ELSE 'pending'
END AS status
FROM orders;Gana la primera coincidencia
El orden importa. SQL comprueba cada WHEN en secuencia y se detiene en el primero que sea verdadero. Las ramas posteriores se ignoran aunque también coincidieran.
A continuación, un pedido superior a 1000 es 'large', nunca 'medium', porque gana la primera rama coincidente.
SELECT order_id, total,
CASE WHEN total >= 1000 THEN 'large'
WHEN total >= 100 THEN 'medium'
ELSE 'small'
END AS size_band
FROM orders;La rama ELSE
La rama ELSE engloba todos los demás casos. Si ninguna de las condiciones WHEN es verdadera, CASE devuelve el valor de ELSE.
Si omite ELSE y no hay ninguna coincidencia, CASE devuelve NULL. Esta es una fuente habitual de valores NULL inesperados, así que añada un ELSE explícito cuando quiera un valor alternativo definido.
SELECT name,
CASE WHEN stock = 0 THEN 'out of stock' END AS note
FROM products;
-- rows with stock > 0 get NULL in note (no ELSE)Las condiciones pueden ser de cualquier tipo
Una condición WHEN no es más que una expresión booleana — del mismo tipo que se escribe en una cláusula WHERE. Puede usar comparaciones, AND, OR, BETWEEN, IN, LIKE y mucho más.
SELECT email,
CASE WHEN country IN ('US','CA') AND age >= 18 THEN 'eligible'
WHEN email LIKE '%@test.com' THEN 'test account'
ELSE 'review'
END AS segment
FROM users;Los tipos de resultado deben ser compatibles
Cada rama de un CASE debe devolver valores de un tipo compatible, porque la columna debe tener un solo tipo. Mezclar texto y números provocará un error o una conversión inesperada.
Si necesita números en una rama y texto en otra, conviértalos explícitamente para que los tipos coincidan.
SELECT product_id,
CASE WHEN on_sale THEN price * 0.9
ELSE price
END AS effective_price -- all branches numeric: good
FROM products;Uso de CASE en WHERE
Como CASE produce un valor, puede comparar su resultado dentro de una cláusula WHERE. Esto resulta práctico para reglas de filtrado dinámicas.
Sin embargo, a menudo la lógica booleana sencilla en WHERE es más clara; utilice CASE en WHERE solo cuando la ramificación simplifique realmente la condición.
SELECT *
FROM orders
WHERE CASE WHEN priority = 'high' THEN total > 0
ELSE total > 500
END;Anidamiento de CASE
Puede colocar un CASE dentro de otra rama CASE para expresar una lógica por niveles. Esto funciona, pero las expresiones profundamente anidadas resultan difíciles de leer.
Mantenga el anidamiento superficial; si crece demasiado, normalmente será más claro utilizar una columna independiente o una tabla de consulta.
SELECT order_id,
CASE WHEN region = 'EU' THEN
CASE WHEN total > 100 THEN 'EU big'
ELSE 'EU small' END
ELSE 'other'
END AS bucket
FROM orders;CASE con funciones de agregación
Un patrón muy útil consiste en incluir un CASE dentro de una función de agregación como SUM o COUNT. De este modo, puede contar o sumar filas de forma condicional en una sola pasada; a veces se denomina agregación condicional o tabla dinámica.
SELECT
COUNT(*) AS total_orders,
SUM(CASE WHEN status = 'shipped' THEN 1 ELSE 0 END) AS shipped,
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending
FROM orders;CASE devuelve NULL intencionadamente
Devolver NULL desde una rama es exactamente lo que necesita en ocasiones; por ejemplo, para ocultar un valor que no desea mostrar o para pasarlo a una función de agregación posterior que ignore los NULL.
Aquí, solo los pedidos grandes conservan su total; los demás se convierten en NULL para que AVG los omita.
SELECT order_id,
CASE WHEN total >= 1000 THEN total
ELSE NULL
END AS large_order_total
FROM orders;Comprobación rápida
Considere esta expresión para una fila donde total = 1500:
CASE WHEN total >= 100 THEN 'medium' WHEN total >= 1000 THEN 'large' ELSE 'small' END
¿Qué valor devuelve?
Repaso: la expresión CASE
Aprendió los fundamentos de la lógica condicional en SQL:
CASE WHEN ... THEN ... ELSE ... ENDdevuelve un valor por fila- Las ramas se comprueban de arriba abajo; gana la primera coincidencia
- Si omite
ELSE, se obtieneNULLcuando no hay coincidencias - Todas las ramas deben devolver tipos compatibles
CASEfunciona enSELECT,WHEREy dentro de funciones de agregación
A continuación, compararemos las dos formas sintácticas de CASE.
SELECT name,
CASE WHEN price > 100 THEN 'expensive'
WHEN price > 20 THEN 'mid'
ELSE 'cheap'
END AS tier
FROM products;Preguntas frecuentes
¿La lección «La expresión CASE» es gratis?
Sí — el texto completo de «La expresión CASE» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «La expresión CASE»?
Lógica IF/THEN dentro de una consulta Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «La expresión CASE»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- La expresión CASE
- CASE buscado frente a CASE simple
- Agrupación y etiquetado de datos
- CASE en ORDER BY y agregaciones