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

Cómo usar CASE en ORDER BY en SQL

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?