Іноді масиви треба не тільки читати, а й змінювати: додати нове значення, видалити застаріле, оновити вміст. На щастя, в PostgreSQL для цього є спеціальні функції, які дозволяють легко керувати вмістом масивів, не переписуючи їх вручну, array_append() і array_remove(). Давай подивимось, як вони працюють.
Додавання елементів у масив з array_append()
Функція array_append() використовується для додавання нового елемента в кінець масиву. Вона приймає два аргументи:
- Початковий масив, який ти хочеш змінити.
- Значення, яке ти хочеш додати в масив.
Приклад 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: Видалення елемента з масиву чисел
Давай повернемось до таблиці 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);
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ