5th Dec 2022 Lectura de 10 minutos Cómo utilizar CASE en SQL Himanshu Kathuria SQL aprender SQL CASE Índice ¿Qué es la sentencia CASE? Uso de CASE en la cláusula ORDER BY Uso de CASE en la cláusula WHERE Uso de CASE en la cláusula HAVING Uso de CASE en una sentencia UPDATE ¿Listo para usar CASE en las consultas 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. Tags: SQL aprender SQL CASE