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.
Para seleccionar registros cuyo campo (numérico) tenga un valor entre dos valores determinados, podemos hacer de esta forma:
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;
Son las FUNCIONES para generar RANGOS de distintos Tipos de Datos:
@> se coloca para saber si un Valor se encuentra dentro de un rango.&& saber si hay elementos en común entre dos Rangos, si los hay devuelve True, sino False. Sirve para Comparar entre Rangos.* devuelve la intersección entre ambos Rangos, me da los limites inferior y superior de los valores que tienen en común.| 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 |
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;
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));
Intersección entre ID de Tutores e ID de carreras.
SELECT int4range(MIN(tutor_id), MAX(tutor_id)) *
int4range(MIN(carrera_id), MAX(carrera_id))
FROM platzi.alumnos;
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)
);