Course
Sentencias CASE en PostgreSQL
Las expresiones condicionales son uno de los elementos fundamentales de cualquier paradigma de programación. Las expresiones condicionales habituales incluyen los bloques if-else
y los casos switch
. Puedes formular expresiones condicionales en PostgreSQL utilizando WHEN-THEN
case, que es muy similar a los bloques de if-else
. En este tutorial aprenderás cómo hacerlo.
Antes de empezar a escribir consultas de condiciones, es importante que configures una base de datos PostgreSQL local. Lo harás en la primera sección de este tutorial.
Nota: Para poder seguir este tutorial necesitas conocer los conceptos básicos de SQL y PostgreSQL. No dudes en refrescar los conceptos básicos con los siguientes recursos:
Configurar una base de datos PostgreSQL localmente
Puedes utilizar este archivo de copia de seguridad y restaurarlo en tu servidor PostgreSQL. Si quieres saber cómo hacerlo, puedes seguir este artículo. Después de restaurar correctamente la copia de seguridad, deberías poder ver estas tablas en la base de datos -
- países
- route_table
- station_table
- train_table
Este tutorial, sin embargo, sólo utiliza la tabla countries
. Explora libremente las tablas proporcionadas en la copia de seguridad de la base de datos. Además, puedes crear tus propias bases de datos y tablas. Si has restaurado la copia de seguridad de la base de datos, ya deberías tener una tabla (con los datos de los distintos países del mundo). Exploremos ahora muy brevemente la tabla countries
.
Explorar la countries
tabla muy brevemente
Tras restaurar la base de datos, puedes ver la tabla en la interfaz pgAdmin
que viene con la instalación por defecto de PostgreSQL. Al ejecutar una simple sentencia SELECT
, conocerás las columnas, sus tipos de datos y también las filas que contiene la tabla -
La tabla contiene datos sobre un total de 206 países diferentes de varias regiones del mundo. ¿Cuántas regiones exactamente? La consulta siguiente debería darte la respuesta a la pregunta.
SELECT COUNT(DISTINCT(region)) from countries;
Resulta que en esta tabla hay 23 regiones diferentes, como Europa Occidental, Polinesia, Oriente Medio, etc. Puedes explorar la tabla con tus propias preguntas rápidas y, por el camino, puede que descubras datos interesantes. Veamos ahora la anatomía de un PostgreSQL básico CASE
.
Conviértete en Ingeniero de Datos
Introducción a PostgreSQL CASE
A continuación se describe la forma general de un caso PostgreSQL con la construcción WHEN-THEN
-
CASE
WHEN condition_1 THEN result_1
WHEN condition_2 THEN result_2
...
ELSE result_n
END
He aquí algunos puntos críticos que debes tener en cuenta al construir CASE
s en PostgreSQL:
-
Cada condición es una expresión booleana y en función de su salida se elige el resultado. Si todas las expresiones correspondientes a
WHEN
se evalúan comoFalse
, entonces se muestra el resultado correspondiente a la parteELSE
. En caso de que no especifiques la parteELSE
; la consulta devolverá null. -
Una condición se aplica generalmente sobre una columna presente en la tabla sobre la que operas. Las construcciones de consulta condicional como las anteriores se suelen hacer con sentencias
SELECT
. Ten en cuenta que, la columna debe estar presente en la sentenciaSELECT
de tu consulta, sobre la que estás especificando las expresiones booleanas (enCASE
). Pero cuando utilicesCASE
junto con una cláusula where, no es necesario que sigas este procedimiento (más adelante hablaremos de ello). -
El tipo de datos de los resultados tiene que ser uniforme. No puedes devolver un
string
enresult_1
y uninteger
enresult_2
y así sucesivamente.
Veamos ahora algunos ejemplos.
Escribir PostgreSQL CASE
s
Empecemos por lo sencillo. Ahora escribirás un CASE
para agrupar los países con respecto al año de independencia. Los años de independencia se registran en la columna indep_year
. Supongamos que tienes tres grupos de años de independencia de los países que debes seguir. Para ello crearás tres grupos de años de independencia -
- Antes de 1900 (
indep_year < 1900
) - Entre 1900 y 1930 (
indep_year <= 1930
) - Después de 1930 (
indep_year > 1930
)
El resultado final de la consulta debe contener las siguientes columnas -
- nombre (del país)
- continente (al que pertenece el país)
- indep_year
- Y el grupo de años de independencia que crearás. Llamémoslo
indep_year_group
.
Escribamos ahora la consulta -
SELECT name, continent, indep_year,
CASE WHEN indep_year < 1900 THEN 'before 1900'
WHEN indep_year <= 1930 THEN 'between 1900 and 1930'
ELSE 'after 1930' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
(La consulta está inspirada en el curso "Unir datos en SQL " de DataCamp).
Al ejecutar la consulta, verás muchos países como Palestina, Puerto Rico, etc. para los que no se proporciona ningún año de independencia en la tabla. De ahí que hayan conseguido el grupo between 1900 and 1930
.
PostgreSQL CASE
s puede tener varias condiciones. Hay un puñado de entradas en la tabla en las que el nombre del país y la capital coinciden. Puedes añadirlo a tu CASE
previamente construido -
SELECT name, continent, indep_year,
CASE WHEN (indep_year < 1900) AND (countries.name = countries.capital) THEN 'before 1900 and capital same'
WHEN indep_year <= 1930 AND (countries.name = countries.capital) THEN 'between 1900 and 1930 and capital same'
ELSE 'after 1930_and_no_same_capital' END
AS indep_year_group
FROM countries
ORDER BY indep_year_group;
Otra cosa interesante de CASE
s es que puedes emparejarlas con funciones agregadas como SUM()
. Para implementar una CASE
con la función agregada SUM()
, necesitarás una tabla diferente en la que esto pueda ser una buena idea. Vamos a crear una tabla simple llamada student_grades
que tenga las siguientes columnas y tipos de datos -
- student_name (string)
- student_stream (string)
- student_grade (character)
La siguiente consulta crea la tabla por ti -
CREATE TABLE student_grades
(student_name character varying,
student_stream character varying,
student_grade character);
Insertemos ahora algunos registros en la tabla. Puedes hacerlo utilizando algunas frases de INSERT
. Digamos que después de las inserciones, la tabla student_grades
tiene ahora los siguientes registros -
Ahora, escribirás un CASE
para obtener la suma de los alumnos que pertenecen a determinados grupos de grado. Como puedes ver, según las instancias de la tabla, hay tres grados distintos: A, B y C. La consulta condicional debería devolver un resultado similar al siguiente -
La consulta para este -
SELECT
SUM (
CASE
WHEN student_grade = 'A' THEN
1
ELSE
0
END
) AS "High Scoring",
SUM (
CASE
WHEN student_grade = 'B' THEN
1
ELSE
0
END
) AS "Mid Scoring",
SUM (
CASE
WHEN student_grade = 'C' THEN
1
ELSE
0
END
) AS "Low Scoring"
FROM
student_grades;
Así es como puedes emparejar CASE
con funciones agregadas para obtener datos interesantes sobre los datos.
Conclusión y lecturas complementarias
Eso es todo por este tutorial. En este tutorial, has aprendido a incorporar if-then
como condicionamiento en tus consultas SQL para obtener informes interesantes. Has trabajado con varios ejemplos para reforzar esta habilidad. Si buscas ejercicios más desafiantes, deberías realizar los siguientes cursos DataCamp sobre SQL -
No dudes en hacerme llegar tus preguntas sobre este tutorial a través de la sección Comments
.
Certifícate en SQL
Cursos de SQL
Course
SQL intermedio
Course