CASE es el “si… entonces…” de SQL. Evalúa una lista de condiciones en orden y devuelve el valor de la primera que se cumple. No es una sentencia sino una expresión: se puede usar en cualquier sitio donde iría un valor, ya sea el SELECT, el ORDER BY, el WHERE o dentro de una función agregada.
CASE
WHEN condicion1 THEN valor1
WHEN condicion2 THEN valor2
...
ELSE valorPorDefecto
END
Tres reglas que conviene recordar:
- Las condiciones se evalúan en orden y se para en la primera verdadera.
- Si ninguna se cumple y no hay
ELSE, el resultado esNULL. - Todas las ramas deben devolver el mismo tipo de dato (o tipos compatibles).
CASE de búsqueda
Es la forma más habitual: cada WHEN lleva su propia condición. Este ejemplo clasifica cada pedido según su importe total:
| producto | totalPrecio | tamanoPedido |
|---|---|---|
| Xiami Mi 11 | 4304,25 | Grande |
| Echo DOT 4 | 2999,50 | Mediano |
| MacBook Pro M1 | 2449,50 | Mediano |
| Play Station 5 | 2199,80 | Mediano |
| Echo DOT 3 | 1999,50 | Mediano |
| Horno Balay | 1399,10 | Mediano |
| Xbox series X | 999,98 | Pequeño |
| Nintendo Switch | 899,97 | Pequeño |
Fíjate en que un pedido de 4.304,25 € cumple las dos primeras condiciones, pero se queda con 'Grande' porque es la primera que se evalúa. Si invirtieras el orden de los WHEN, todos los pedidos de más de 1.000 € saldrían como 'Mediano'.
CASE simple
Cuando todas las condiciones comparan la misma columna con valores concretos, hay una forma abreviada:
| producto | descripcionProducto | familia |
|---|---|---|
| Xiami Mi 11 | Smartphone | Móviles |
| Play Station 5 | Consola Sony | Ocio y otros |
| Xbox series X | Consola Xbox | Ocio y otros |
| MacBook Pro M1 | Portátil Apple | Informática |
| Echo DOT 3 | Altavoz Alexa | Hogar inteligente |
| Echo DOT 4 | Altavoz Alexa | Hogar inteligente |
| Nintendo Switch | Consola Nintendo | Ocio y otros |
| Horno Balay | Electrodoméstico | Ocio y otros |
El CASE simple solo admite igualdades. Para rangos (>, BETWEEN) o condiciones sobre varias columnas, usa el CASE de búsqueda.
CASE con NULL
Una comparación con NULL nunca es verdadera, así que CASE cuenta WHEN NULL THEN ... no funciona. Hay que usar el CASE de búsqueda con IS NULL:
| nombre | cuenta | estadoCuenta |
|---|---|---|
| Fernando | 111222333 | Cuenta registrada |
| María | 123456789 | Cuenta registrada |
| Ana | 998344567 | Cuenta registrada |
| Luis | 447824556 | Cuenta registrada |
| Alejandro | 778345112 | Cuenta registrada |
| Paloma | 790763467 | Cuenta registrada |
| Ignacio | NULL | Sin cuenta registrada |
Si lo único que quieres es sustituir un NULL por un valor, COALESCE es más corto.
CASE dentro de una función agregada
Es el uso que más tiempo ahorra: contar o sumar solo las filas que cumplen una condición, varias condiciones distintas en una sola consulta. Por ejemplo, separar las ventas de consolas del resto:
| pedidos | pedidosConsolas | ventasConsolas | ventasTotales |
|---|---|---|---|
| 8 | 3 | 4099,75 | 17251,60 |
Esta técnica (a veces llamada agregación condicional) es la base para convertir filas en columnas sin necesidad de PIVOT.
CASE en ORDER BY
También sirve para ordenar con un criterio propio. Aquí los clientes sin cuenta salen al final y el resto por orden alfabético:
| nombre | apellidos | cuenta |
|---|---|---|
| Alejandro | Valero Martinez | 778345112 |
| Ana | Fernandez Montero | 998344567 |
| Fernando | García Rodriguez | 111222333 |
| Luis | Sanchez García | 447824556 |
| María | Lopez ruiz | 123456789 |
| Paloma | Sanz Valdivia | 790763467 |
| Ignacio | Herrero Dominguez | NULL |
CASE frente a IIF
SQL Server tiene además la función IIF(condicion, valorSiVerdadero, valorSiFalso), que es un atajo para un CASE con una sola condición. CASE es SQL estándar y funciona en cualquier base de datos; IIF solo en SQL Server (y Access). Si tu código tiene que ser portable, usa CASE.
-- Solo en SQL Server
SELECT producto, IIF(totalPrecio >= 1000, 'Caro', 'Barato') AS rango
FROM Pedidos;
Practica
- Añade una categoría
'Enorme'para los pedidos de más de 4.000 €. ¿En qué posición tienes que poner elWHENpara que funcione, y por qué? - Cuenta en una sola consulta cuántos pedidos hay de 2022 antes y después del 1 de agosto.
- Ordena los pedidos para que salgan primero los que no tienen cliente asignado.