A volte non basta solo leggere gli array, ma bisogna anche modificarli: aggiungere un nuovo valore, togliere uno vecchio, aggiornare il contenuto. Per fortuna, in PostgreSQL ci sono funzioni apposta che ti permettono di gestire facilmente gli array senza doverli riscrivere a mano: array_append() e array_remove(). Vediamo come funzionano.
Aggiungere elementi a un array con array_append()
La funzione array_append() serve per aggiungere un nuovo elemento alla fine di un array. Prende due argomenti:
- L’array di partenza che vuoi modificare.
- Il valore che vuoi aggiungere all’array.
Esempio 1: Array semplice di numeri
Supponiamo di avere una tabella projects con una colonna team_members dove sono salvati array di ID utente che lavorano su un progetto.
CREATE TABLE projects (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
team_members INT[]
);
-- Aggiungiamo alcune righe
INSERT INTO projects (name, team_members)
VALUES
('Progetto A', ARRAY[1, 2, 3]),
('Progetto B', ARRAY[4, 5]);
Ora abbiamo il progetto "Progetto A" e vogliamo aggiungere un nuovo membro con ID 7 all’array team_members. Usiamo array_append():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Progetto A';
-- Vediamo il risultato:
SELECT * FROM projects;
Risultato:
| id | name | team_members |
|---|---|---|
| 1 | Progetto A | {1,2,3,7} |
| 2 | Progetto B | {4,5} |
Come vedi, il membro con ID 7 è stato aggiunto all’array senza problemi!
Esempio 2: Aggiungere elementi di testo
Lo stesso array_append() si può usare anche con array di altri tipi. Per esempio, aggiungiamo una nuova categoria all’array delle categorie di un prodotto.
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
categories TEXT[]
);
-- Aggiungiamo un prodotto con categorie
INSERT INTO products (name, categories)
VALUES
('Smartphone', ARRAY['Elettronica', 'Gadget']),
('Notebook', ARRAY['Computer', 'Elettronica']);
-- Aggiungiamo la nuova categoria "Popolare" per "Smartphone"
UPDATE products
SET categories = array_append(categories, 'Popolare')
WHERE name = 'Smartphone';
-- Vediamo il risultato:
SELECT * FROM products;
Risultato:
| id | name | categories |
|---|---|---|
| 1 | Smartphone | {Elettronica,Gadget,Popolare} |
| 2 | Notebook | {Computer,Elettronica} |
Rimuovere elementi da un array con array_remove()
Se array_append() è come aggiungere una nuova task a una lista, array_remove() è lo strumento per depennare una task già fatta. Questa funzione prende come argomenti:
- L’array di partenza.
- Il valore che vuoi togliere.
Esempio 1: Rimuovere un elemento da un array di numeri
Torniamo alla tabella projects. Abbiamo scoperto che il membro con ID 7 non lavora più su "Progetto A". Togliamolo dall’array team_members:
UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Progetto A';
-- Vediamo il risultato:
SELECT * FROM projects;
Risultato:
| id | name | team_members |
|---|---|---|
| 1 | Progetto A | {1,2,3} |
| 2 | Progetto B | {4,5} |
La funzione array_remove() ha tolto correttamente il membro con ID 7.
Esempio 2: Rimuovere un elemento di testo
Ora guardiamo la tabella products. Se la categoria "Popolare" non è più attuale per lo smartphone, possiamo toglierla:
UPDATE products
SET categories = array_remove(categories, 'Popolare')
WHERE name = 'Smartphone';
-- Vediamo il risultato:
SELECT * FROM products;
Risultato:
| id | name | categories |
|---|---|---|
| 1 | Smartphone | {Elettronica,Gadget} |
| 2 | Notebook | {Computer,Elettronica} |
se l’elemento che provi a togliere non c’è nell’array, array_remove() lascia l’array così com’è. Molto comodo, perché non dà nessun errore.
Combinare array_append() e array_remove()
A volte bisogna prima assicurarsi che un elemento non sia già nell’array, e solo dopo aggiungerlo. Puoi farlo combinando le funzioni:
Esempio: Aggiungere solo elementi unici
Assicuriamoci che il membro con ID 7 venga aggiunto all’array solo se non c’è già. Usiamo un controllo con array_remove():
UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Progetto A' AND NOT (team_members @> ARRAY[7]);
-- Vediamo il risultato:
SELECT * FROM projects;
Spiegazione:
- L’operatore
@>controlla se l’array contiene l’elemento7. - Se
team_memberscontiene già7, non viene aggiunto di nuovo.
Errori tipici e consigli
1. Provare ad aggiungere NULL a un array. Se provi a usare array_append() con NULL (tipo array_append(team_members, NULL)), verrà aggiunto il valore NULL all’array. Non dà errore, ma magari non è quello che volevi. Per evitarlo, controlla che il valore non sia NULL prima di aggiungerlo.
-- Esempio di controllo:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Progetto A';
2. Tipi di dati diversi nello stesso array. Gli array in PostgreSQL devono avere valori dello stesso tipo. Per esempio, non puoi aggiungere una stringa a un array di numeri:
-- Questo dà errore:
UPDATE projects
SET team_members = array_append(team_members, 'example');
Per evitarlo, assicurati che i tipi coincidano. Se non sei sicuro, fai il cast con :::
-- Esempio di cast:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
GO TO FULL VERSION