CodeGym /Corsi /SQL SELF /Modifica dei dati negli array: array_append()

Modifica dei dati negli array: array_append(), array_remove()

SQL SELF
Livello 35 , Lezione 3
Disponibile

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:

  1. L’array di partenza che vuoi modificare.
  2. 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:

  1. L’array di partenza.
  2. 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}
Importante:

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’elemento 7.
  • Se team_members contiene 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);
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION