Volver al blog

CASE… WHEN… ELSE… END

12 de noviembre de 2022

CASE… WHEN… ELSE… END es quizás una de las sentencias SQL más usadas y universales, vamos a profundizar en ella…

¿Sabías que podés usar CASE con funciones de agregación? ¡Hoy vas a saber más sobre eso!

Imagen del post Case When Else End

¿Cómo debería usar CASE… WHEN… ELSE… END?

La sentencia, como se describe, debería usarse con fines de etiquetado.

SELECT CASE WHEN user='test user' THEN [DECLARE VARIABLE OR STATEMENT]
WHEN user='test user 2' THEN [DECLARE ANOTHER VARIABLE OR STATEMENT]
ELSE [DECLARE ANOTHER VARIABLE OR STATEMENT]
END AS CASE_TEST FROM TABLE [WHERE ...]

¿Puedo usar CASE… WHEN… ELSE… END en la cláusula WHERE?

Sí, podés usar CASE… WHEN… ELSE… END en una cláusula WHERE.

SELECT * FROM TABLE_USERS WHERE POINTS = CASE WHEN user = 'test user' THEN '100' ELSE '200' END

Esto va a hacer una diferencia de equivalencia en tu sentencia SQL entre el usuario ‘test user’ y el resto de los usuarios.

¿Qué tan útil es usar CASE… WHEN… ELSE… END en una subconsulta?

En realidad, es muy útil, mirá esta consulta:

SELECT A.* FROM (SELECT user, CASE WHEN user='test user' THEN '100' ELSE '200' END AS needed_points, SUM(POINTS) as total_points FROM TABLE_USER_POINTS GROUP BY 1) A
WHERE A.needed_points < A.total_points

Como podés ver, acá hicimos un CASE WHEN para diferenciar a los usuarios como en la sentencia anterior, pero después usamos ese caso para establecer un umbral y obtener solo los usuarios que tienen una suma de puntos mayor a ese umbral.

CASE… WHEN… ELSE… END con Funciones de Agregación

Empecemos por lo básico acá, ¿qué pasa si necesitás un mensaje si el COUNT(*) de tu tabla te da más de 10.000 filas?

SELECT CASE WHEN COUNT(*) > 10000 THEN 'MORE THAN 10 THOUSAND ROWS' ELSE 'LESS OR EQUAL THAN 10 THOUSAND ROWS' END AS ROW_MESSAGE FROM TABLE [WHERE ...]

Contando cuándo se cumplen una o más condiciones

Esta puede ser un poco complicada de entender al principio… Pero usando CASE… WHEN… ELSE… END podríamos contar valores cuando se cumplen una o más condiciones. Por ejemplo:

SELECT CASE WHEN SUBSTRING(user,1,2)='A' THEN SUM(1) ELSE SUM(0) END AS users_starting_with_A,
CASE WHEN SUBSTRING(user,1,2)='B' THEN SUM(1) ELSE SUM(0) END AS users_starting_with_B,
CASE WHEN (SUBSTRING(user,1,2)<>'A' AND SUBSTRING(user,1,2)<>'B') THEN SUM(1) ELSE SUM(0) END AS users_not_starting_with_A_or_B 
FROM TABLE WHERE [...]

CASE… WHEN… ELSE… END con sentencias JOIN

CASE… WHEN… ELSE… END también se puede usar en sentencias join para definir una condición para hacer ese join. Por ejemplo:

SELECT * FROM table_users A
LEFT JOIN table_user_points B
ON A.user=B.user
AND B.points> CASE WHEN A.user='test user' THEN 100 ELSE 200 END 

Acá le dijimos a SQL que haga coincidir a cada usuario con un left join entre tablas, pero también le estamos diciendo a SQL que solo queremos los usuarios con más de 200 puntos, A MENOS QUE sea ‘test user’, que necesita más de 100 puntos.

Conclusión

Todavía hay muchas más formas de usar CASE… WHEN… ELSE… END. Hicimos este artículo para un nivel introductorio. Como vimos, podríamos usar CASE… WHEN… ELSE… END para una serie de propósitos distintos.

Para aprender más sobre esto te recomiendo leer los documentos de Teradata sobre el tema, ya que es una base de conocimiento muy completa y universal al respecto.

Read in English