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
CASE
devuelve 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
, … oen
son expresiones booleanas.r1
,r2
, …ri
,… orn
es 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.