Home > database > PostgreSQL: eseguire ricerche su colonne di tipo array

PostgreSQL: eseguire ricerche su colonne di tipo array

20 luglio 2011 No Comments

PostgreSQL permette di creare delle colonne come array di tipi di dati base. Praticamente è possibile inserire array di numeri integer o real,  testi, timestamp, boolean, ecc…
Ovviamente PostgreSQL mette a disposizione anche una serie di operatori ad hoc per la ricerca sugli array.

Oltre ai classici operatori di comparazione (uguale, maggiore, minore, …) ce ne sono 3 che possono essere molto utili: containsis contained by, overlap.

Prima di iniziare a vedere come funzionano creiamo una tabella di test molto semplice (una colonna con id autoincrementale ed una colonna di tipo array di smallint) e inseriamo alcuni dati:

-- Creazione della tabella
CREATE TABLE test1
(
  id bigserial NOT NULL,
  parametro smallint[],
  CONSTRAINT test1_pkey PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);

-- Impostazione proprietario tabella
ALTER TABLE test1 OWNER TO postgres;

-- Inserimento records per test
INSERT INTO test1(parametro) VALUES ('{1,2,3}');
INSERT INTO test1(parametro) VALUES ('{1,2,4,5,6}');
INSERT INTO test1(parametro) VALUES ('{6,8}');
INSERT INTO test1(parametro) VALUES ('{1,7,8,9}');

CONTAINS – array1 @> array2

L’operatore contains permette di trovare i record nei quali l’array2 è contenuto nell’array1, ovvero quando tutti i valori dell’array2 sono contenuti in array1.
Con la query:

SELECT * FROM test1 WHERE test1.parametro @> '{1,2}'

verranno trovate le righe con i seguenti array:

{1,2,3}
{1,2,4,5,6}

IS CONTAINED BY – array1 <@ array2

L’operatore is contained by permette di trovare i record nei quali l’array1 è contenuto nell’array2, ovvero quando tutti i valori dell’array1 sono contenuti in array2.
Con la query:

SELECT * FROM test1 WHERE test1.parametro <@ '{6,7,8,10}'

verrà trovata (in base ai valori inseriti precedentemente) solo una riga, quella con l’array:

{6,8}

in quanto entrambi i numeri 6 e 8 sono contenuti nell’array di ricerca.

OVERLAP – array1 && array2

L’operatore overlap permette di trovare i record nei quali i due array hanno almeno un elemento in comune.
Con la query:

SELECT * FROM test1 WHERE test1.parametro && '{6,7,8,10}'

trova le righe con gli array:

{1,2,4,5,6}
{6,8}
{1,7,8,9}

Per una lista completa degli operatori disponibili per la gestione degli array vedere la tabella a questo indirizzo:  http://www.postgresql.org/docs/current/static/intarray.html

Tags: database postgres

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>