CodeGym /Kursy /SQL SELF /Zmiana danych w tablicach: array_append(), array_remove...

Zmiana danych w tablicach: array_append(), array_remove()

SQL SELF
Poziom 35, Lekcja 3
Dostępny

Czasem tablice trzeba nie tylko czytać, ale też modyfikować: dodać nową wartość, usunąć starą, zaktualizować zawartość. Na szczęście w PostgreSQL są do tego specjalne funkcje, które pozwalają łatwo zarządzać zawartością tablic bez ręcznego przepisywania ich: array_append() i array_remove(). Zobaczmy, jak to działa.

Dodawanie elementów do tablicy z array_append()

Funkcja array_append() służy do dodawania nowego elementu na koniec tablicy. Przyjmuje dwa argumenty:

  1. Tablica, którą chcesz zmodyfikować.
  2. Wartość, którą chcesz dodać do tablicy.

Przykład 1: Prosta tablica liczb

Załóżmy, że mamy tabelę projects z kolumną team_members, gdzie trzymane są tablice identyfikatorów użytkowników pracujących nad projektem.

CREATE TABLE projects (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    team_members INT[]
);

-- Dodajmy kilka wierszy
INSERT INTO projects (name, team_members)
VALUES
('Projekt A', ARRAY[1, 2, 3]),
('Projekt B', ARRAY[4, 5]);

Teraz mamy projekt "Projekt A" i chcemy dodać nowego członka z identyfikatorem 7 do tablicy team_members. Użyjemy array_append():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projekt A';

-- Sprawdźmy wynik:
SELECT * FROM projects;

Wynik:

id name team_members
1 Projekt A {1,2,3,7}
2 Projekt B {4,5}

Jak widzisz, członek z ID 7 został pomyślnie dodany do tablicy!

Przykład 2: Dodawanie elementów tekstowych

To samo array_append() możesz użyć do pracy z tablicami innych typów. Na przykład dodamy nową kategorię do tablicy kategorii produktów.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    categories TEXT[]
);

-- Dodajmy produkt z kategoriami
INSERT INTO products (name, categories)
VALUES
('Smartfon', ARRAY['Elektronika', 'Gadżety']),
('Laptop', ARRAY['Komputery', 'Elektronika']);

-- Dodajmy nową kategorię "Popularne" dla "Smartfona"
UPDATE products
SET categories = array_append(categories, 'Popularne')
WHERE name = 'Smartfon';

-- Sprawdźmy wynik:
SELECT * FROM products;

Wynik:

id name categories
1 Smartfon {Elektronika,Gadżety,Popularne}
2 Laptop {Komputery,Elektronika}

Usuwanie elementów z tablicy z array_remove()

Jeśli array_append() to jak dodanie nowego zadania do listy, to array_remove() jest narzędziem do wykreślania już zrobionego zadania. Ta funkcja przyjmuje jako argumenty:

  1. Tablica źródłowa.
  2. Wartość, którą chcesz usunąć.

Przykład 1: Usuwanie elementu z tablicy liczb

Wróćmy do tabeli projects. Dowiedzieliśmy się, że członek z ID 7 już nie pracuje przy projekcie "Projekt A". Usuńmy go z tablicy team_members:

UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Projekt A';

-- Sprawdźmy wynik:
SELECT * FROM projects;

Wynik:

id name team_members
1 Projekt A {1,2,3}
2 Projekt B {4,5}

Funkcja array_remove() skutecznie usunęła członka z ID 7.

Przykład 2: Usuwanie elementu tekstowego

Teraz spójrzmy na tabelę products. Jeśli kategoria "Popularne" już nie jest aktualna dla smartfona, możemy ją usunąć:

UPDATE products
SET categories = array_remove(categories, 'Popularne')
WHERE name = 'Smartfon';

-- Sprawdźmy wynik:
SELECT * FROM products;

Wynik:

id name categories
1 Smartfon {Elektronika,Gadżety}
2 Laptop {Komputery,Elektronika}
Ważne:

jeśli element, który próbujesz usunąć, nie istnieje w tablicy, array_remove() zostawia tablicę bez zmian. To bardzo wygodne, bo nie pojawia się żaden błąd.

Kombinowanie array_append() i array_remove()

Czasem trzeba najpierw upewnić się, że elementu nie ma w tablicy, i dopiero potem go dodać. Można to zrobić za pomocą kombinacji funkcji:

Przykład: Dodawanie unikalnych elementów

Upewnijmy się, że członek z ID 7 zostanie dodany do tablicy tylko wtedy, gdy jeszcze go tam nie ma. Użyjemy do tego sprawdzenia z array_remove():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Projekt A' AND NOT (team_members @> ARRAY[7]);

-- Sprawdźmy wynik:
SELECT * FROM projects;

Wyjaśnienie:

  • Operator @> sprawdza, czy tablica zawiera element 7.
  • Jeśli team_members już zawiera 7, dodanie nie zostanie wykonane.

Typowe błędy i porady

1. Próba dodania NULL do tablicy. Jeśli spróbujesz użyć array_append() z NULL (np. array_append(team_members, NULL)), to spowoduje dodanie wartości NULL do tablicy. Nie pojawi się żaden błąd, ale wynik może być nie taki, jak oczekujesz. Żeby tego uniknąć, przed dodaniem sprawdź, czy wartość nie jest NULL.

-- Przykład sprawdzenia:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Projekt A';

2. Różne typy danych w tablicy. Tablice w PostgreSQL muszą zawierać wartości tego samego typu. Na przykład nie możesz dodać do tablicy liczb tekstu:

-- To spowoduje błąd:
UPDATE projects
SET team_members = array_append(team_members, 'example');

Żeby tego uniknąć, upewnij się, że typy danych się zgadzają. Jeśli nie jesteś pewien, rzutuj wartość na odpowiedni typ za pomocą :::

-- Przykład rzutowania typów:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
2
Zadanie
SQL SELF, poziom 35, lekcja 3
Niedostępne
Dodawanie elementu do tablicy
Dodawanie elementu do tablicy
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION