Los rangos son Funciones.

Hay varias maneras de elegir valores que necesito, veremos tres formas distintas y luego los Rangos.

Todas dan el mismo resultado, pero los Rangos van un poco más lejos.

CURSO

Para seleccionar registros cuyo campo (numérico) tenga un valor entre dos valores determinados, podemos hacer de esta forma:

  1. Seleccionar alumnos con Tutor_id entre 1 y 10.

WHERE, IN Set de Opciones IN

SELECT *
FROM platzi.alumnos
WHERE tutor_id IN (1,2,3,4,5,6,7,8,9,10);

WHERE, AND Operador de Comparación

SELECT *
FROM platzi.alumnos
WHERE tutor_id >=1 
	AND tutor_id <=10;

WHERE, BETWEEN

SELECT *
FROM platzi.alumnos
WHERE tutor_id BETWEEN 1 AND 10;

RANGOS

Son las FUNCIONES para generar RANGOS de distintos Tipos de Datos:

FUNCION TIPO DE DATO
int4range Rango Integer
int8range Rango Bigint
numrange Rango Numérico, decimales
tsrange Rango Timestamp pero sin zona horaria
tstzrange Rango Timestamp pero con zona horaria
daterange Rango Fecha
TIPOS DE RANGOS EN POSTGRE

int4range

SELECT int4range(10, 20);       -- [10, 20)
SELECT int4range(10, 20) @> 3;  -- FALSE
SELECT int4range(10, 20) @> 10; -- TRUE
SELECT int4range(10, 20) @> 20; -- FALSE
SELECT UPPER(int4range(15, 25));
SELECT int4range(10, 20) * int4range(15, 25);

Ejemplo Practico:

SELECT *
FROM platzi_alumnos
WHERE int4range(10, 20) @> tutor_id;

numrange

SELECT numrange(11.1, 22.2); -- [11.1, 22.2)
SELECT numrange(20.0, 30.0); -- [20.0, 30.0)
SELECT numrange(11.1, 22.2) && numrange(20.0, 30.0); -- TRUE
SELECT numrange(11.1, 19.9) && numrange(20.0, 30.0); -- FALSE
SELECT LOWER(int4range(15, 25));
SELECT Isempty(numrange(1, 5));

RETO

Intersección entre ID de Tutores e ID de carreras.

int4range

SELECT int4range(MIN(tutor_id), MAX(tutor_id)) *
		int4range(MIN(carrera_id), MAX(carrera_id))
FROM platzi.alumnos;

numrange

SELECT numrange(
	(SELECT MIN (tutor_id) FROM platzi.alumnos),
	(SELECT MAX (tutor_id) FROM platzi.alumnos)
) * numrange(
	(SELECT MIN (carrera_id) FROM platzi.alumnos),
	(SELECT MAX (carrera_id) FROM platzi.alumnos)
);