Expresión CASE de SQL Server
Resumen: en este tutorial, aprenderás a usar la expresión CASE de SQL Server para agregar lógica if-else a consultas SQL.
Introducción a la expresión CASE
La expresión CASE de SQL Server evalúa una lista de condiciones y devuelve uno de los múltiples resultados especificados. La expresión CASE tiene dos formatos: expresión CASE simple y expresión CASE buscada. Ambos formatos de expresión CASE admiten una instrucción ELSE opcional.
Debido a que CASE es una expresión, puedes usarla en cualquier cláusula que acepte una expresión como SELECT, WHERE, GROUP BY y HAVING.
Expresión CASE simple de SQL Server
A continuación, se muestra la sintaxis de la expresión CASE simple:
CASE input
WHEN e1 THEN r1
WHEN e2 THEN r2
...
WHEN en THEN rn
[ ELSE re ]
END
La expresión CASE simple compara la expresión de entrada (input) con una expresión (ei) en cada cláusula WHEN. Si el valor de input es igual a una expresión (ei) en la cláusula WHEN, se devuelve el resultado (r1, r2 o rn) en la cláusula THEN correspondiente.
Si la expresión de entrada no es igual a ninguna expresión y la cláusula ELSE está disponible, la expresión CASE devolverá el resultado en la cláusula ELSE (re).
En caso de que se omita la cláusula ELSE y la expresión de entrada no sea igual a ninguna expresión en la cláusula WHEN, la expresión CASE devolverá NULL.
A) Usando la expresión CASE simple en la cláusula SELECT
Consulta la siguiente tabla sales.orders de la base de datos de muestra:

Este ejemplo usa la función COUNT() con la cláusula GROUP BY para devolver el número de pedidos para el estado de cada pedido:
SELECT
order_status,
COUNT(order_id) order_count
FROM
sales.orders
WHERE
YEAR(order_date) = 2018
GROUP BY
order_status;
Resultado:

Los valores de la columna order_status son números, lo que no tiene sentido en este caso. Para que el resultado sea más comprensible, puedes usar la expresión CASE simple como se muestra en la siguiente consulta:
SELECT
CASE order_status
WHEN 1 THEN 'Pending'
WHEN 2 THEN 'Processing'
WHEN 3 THEN 'Rejected'
WHEN 4 THEN 'Completed'
END AS order_status,
COUNT(order_id) order_count
FROM
sales.orders
WHERE
YEAR(order_date) = 2018
GROUP BY
order_status;
Resultado:

B) Uso de la expresión CASE simple con una función agregada
Consulta el código siguiente:
SELECT
SUM(CASE
WHEN order_status = 1
THEN 1
ELSE 0
END) AS 'Pending',
SUM(CASE
WHEN order_status = 2
THEN 1
ELSE 0
END) AS 'Processing',
SUM(CASE
WHEN order_status = 3
THEN 1
ELSE 0
END) AS 'Rejected',
SUM(CASE
WHEN order_status = 4
THEN 1
ELSE 0
END) AS 'Completed',
COUNT(*) AS Total
FROM
sales.orders
WHERE
YEAR(order_date) = 2018;
Resultado:

En este ejemplo:
- Primero, la condición en la cláusula WHERE incluye la orden de venta solo del 2018.
- En segundo lugar, la expresión
CASEdevuelve 1 o 0 según el estado del pedido. - En tercer lugar, la función SUM() suma el número de pedidos para cada estado del pedido.
- Cuarto, la función COUNT() devuelve el total de pedidos.
Expresión CASE buscada de SQL Server
A continuación, se muestra la sintaxis de la expresión CASE buscada:
CASE
WHEN e1 THEN r1
WHEN e2 THEN r2
...
WHEN en THEN rn
[ ELSE re ]
END
En esta sintaxis:
e1,e2, …ei, … oenson expresiones booleanas.r1,r2, …ri,… ornes uno de los posibles resultados.
La expresión CASE buscada evalúa la expresión booleana en cada cláusula WHEN en el orden especificado y devuelve el resultado (ri) si la expresión booleana (ei) se evalúa como TRUE.
Si ninguna expresión booleana se evalúa como TRUE, la expresión CASE buscada devuelve el resultado (re) en la cláusula ELSE o NULL si no se especifica la cláusula ELSE.
A) Usar la expresión CASE buscada en la cláusula SELECT
Consulta las siguientes tablas sales.orders y sales.order_items de la base de datos de ejemplo:

La siguiente instrucción utiliza la expresión CASE buscada para clasificar el pedido de ventas por valor de pedido:
SELECT
o.order_id,
SUM(quantity * list_price) order_value,
CASE
WHEN SUM(quantity * list_price) <= 500
THEN 'Very Low'
WHEN SUM(quantity * list_price) > 500 AND
SUM(quantity * list_price) <= 1000
THEN 'Low'
WHEN SUM(quantity * list_price) > 1000 AND
SUM(quantity * list_price) <= 5000
THEN 'Medium'
WHEN SUM(quantity * list_price) > 5000 AND
SUM(quantity * list_price) <= 10000
THEN 'High'
WHEN SUM(quantity * list_price) > 10000
THEN 'Very High'
END order_priority
FROM
sales.orders o
INNER JOIN sales.order_items i ON i.order_id = o.order_id
WHERE
YEAR(order_date) = 2018
GROUP BY
o.order_id;
Resultado:

En este tutorial, aprendiste a usar la expresión CASE de SQL Server para agregar lógica if-else a las consultas SQL.
