Condicionalesestándar SQL

CASE

Devuelve valores distintos según las condiciones: el «si… entonces… si no» de SQL.

Sintaxis

CASE WHEN <condición> THEN <resultado> … ELSE <si no> END
CASE <expresión> WHEN <valor> THEN <resultado> … ELSE <si no> END

No es una función sino una expresión, pero se escribe en los mismos sitios que las funciones. Las condiciones se comprueban de arriba abajo y gana la primera verdadera; si no se cumple ninguna, se usa ELSE, y sin él, NULL. La segunda forma es más corta: compara una expresión con una lista de valores.

Datos para los ejemplos

employees

namedepartmentsalarybonusphone
Emmabackend1200300+44 7700 900123
Liambackend1000NULLNULL
Oliviafrontend1350150+44 7700 900456
Noahfrontend950NULL+44 7700 900789
Sophiadesign1200200NULL

Estas tablas ya están creadas en el entorno de pruebas y los ejemplos de abajo las usan. ¿Quieres repetirlo en tu propia base de datos? Copia el SQL.

Nivel de salario
SELECT name, salary,
CASE
WHEN salary >= 1200 THEN 'high'
WHEN salary >= 1000 THEN 'medium'
ELSE 'low'
END AS level
FROM employees;
namesalarylevel
Emma1200high
Liam1000medium
Olivia1350high
Noah950low
Sophia1200high
La forma corta: una lista de valores
SELECT name,
CASE department
WHEN 'backend' THEN 'Server'
WHEN 'frontend' THEN 'Web'
ELSE 'Other'
END AS team
FROM employees;
nameteam
EmmaServer
LiamServer
OliviaWeb
NoahWeb
SophiaOther
Contar según una condición en cada departamentoAvanzado
SELECT department,
COUNT(*) AS people,
SUM(CASE WHEN bonus IS NULL THEN 0 ELSE 1 END) AS with_bonus
FROM employees
GROUP BY department
ORDER BY department;
departmentpeoplewith_bonus
backend21
design11
frontend21

Para cada fila, CASE da 1 o 0 y SUM los suma: sale el número de personas con bonus.

Ten en cuenta

Gana la primera condición verdadera. Pon WHEN salary >= 1000 por encima de WHEN salary >= 1200 y nadie obtendrá el nivel high.

La forma corta compara con =, así que CASE bonus WHEN NULL THEN … nunca se cumple: NULL no es igual ni siquiera a NULL. Usa la forma completa: CASE WHEN bonus IS NULL THEN ….

Todas las ramas deben devolver un tipo compatible: CASE WHEN … THEN 1 ELSE 'none' END da el error invalid input syntax for type integer.

Funciones relacionadas