PostgreSQL 9.2 introduce un nuovo tipo di dato: RANGE
. Questo tipo di dato rappresenta un intervallo di valori consecutivi.
I valori ai limiti dell’intervallo possono essere considerati o meno parte di esso. Similmente a quanto avviene in ambito matematico, si utilizzano le parentesi quadre in caso di limite incluso, quelle tonde in caso di limite escluso.
La sintassi per definire un dato di tipo RANGE
è:
-- Usando il CAST da una stringa SELECT '(5,100)'::numrange; -- Usando l'apposito costruttore SELECT tstzrange(now(), now() + '1 day'::INTERVAL, '()');
A corredo del tipo di dato, sono stati introdotti numerosi operatori e alcune funzioni di utilità.
Ad esempio, è possibile controllare facilmente che un valore sia contenuto o meno in un dato intervallo.
Ecco un esempio di utilizzo banale:
BEGIN; CREATE TABLE prodotti AS SELECT md5(id::TEXT) AS codice_prodotto, round(random() * 1000)+1 AS prezzo FROM generate_series(1,10000) id; -- Seleziona prodotti con prezzo da 1 a 50 € SELECT codice_prodotto FROM prodotti WHERE '(1,50)'::numrange @> prezzo::NUMERIC; -- Seleziona prodotti con prezzo da 10 a 50 € SELECT codice_prodotto FROM prodotti WHERE '(10,50)'::numrange @> prezzo::NUMERIC; -- Seleziona prodotti con prezzo da 50 a 1000 € SELECT codice_prodotto FROM prodotti WHERE '(50,1000)'::numrange @> prezzo::NUMERIC; ROLLBACK;
Nella prima riga, apriamo una transazione con BEGIN;
.
Successivamente, creiamo una tabella contente dei dati generati casualmente. La tabella rappresenta i prodotti di un negozio, e contiene un codice_prodotto
alfanumerico e un prezzo
compreso tra 1 e 1000 euro.
Le successive tre SELECT
servono a selezionare i prodotti in base alla fascia di prezzo, sfruttando l’operatore @>
, che indica l’appartenenza ad un range di un valore scalare.
La lista completa di operatori e funzioni disponibili è disponibile nella documentazione ufficiale.
Non è difficile immaginare l’impatto che questa funzionalità, unica di Postgres, avrà in ambito data warehousing, scientifico, finanziaria e organizzativo (e.g. calendari).
This Post Has 0 Comments