Lavorare con gli array non si limita solo a crearli e salvarli — spesso serve estrarre singoli elementi o analizzare il loro contenuto. PostgreSQL offre diverse funzioni built-in per queste operazioni. Vediamole una per una.
Funzione unnest(): spacchettare un array
La funzione unnest() letteralmente spacchetta l’array, trasformando ogni elemento in una riga separata. È super utile se vuoi lavorare con i dati dell’array come se fossero una tabella.
Esempio 1: Spacchettare un array semplice
Supponiamo di avere un array con i nomi delle facoltà:
SELECT ARRAY['Informatica', 'Matematica', 'Fisica'] AS facoltà;
Ora vogliamo estrarre ogni elemento come riga separata. Usiamo unnest():
SELECT unnest(ARRAY['Informatica', 'Matematica', 'Fisica']) AS facoltà;
Risultato:
| facoltà |
|---|
| Informatica |
| Matematica |
| Fisica |
Esempio 2: Spacchettare un array in una tabella
Immagina di avere una tabella courses:
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT,
tags TEXT[]
);
INSERT INTO courses (course_name, tags)
VALUES
('Algoritmi', ARRAY['Programmazione', 'Informatica']),
('Algebra lineare', ARRAY['Matematica', 'Algebra']),
('Fisica base', ARRAY['Fisica', 'Generale']);
Ora estraiamo tutti i tag dall’array:
SELECT course_name, unnest(tags) AS tag
FROM courses;
Risultato:
| course_name | tag |
|---|---|
| Algoritmi | Programmazione |
| Algoritmi | Informatica |
| Algebra lineare | Matematica |
| Algebra lineare | Algebra |
| Fisica base | Fisica |
| Fisica base | Generale |
Come vedi, ogni elemento dell’array diventa una riga separata nella tabella.
Funzione array_length(): determinare la dimensione di un array
Un’altra funzione fondamentale per lavorare con gli array è array_length(). Ti restituisce la lunghezza dell’array (cioè il numero di elementi) per la dimensione che indichi.
Esempio 1: Numero di elementi in un array monodimensionale
Prendiamo un array:
SELECT ARRAY['Mela', 'Banana', 'Arancia'] AS frutti;
Se vuoi sapere quanti frutti ci sono nell’array:
SELECT array_length(ARRAY['Mela', 'Banana', 'Arancia'], 1) AS lunghezza;
Risultato:
| lunghezza |
|---|
| 3 |
Qui 1 indica la dimensione dell’array. Gli array in PostgreSQL possono avere più dimensioni (tipo array bidimensionali), ma di questo ne parliamo un’altra volta.
Esempio 2: Numero di elementi in un array di una tabella
Vediamo quanti tag ha ogni corso:
SELECT course_name, array_length(tags, 1) AS numero_tag
FROM courses;
Risultato:
| course_name | numero_tag |
|---|---|
| Algoritmi | 2 |
| Algebra lineare | 2 |
| Fisica base | 2 |
La funzione ti dice semplicemente: “Ehi, qui ci sono due elementi!”, e già questo semplifica un sacco l’analisi dei dati.
Funzione array_position(): cercare un valore in un array
Ora, immagina di dover cercare un elemento specifico in un array. La funzione array_position() ti salva: ti restituisce la posizione della prima occorrenza dell’elemento.
Esempio 1: Cercare un elemento
Supponiamo di avere un array:
SELECT ARRAY['Rosso', 'Blu', 'Verde', 'Giallo'] AS colori;
Proviamo a trovare la posizione dell’elemento "Blu":
SELECT array_position(ARRAY['Rosso', 'Blu', 'Verde', 'Giallo'], 'Blu') AS posizione;
Risultato:
| posizione |
|---|
| 2 |
Se l’elemento non c’è, la funzione restituisce NULL. Vediamo:
SELECT array_position(ARRAY['Rosso', 'Blu', 'Verde', 'Giallo'], 'Nero') AS posizione;
Risultato:
| posizione |
|---|
| NULL |
Esempio 2: Cercare in un array di una tabella
Vuoi sapere quale corso ha il tag "Informatica". Prima troviamo le righe giuste:
SELECT course_name, array_position(tags, 'Informatica') AS posizione
FROM courses;
Risultato:
| course_name | posizione |
|---|---|
| Algoritmi | 2 |
| Algebra lineare | NULL |
| Fisica base | NULL |
Ora aggiungi un filtro per tenere solo le righe dove il tag c’è:
SELECT course_name
FROM courses
WHERE array_position(tags, 'Informatica') IS NOT NULL;
Risultato:
| course_name |
|---|
| Algoritmi |
La funzione array_position() ti permette di trovare al volo i dati dentro un array, ed è una delle più utili per lavorare con gli array in PostgreSQL.
Applicazione pratica delle funzioni
unnest()— usala per trasformare gli array in righe. È fondamentale per analisi dati, report e gestione dei tag.array_length()— perfetta per controllare la lunghezza degli array. Ad esempio, puoi usarla per validare i dati: controlla che l’array non sia vuoto.array_position()— uno strumento top per cercare elementi, che siano categorie di prodotti, partecipazione di uno studente a un progetto o parole chiave nella descrizione.
Errori tipici nell’uso delle funzioni
unnest()può raddoppiare il numero di righe se la usi su array in più colonne contemporaneamente. Si risolve facilmente aggiungendoJOIN LATERALoCROSS JOIN, ma occhio!array_length()restituisceNULLper un array vuoto. Se il tuo array può essere vuoto, controllalo a parte.array_position()può restituireNULLse l’elemento non c’è. Quindi meglio sempre gestire questo caso nei filtri (IS NOT NULL).
Esempi dalla pratica reale
Gli array in PostgreSQL non sono solo roba teorica, ma strumenti che funzionano alla grande nei progetti veri. Tipo, se hai un blog e ogni articolo ha una lista di tag — l’array ti permette di filtrare facilmente gli articoli per argomento o anche fare una top delle categorie più popolari.
Oppure, se analizzi il comportamento degli utenti che scelgono più corsi o prodotti. Tutte queste preferenze le puoi salvare in un array — e lavorarci in modo super comodo.
E poi gli array aiutano anche a validare i dati: con array_length() puoi, ad esempio, limitare il numero di elementi — tipo per non far scegliere all’utente più di cinque opzioni.
GO TO FULL VERSION