Volver a la lista de artículos Artículos
Lectura de 10 minutos

Cómo utilizar CASE en SQL

Si necesitas evaluar múltiples sentencias condicionales, la sentencia CASE de SQL hará el trabajo. Esto es lo que necesita saber para utilizar CASE como un profesional.

¿Por qué es tan importante CASE en SQL? Si está analizando o manipulando datos, a menudo querrá definir reglas basadas en ciertas condiciones, por ejemplo, si el rendimiento de un empleado está por encima de la media, déle un aumento del 10%; si es sobresaliente, déle un aumento del 15%; en caso contrario, déle un aumento del 5%.

Para manejar situaciones en las que es necesario evaluar muchas sentencias condicionales juntas y devolver resultados dependiendo de qué sentencia sea verdadera, SQL ofrece la sentencia CASE.

La sentencia SQL CASE es una de las construcciones condicionales más útiles que existen y tiene muchas aplicaciones para analizar datos con SQL.

Por lo tanto, si quieres conocer las aplicaciones prácticas de la sentencia CASE y las diferentes formas de utilizarla, este artículo es para ti.

¿Qué es la sentencia CASE?

En SQL, la sentencia CASE devuelve resultados basados en la evaluación de ciertas condiciones. Es bastante versátil y puede ser usada en diferentes construcciones. Por ejemplo, puede utilizarla para mostrar valores, ordenar resultados o filtrar registros. Evalúa las condiciones establecidas y devuelve el resultado de la primera declaración que se evalúa como verdadera.

Antes de entrar en detalles sobre el funcionamiento de CASE, eche un vistazo a la sintaxis de la sentencia CASE:

CASE
WHEN <condition> THEN <value>,
WHEN <other condition> THEN <value>
ELSE <value>
END AS <column name>

Veamos un ejemplo práctico de una simple sentencia CASE.

Aquí está la order_summary tabla:

order_idcustomer_idcustomer_namequantityorder_valueshipping_fee
A1231221Emily52059
A1243213Javier223000
A1253213Javier12320000
A1263213Javier1016000

Digamos que usted es un analista en una empresa de comercio electrónico. Quiere analizar los pedidos en función de su valor y dividirlos en categorías(muy bajo, bajo, medio, alto y muy alto) según su valor.

La sentencia CASE puede ayudarle a conseguirlo. Esta es la consulta que escribiría:

SELECT  order_id,
	  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category
FROM    order_summary;

Y estos son los resultados que obtendrías:

order_idorder_category
A123Medium
A124Medium
A125Very High
A126High

También puede utilizar la consulta que se indica a continuación:

SELECT order_id,
 CASE
 WHEN order_value <= 50 THEN 'Very Low'
 WHEN order_value <= 200 THEN 'Low'
 WHEN order_value <= 500 THEN 'Medium'
 WHEN order_value <= 1000 THEN 'High'
 ELSE 'Very High'
END AS order_category
FROM order_summary;

Esto le dará exactamente el mismo resultado, ya que CASE deja de evaluar un valor una vez que cumple los criterios de WHEN.

Ahora, permítame desglosar estas consultas.

La primera palabra clave es SELECT, que especifica las columnas que desea devolver. En nuestro caso, estas columnas eran order_id y order_category, que utilizamos como alias para la sentencia CASE (CASE...END AS order_category).

La sentencia CASE comienza con la palabra clave CASE. Le sigue la palabra clave WHEN, tras la cual especificamos una condición a evaluar (order_value <= 50). Esto es inmediatamente seguido por THEN y el valor de retorno si la condición es verdadera (‘Very Low’).

Por ejemplo, tomemos la primera sentencia:

CASE WHEN order_value <= 50 THEN 'Very Low'

En esta sentencia, cuando el valor del pedido es menor o igual a 50 dólares, se devuelve "Muy bajo" como valor en la columna order_category. En otras palabras, clasificamos todos los pedidos con valor inferior a 50 dólares o igual a 50 dólares en la categoría "Muy bajo".

Si esta condición no es cierta (el valor es superior a 50 dólares), la consulta comprueba si el valor es superior a 200 dólares. Si el valor es inferior a 200 dólares pero superior a 50 dólares, se devuelve "Bajo" como valor en la columna order_category. Si el valor es superior a 200 dólares, la consulta pasa a la siguiente cláusula WHEN, y así sucesivamente.

Si ninguna de las condiciones se evalúa como verdadera, se devuelve el valor especificado en ELSE. Así, la sentencia CASE añade lógica a su sentencia SELECT.

Si eres nuevo en SQL y quieres entender cómo escribir este tipo de consultas, te recomiendo el Curso completo de SQL de LearnSQL.es. Comienza con los fundamentos de SQL y las bases de datos, y luego te guía hasta las consultas y funciones más sofisticadas. Es una buena manera de empezar a trabajar con SQL.

Si está analizando muchos pedidos, la agregación le resultará muy útil en consultas como éstas. La agregación significa agrupar registros similares y luego utilizar una métrica basada en los valores agrupados para comprender las características de ese grupo. En SQL, la cláusula GROUP BY es su entrada en el mundo de las estadísticas agregadas. (Para una comprensión más detallada de GROUP BY, consulte este artículo).

Por ahora, veamos cómo funcionan juntos GROUP BY y CASE. Aquí tenemos una versión actualizada de nuestra consulta anterior:

SELECT  CASE 
	  WHEN order_value <= 50 THEN 'Very Low'
  WHEN order_value > 50 AND order_value <= 200 THEN 'Low'
  WHEN order_value > 200 AND order_value <= 500 THEN 'Medium'
  WHEN order_value > 500 AND order_value <= 1000 THEN 'High'
  ELSE 'Very High' 
  END AS order_category,
  COUNT(order_id)
FROM    order_summary
GROUP BY 1;

Y el nuevo resultado:

order_categoryCOUNT(order_id)
High1
Medium2
Very High1

Aquí, utilizamos COUNT como función agregada. Así es como funciona. La cláusula GROUP BY agrega todos los registros por los valores devueltos en la primera columna de SELECT. En nuestro caso, ésta es order_category.

Entonces, para cada valor diferente de order_category, COUNT(order_id) calculará el número total de pedidos que pertenecen a la categoría correspondiente. La sentencia CASE ayuda a decidir qué categoría asignar a cada pedido. En nuestros datos, tenemos un total de 1 pedido en la categoría 'Alta' (order_value entre 500 y 1000), 2 pedidos en 'Media' (order_value entre 200 y 500) y 1 pedido en la categoría 'Muy Alta' (order_value mayor de 1000).

En todos los ejemplos anteriores, la sentencia CASE se ha utilizado en la parte de la consulta SELECT. Sin embargo, esta cláusula es bastante versátil y puede utilizarse para devolver resultados basados en condiciones en otras partes de la consulta.

Así que ahora que tiene una idea de lo que es la sentencia CASE, veamos otras formas de utilizarla.

Uso de CASE en la cláusula ORDER BY

La cláusula ORDER BY se utiliza para ordenar los resultados de la consulta en un orden determinado. Por ejemplo, podría querer ordenar el número de pedidos realizados por cada cliente en base a customer_name. Esta es la consulta que escribiría:

SELECT   customer_name,
   COUNT(order_id)
FROM 	   order_summary
GROUP BY customer_name
ORDER BY customer_name;

Y la salida es:

customer_nameCOUNT(order_id)
Emily1
Javier3

Aquí, la consulta ordena los resultados en orden alfabético ascendente (porque está ordenando por un valor de texto). A menos que se especifique lo contrario, ORDER BY siempre utilizará el orden ascendente (es decir, A-Z, 1-10). Puede colocar la palabra clave DESC después de la cláusula del nombre de la columna para ordenar los resultados en orden descendente (Z-A, 10-1): ORDER BY customer_name DESC.

Supongamos que desea ordenar los registros por order_id en orden ascendente. Sin embargo, quiere mostrar primero los pedidos de más de 120 elementos. En otras palabras, primero ordenará por cantidad de artículos (siempre que la cantidad sea superior a 120) y después por el ID del pedido. Esto requerirá una evaluación condicional en la cláusula ORDER BY:

Query:
SELECT
  customer_name,
  order_id,
  order_value,
  quantity
FROM
  order_summary
ORDER BY
  CASE WHEN quantity > 120 THEN quantity END, order_id;

Este es el resultado:

customer_nameorder_idorder_valuequantity
JavierA1252000123
EmilyA1232055
JavierA12430022
JavierA126600101

En esta consulta, primero obtenemos las columnas customer_name, order_id, order_value y cantidad de la tabla. Al ordenar las filas, esta consulta obtiene primero las filas en las que la cantidad es mayor que 120. (En este caso, la cantidad es 123.) Como no tenemos otras filas que cumplan ese criterio, el resto de las filas se ordenan por order_id.

Uso de CASE en la cláusula WHERE

La cláusula WHERE se utiliza para filtrar los registros de los resultados de la consulta en función de las condiciones declaradas. Por ejemplo, si su empresa quiere renunciar a los gastos de envío para los pedidos superiores a 100 dólares, es posible que primero quiera ver cuántos pedidos cumplen los requisitos y analizar el impacto. La siguiente cláusula WHERE sólo contará los ID de los pedidos superiores a 100 dólares:

SELECT  COUNT(order_id)
FROM    order_summary
WHERE   order_value > 100;

Y el resultado:

COUNT(order_id)
4

En base al resultado, supondrá que unos 4 pedidos se verán afectados por esto. Por supuesto, este es el primer paso de su análisis; probablemente querrá hacer muchos más análisis detallados para cuantificar el impacto.

Ahora déjame mostrarte un ejemplo de uso de la cláusula WHERE con CASE. Eche un vistazo a la tabla influencer_list tabla:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisyoutubehungryLouisJan_20213200
JanetfacebookstylenmakeupJan_2021423444
MichaelfacebookInfl_brandXJan_20212322
MichaelfacebookInfl_brandXFeb_2021240000

Digamos que su empresa utiliza varios influencers para promocionar sus marcas. Quieres ver todos los influencers cuyo canal de YouTube o cuenta de Facebook utiliza directamente tu nombre ("MarcaX").

Cada influencer tiene un tipo de canal/cuenta. Así es como puedes averiguar cuáles mencionan a BrandX:

SELECT DISTINCT influencer_name
FROM influencer_list
WHERE CASE WHEN influencer_channel = 'facebook' THEN fb_channel
	     WHEN influencer_channel = 'youtube' THEN youtube_channel
	     END LIKE '%brandX%';

Este es el resultado:

influencer_name
Michael

La consulta anterior devolverá todas las filas en las que youtube_channel o fb_channel tengan ‘brandX’. ¿Cómo lo hacemos? Bueno, ya sabe cómo funcionan WHERE y CASE WHEN. El nuevo elemento aquí es LIKE '%brandX%'. Todo lo que hace es decirle a la consulta que devuelva los canales de influenciadores que contengan "BrandX" en su nombre; LIKE se utiliza para hacer coincidir el valor de la columna con el patrón, y el signo de porcentaje (%) indica que cualquier número de caracteres puede ir antes o después de "BrandX" (por eso el % está en ambos extremos de BrandX).

Uso de CASE en la cláusula HAVING

La cláusula HAVING se utiliza con la cláusula GROUP BY para filtrar los grupos que se muestran. Por ejemplo, si quisiera ver los registros de la tabla influencer_list tabla en la que total_views durante la vida del influenciador es superior a un millón, escribirías

SELECT      influencer_name,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name
HAVING   SUM(total_views) > 200000;

Y esto es lo que obtendría:

influencer_nameSUM(total_views)
Michael242322
Janet423444

También puede utilizar CASE con la cláusula HAVING. Digamos que quieres obtener una lista de influenciadores cuyo total de visualizaciones sea superior a 100 para YouTube o superior a 400.000 para Facebook.

SELECT      influencer_name,
	   influencer_channel,
	   SUM(total_views)
FROM     influencer_list
GROUP BY influencer_name,
	   influencer_channel
HAVING   CASE WHEN influencer_channel = 'youtube' 
        THEN SUM(total_views) > 100
  WHEN influencer_channel = 'facebook' 
  THEN SUM(total_views) > 400000
   END;

Y el resultado:

influencer_nameinfluencer_channelSUM(total_views)
Louisyoutube3200
Janetfacebook423444

Esta consulta suma primero las visualizaciones totales por influencer_name y influencer_channel. En la cláusula HAVING, filtramos entonces sólo los grupos que tienen más de 100 visualizaciones para YouTube y más de 400.000 para Facebook. Observa que Michael, que tiene 242.322 visualizaciones en Facebook, no aparece en el resultado; su total es inferior a 400.000.

Uso de CASE en una sentencia UPDATE

También puede utilizar CASE en una sentencia UPDATE. La sentencia SQL UPDATE se utiliza para cambiar los valores de una tabla existente.

Imagina que quieres actualizar los valores de influencer_channel en nuestro conjunto de datos actual cambiando los canales a un código de dos letras: 'youtube' tiene que ser cambiado a 'yt' y 'facebook' tiene que ser cambiado a 'fb'.

UPDATE influencer_list
SET     influencer_channel = CASE influencer_channel 
 			  WHEN 'youtube' THEN 'yt'
			  WHEN 'facebook' THEN 'fb'
			  ELSE 'invalid value'
			  END;

Así es como quedará la tabla influencer_list después de la actualización:

influencer_nameinfluencer_channelyoutube_channelfb_channelmonth_yeartotal_views
LouisythungryLouisJan_20213200
JanetfbstylenmakeupJan_2021423444
MichaelfbInfl_brandXJan_20212322
MichaelfbInfl_brandXFeb_2021240000

Observará que "youtube" ha sido sustituido por "yt" y "facebook" ha sido sustituido por "fb" en la columna influencer_channel.

También puedes utilizar CASE para eliminar o insertar filas en tus tablas. Lea este artículo sobre el uso de CASE con sentencias de modificación de datos para obtener más detalles.

¿Listo para usar CASE en las consultas SQL?

Después de todos estos ejemplos, estoy seguro de que tienes una mejor idea de cómo funciona CASE en SQL y las diversas aplicaciones potenciales de la sentencia. Entonces, ¡es hora de que pongas tu aprendizaje en acción! Leer sobre SQL seguramente te ayudará a aprender, pero si quieres convertirte en un experto, tu mantra es "¡Practica!".

También te recomiendo un buen curso de práctica de SQL. El curso de prácticas de LearnSQL.es utiliza ejemplos prácticos y casos de uso, y no es necesario configurar nada para empezar: basta con Internet y un navegador.

Cuantas más consultas escribas, mejor te harás con CASE y otros comandos SQL. ¿A qué espera? Empieza ahora mismo.