---
title: "CASE… WHEN… ELSE… END"
slug: "case-when-else-end"
published_at: "2022-11-12T08:27:54.000Z"
categories: "SQL Avanzado, Tutoriales de SQL"
tags: "Funciones agregadas, CASE, ELSE, SQL, Tutorial, WHEN"
---

# CASE… WHEN… ELSE… END

> CASE… WHEN… ELSE… END es quizás una de las sentencias SQL más usadas. ¿Sabías que podés usar CASE con funciones de agregación?

**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](/blog/case-when-else-end/casewhenft-1024x536.png)

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

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

```sql
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.

```sql
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:

```sql
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](/es/what-is-an-aggregate-function)

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?

```sql
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:

```sql
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:

```sql
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](https://docs.teradata.com/r/kmuOwjp1zEYg98JsB8fu_A/LMPRZogKY199S9IXIdCBOQ) sobre el tema, ya que es una base de conocimiento muy completa y universal al respecto.

