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.

Sintaxis
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 es NULL.
  • 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:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
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:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
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:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
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:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
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:

PostgreSQL en tu navegador · Ctrl+Enter para ejecutar · los cambios se deshacen al terminar
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

  1. Añade una categoría 'Enorme' para los pedidos de más de 4.000 €. ¿En qué posición tienes que poner el WHEN para que funcione, y por qué?
  2. Cuenta en una sola consulta cuántos pedidos hay de 2022 antes y después del 1 de agosto.
  3. Ordena los pedidos para que salgan primero los que no tienen cliente asignado.