JavaRush /Курси /SQL SELF /Зміна даних у масивах: array_append(),

Зміна даних у масивах: array_append(), array_remove()

SQL SELF
Рівень 35 , Лекція 3
Відкрита

Іноді масиви треба не тільки читати, а й змінювати: додати нове значення, видалити застаріле, оновити вміст. На щастя, в PostgreSQL для цього є спеціальні функції, які дозволяють легко керувати вмістом масивів, не переписуючи їх вручну, array_append() і array_remove(). Давай подивимось, як вони працюють.

Додавання елементів у масив з array_append()

Функція array_append() використовується для додавання нового елемента в кінець масиву. Вона приймає два аргументи:

  1. Початковий масив, який ти хочеш змінити.
  2. Значення, яке ти хочеш додати в масив.

Приклад 1: Простий масив чисел

Припустимо, у нас є таблиця projects з колонкою team_members, де зберігаються масиви ідентифікаторів користувачів, які працюють над проектом.

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

-- Додаємо кілька рядків
INSERT INTO projects (name, team_members)
VALUES
('Proekt A', ARRAY[1, 2, 3]),
('Proekt B', ARRAY[4, 5]);

Тепер у нас є проект "Proekt A", і ми хочемо додати нового учасника з ідентифікатором 7 у масив team_members. Використаємо array_append():

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

-- Перевіряємо результат:
SELECT * FROM projects;

Результат:

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

Як бачиш, учасник з ID 7 успішно доданий у масив!

Приклад 2: Додавання текстових елементів

Той самий array_append() можна використовувати для роботи з масивами інших типів. Наприклад, ми додамо нову категорію в масив категорій товарів.

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

-- Додаємо продукт з категоріями
INSERT INTO products (name, categories)
VALUES
('Smartfon', ARRAY['Elektronika', 'Gadzhety']),
('Noutbuk', ARRAY['Kompyutery', 'Elektronika']);

-- Додаємо нову категорію "Populyarne" для "Smartfon"
UPDATE products
SET categories = array_append(categories, 'Populyarne')
WHERE name = 'Smartfon';

-- Перевіряємо результат:
SELECT * FROM products;

Результат:

id name categories
1 Smartfon {Elektronika,Gadzhety,Populyarne}
2 Noutbuk {Kompyutery,Elektronika}

Видалення елементів з масиву з array_remove()

Якщо array_append() схожий на додавання нової задачі у список, то array_remove() — це інструмент для викреслення вже виконаної задачі. Ця функція приймає як аргументи:

  1. Початковий масив.
  2. Значення, яке ти хочеш видалити.

Приклад 1: Видалення елемента з масиву чисел

Давай повернемось до таблиці projects. Ми дізналися, що учасник з ID 7 більше не працює над проектом "Proekt A". Видалимо його з масиву team_members:

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

-- Перевіряємо результат:
SELECT * FROM projects;

Результат:

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

Функція array_remove() успішно видалила учасника з ID 7.

Приклад 2: Видалення текстового елемента

Тепер подивимось на таблицю products. Якщо категорія "Populyarne" більше не актуальна для смартфона, ми можемо видалити її:

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

-- Перевіряємо результат:
SELECT * FROM products;

Результат:

id name categories
1 Smartfon {Elektronika,Gadzhety}
2 Noutbuk {Kompyutery,Elektronika}
Важливо:

якщо елемент, який ти намагаєшся видалити, відсутній у масиві, array_remove() залишає масив без змін. Це дуже зручно, бо жодних помилок при цьому не виникає.

Комбінування array_append() і array_remove()

Іноді треба спочатку впевнитися, що елемент відсутній у масиві, і тільки потім додати його. Це можна зробити за допомогою комбінації функцій:

Приклад: Додавання унікальних елементів

Давай впевнимось, що учасник з ID 7 додається у масив тільки якщо його там ще немає. Для цього використаємо перевірку з array_remove():

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

-- Перевіряємо результат:
SELECT * FROM projects;

Пояснення:

  • Оператор @> перевіряє, чи містить масив елемент 7.
  • Якщо team_members вже містить 7, додавання не виконується.

Типові помилки та поради

1. Спроба додати NULL у масив. Якщо ти спробуєш використати array_append() з NULL (наприклад, array_append(team_members, NULL)), це призведе до додавання значення NULL у масив. При цьому жодної помилки не буде, але результат може бути не таким, як ти очікував. Щоб уникнути цього, перед додаванням перевіряй, що значення не є NULL.

-- Приклад перевірки:
UPDATE projects
SET team_members = array_append(team_members, COALESCE(NULL, -1))
WHERE name = 'Proekt A';

2. Різні типи даних у масиві. Масиви в PostgreSQL повинні містити значення одного типу. Наприклад, ти не можеш додати у числовий масив рядок:

-- Це викличе помилку:
UPDATE projects
SET team_members = array_append(team_members, 'example');

Щоб уникнути цього, впевнись, що типи даних збігаються. Якщо не впевнений, приводи значення до потрібного типу за допомогою :::

-- Приклад приведення типів:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ