5th Dec 2022 Lectura de 6 minutos Cómo usar CASE en ORDER BY en SQL Tihomir Babic SQL aprender SQL CASE Índice ¿Qué es una sentencia CASE? CASE en SELECT ¿Se utiliza CASE sólo en las sentencias SELECT? ¿Cuándo se usa una sentencia CASE en un ORDER BY? CASE en ORDER BY Otros usos de la sentencia CASE ¿Quiere saber más sobre la sentencia CASE? Este artículo le mostrará cómo y cuándo utilizar CASE en una cláusula ORDER BY . ¿Ha utilizado alguna vez una sentencia CASE? Seguro que sí, al menos en una sentencia SELECT. Pero, ¿lo has utilizado alguna vez en una cláusula ORDER BY? ¿No? Lo harás, una vez que te enseñe cómo hacerlo. No te preocupes si nunca has utilizado una sentencia CASE. Te lo mostraré y explicaré con un breve ejemplo. Luego pasaré a otros usos de la sentencia CASE, especialmente en una cláusula ORDER BY. Si quieres varias fuentes de conocimiento, aquí hay un artículo que explica lo que es CASE. Y aquí hay otro que explica cómo puedes usar CASE para añadir lógica a un SELECT. ¿Qué es una sentencia CASE? En pocas palabras, es una sentencia SQL que recorre y devuelve valores según las condiciones especificadas. Es la forma en que SQL escribe la lógica de IF-THEN-ELSE y consiste en cinco palabras clave: CASE, WHEN, THEN, ELSE, y END. Cuando se utiliza en una sentencia SELECT, funciona así: si se case cuando se cumple la condición entonces devuelve un determinado valor, o else devolver algún otro valor, y end comprobar las condiciones. La sintaxis tiene el siguiente aspecto: CASE WHEN THEN , WHEN THEN ELSE END AS Creo que esta sintaxis se explica mejor con un ejemplo. El uso más básico de CASE es en una sentencia SELECT, así que empecemos con un ejemplo. CASE en SELECT Esta es la tabla films que utilizaré en este ejemplo: idfilm_titleyeardirector 1True Grit2010The Coen Brothers 2Da 5 Bloods2020Spike Lee 3Alien1979Ridley Scott 4The Bridges Of Madison County1995Clint Eastwood 5Get Out2017Jordan Peele 6Annie Hall1977Woody Allen 7Goodfellas1990Martin Scorsese 8Dr.Strangelove1964Stanley Kubrick 9You Were Never Really Here2017Lynne Ramsay 10Albert Nobbs2011Rodrigo Garcia Supongamos que queremos escribir una consulta que, junto con las columnas de la tabla, muestre una columna adicional con el siglo en el que se filmó el título. Un ejemplo de consulta es el siguiente: SELECT *, CASE WHEN year < 2001 THEN '20th-century film' ELSE '21st-century film' END AS century FROM films; Esta consulta selecciona todas las columnas de la tabla films. A continuación, utiliza una sentencia CASE para poner los valores en una nueva columna llamada siglo. Esta sentencia significa: cuando la columna año está por debajo (es decir, es más antigua que) de 2001, entonces el valor de la columna siglo debe ser "película del siglo XX". Si no lo es, el valor debe ser "película del siglo XXI". Veamos los resultados de la consulta: idfilm_titleyeardirectorcentury 1True Grit2010The Coen Brothers21st-century film 2Da 5 Bloods2020Spike Lee21st-century film 3Alien1979Ridley Scott20th-century film 4The Bridges Of Madison County1995Clint Eastwood20th-century film 5Get Out2017Jordan Peele21st-century film 6Annie Hall1977Woody Allen20th-century film 7Goodfellas1990Martin Scorsese20th-century film 8Dr.Strangelove1964Stanley Kubrick20th-century film 9You Were Never Really Here2017Lynne Ramsay21st-century film 10Albert Nobbs2011Rodrigo Garcia21st-century film ¿Se utiliza CASE sólo en las sentencias SELECT? No. Aunque se utiliza con mayor frecuencia, CASE no se limita a las sentencias SELECT. Por ejemplo, puede utilizarla en cláusulas como IN, WHERE, HAVING y ORDER BY. Utilizar una vez una sentencia CASE en una consulta no significa que haya alcanzado su cuota de uso. Puede utilizarla varias veces en una misma consulta. O puede utilizarla sólo una vez. Esto significa que no necesitas tener CASE en SELECT si sólo quieres usarlo en un ORDER BY. Hablando de eso, el punto principal de este artículo es mostrarte cómo funciona la sentencia CASE en una cláusula ORDER BY. Ahora estoy llegando a eso. ¿Cuándo se usa una sentencia CASE en un ORDER BY? La cláusula ORDER BY se utiliza para ordenar el resultado en orden ascendente o descendente. ¿Quieres que te refresque cómo funciona? No hay problema. Este artículo explica lo que hace un ORDER BY. Introducir una sentencia CASE aquí puede mejorar su ORDER BY al permitirle ordenar los resultados por algún otro (y múltiple) criterio. Por ejemplo, puede utilizarla cuando desee ordenar los valores de las cadenas según algún criterio distinto del orden alfabético, como por ejemplo por las posiciones jerárquicas de los cargos en una empresa. El uso de una sentencia CASE también le permite ordenar los datos según múltiples criterios. Por ejemplo, puede querer ordenar a sus usuarios por país y nombre, pero en cambio por país y estado si son de Estados Unidos. Le mostraré un ejemplo práctico y sabrá inmediatamente de qué estoy hablando. CASE en ORDER BY En este caso, trabajaremos con la tabla shopsque contiene los siguientes datos: idshop_namecountrystatecity 1Zoltan's shopCroatiaNULLZagreb 2Ante PortasCroatiaNULLRijeka 3Green Mile 1USATennesseeMemphis 4Jan Pieter's PitaCroatiaNULLSplit 5Green Mile 2USATennesseeChattanooga 6Green Mile 3USANew OrleansLouisiana 7Krystyna's shopHungaryNULLPecs 8Quinn & SandyHungaryNULLGyor 9Green Mile 4USACaliforniaSan Francisco 10FragolaCroatiaNULLOsijek Primero tenemos que ordenar los datos por country. Luego, cada tienda dentro del mismo país debe ser ordenada por city. Si la tienda está en Estados Unidos, tenemos que ordenarla a continuación por la columna state. El código que resuelve este pequeño problema es: SELECT * FROM shops ORDER BY country, CASE WHEN country = 'USA' THEN state ELSE city END; Selecciona todas las columnas de la tabla shops. A continuación, ordena el resultado primero por país y luego por los criterios de la sentencia CASE. Dice que si country = 'USA', entonces el resultado se ordena por estado. Si no lo es, entonces se ordena por city. Parece que este código devuelve efectivamente el resultado deseado: idshop_namecountrystatecity 10FragolaCroatiaNULLOsijek 2Ante PortasCroatiaNULLRijeka 4Jan Pieter's PitaCroatiaNULLSplit 1Zoltan's shopCroatiaNULLZagreb 8Quinn & SandyHungaryNULLGyor 7Krystyna's shopHungaryNULLPecs 9Green Mile 4USACaliforniaSan Francisco 6Green Mile 3USANew OrleansLouisiana 5Green Mile 2USATennesseeChattanooga 3Green Mile 1USATennesseeMemphis Otros usos de la sentencia CASE También puedes utilizar la sentencia CASE con otras palabras clave además de las que he mencionado. Por ejemplo, puede usarla con DESC. Digamos que la pongo en el código anterior: SELECT * FROM shops ORDER BY country, CASE WHEN country = 'USA' THEN state ELSE city END DESC; En el ejemplo anterior, he omitido la palabra clave DESC. El resultado se clasifica por defecto en orden ascendente. Escribiendo DESC después de la sentencia CASE, se obtienen las tiendas de los países ordenadas por city en orden descendente, no ascendente como en el caso anterior. Las tiendas de Estados Unidos se ordenan por state pero esta vez en orden descendente. Podemos ver el resultado aquí: idshop_namecountrystatecity 1Zoltan's shopCroatiaNULLZagreb 4Jan Pieter's PitaCroatiaNULLSplit 2Ante PortasCroatiaNULLRijeka 10FragolaCroatiaNULLOsijek 7Krystyna's shopHungaryNULLPecs 8Quinn & SandyHungaryNULLGyor 5Green Mile 2USATennesseeChattanooga 3Green Mile 1USATennesseeMemphis 6Green Mile 3USANew OrleansLouisiana 9Green Mile 4USACaliforniaSan Francisco También puede utilizar las sentencias CASE con UPDATE, INSERT, y DELETE. Son las llamadas sentencias modificadoras de datos. Aquí hay un artículo que explica cómo utilizar CASE con esas sentencias. También puede utilizarlo para la integración condicional. ¿Quiere saber más sobre la sentencia CASE? Probablemente le sorprenda que las sentencias CASE no se utilicen sólo en las sentencias SELECT. Ha visto que es muy útil cuando se utiliza con un ORDER BY. Abre las posibilidades de ordenar los resultados de la consulta. Pero eso no es todo. La sentencia CASE puede utilizarse con algunas otras sentencias y palabras clave, como las sentencias de modificación de datos, o incluso DESC, IN, WHERE y HAVING. Ahora es el momento de aprender más y practicar lo aprendido. Todo eso lo consigues con nuestro curso Funciones estándar de SQL . Este curso forma parte de un tema mucho más amplio denominado Curso completo de SQL. ¿A qué esperas? Tags: SQL aprender SQL CASE