Робота з масивами не обмежується їх створенням і зберіганням — часто виникає потреба витягти окремі елементи або проаналізувати їхній вміст. PostgreSQL пропонує кілька вбудованих функцій для таких операцій. Давай розглянемо їх по черзі.
Функція unnest(): розпаковка масиву
Функція unnest() буквально розпаковує масив, перетворюючи його елементи на окремі рядки. Це особливо зручно, якщо треба працювати з даними масиву у вигляді таблиці.
Приклад 1: Проста розпаковка масиву
Припустимо, у нас є масив із назвами факультетів:
SELECT ARRAY['Інформатика', 'Математика', 'Фізика'] AS факультети;
Тепер треба витягти кожен елемент як окремий рядок. Використаємо unnest():
SELECT unnest(ARRAY['Інформатика', 'Математика', 'Фізика']) AS факультет;
Результат:
| факультет |
|---|
| Інформатика |
| Математика |
| Фізика |
Приклад 2: Розпаковка масиву в таблиці
Припустимо, у нас є таблиця courses:
CREATE TABLE courses (
course_id SERIAL PRIMARY KEY,
course_name TEXT,
tags TEXT[]
);
INSERT INTO courses (course_name, tags)
VALUES
('Алгоритми', ARRAY['Програмування', 'Інформатика']),
('Лінійна алгебра', ARRAY['Математика', 'Алгебра']),
('Фізика основ', ARRAY['Фізика', 'Загальна']);
Тепер витягнемо всі теги з масиву:
SELECT course_name, unnest(tags) AS tag
FROM courses;
Результат:
| course_name | tag |
|---|---|
| Алгоритми | Програмування |
| Алгоритми | Інформатика |
| Лінійна алгебра | Математика |
| Лінійна алгебра | Алгебра |
| Фізика основ | Фізика |
| Фізика основ | Загальна |
Ти бачиш, що кожен рядок масиву перетворюється на окремий рядок таблиці.
Функція array_length(): визначаємо розмір масиву
Друга важлива функція для роботи з масивами — це array_length(). Вона повертає довжину масиву (тобто кількість елементів) для заданого виміру.
Приклад 1: Кількість елементів в одномірному масиві
Візьмемо масив:
SELECT ARRAY['Яблуко', 'Банан', 'Апельсин'] AS фрукти;
Якщо хочеш дізнатися, скільки фруктів у масиві:
SELECT array_length(ARRAY['Яблуко', 'Банан', 'Апельсин'], 1) AS довжина;
Результат:
| довжина |
|---|
| 3 |
Тут 1 вказує на вимір масиву. У масивів у PostgreSQL може бути кілька вимірів (наприклад, двовимірні масиви), але про це поговоримо іншим разом.
Приклад 2: Кількість елементів у масиві таблиці
Подивимось, скільки тегів у кожного курсу:
SELECT course_name, array_length(tags, 1) AS кількість_тегів
FROM courses;
Результат:
| course_name | кількість_тегів |
|---|---|
| Алгоритми | 2 |
| Лінійна алгебра | 2 |
| Фізика основ | 2 |
Функція просто каже: «Гей, тут два елементи!», а це вже сильно спрощує аналіз даних.
Функція array_position(): пошук значення в масиві
Тепер уяви ситуацію, коли ти шукаєш певний елемент у масиві. Функція array_position() виручає: вона повертає позицію першого входження елемента.
Приклад 1: Пошук елемента
Припустимо, у нас є масив:
SELECT ARRAY['Червоний', 'Синій', 'Зелений', 'Жовтий'] AS кольори;
Спробуємо знайти позицію елемента "Синій":
SELECT array_position(ARRAY['Червоний', 'Синій', 'Зелений', 'Жовтий'], 'Синій') AS позиція;
Результат:
| позиція |
|---|
| 2 |
Якщо елемент відсутній, функція повертає NULL. Давай перевіримо:
SELECT array_position(ARRAY['Червоний', 'Синій', 'Зелений', 'Жовтий'], 'Чорний') AS позиція;
Результат:
| позиція |
|---|
| NULL |
Приклад 2: Пошук у масиві таблиці
Ти хочеш дізнатися, у якого курсу є тег "Інформатика". Спочатку знайдемо потрібні рядки:
SELECT course_name, array_position(tags, 'Інформатика') AS позиція
FROM courses;
Результат:
| course_name | позиція |
|---|---|
| Алгоритми | 2 |
| Лінійна алгебра | NULL |
| Фізика основ | NULL |
Тепер додай фільтрацію, щоб залишити тільки ті рядки, де тег є:
SELECT course_name
FROM courses
WHERE array_position(tags, 'Інформатика') IS NOT NULL;
Результат:
| course_name |
|---|
| Алгоритми |
Функція array_position() дозволяє швидко знаходити дані всередині масиву, що робить її однією з ключових для роботи з масивами у PostgreSQL.
Практичне застосування функцій
unnest()— використовуй для перетворення масивів у рядки. Це важливо для аналізу даних, створення звітів і роботи з тегами.array_length()— ідеально підходить для перевірки довжини масивів. Наприклад, можна використати її для валідації даних: перевіряти, щоб масив не був порожнім.array_position()— класний інструмент для пошуку елементів, будь то категорії товарів, участь студента в проекті чи ключові слова в описі.
Типові помилки при використанні функцій
unnest()може подвоїти кількість рядків, якщо застосовується до масивів одразу в кількох стовпцях. Це легко вирішити, додавшиJOIN LATERALабоCROSS JOIN, але будь уважний.array_length()повертаєNULLдля порожнього масиву. Якщо твій масив може бути порожнім, перевіряй це окремо.array_position()може повернутиNULL, якщо елемент відсутній. Тому краще завжди враховувати цей випадок у фільтрах (IS NOT NULL).
Приклади з реальної практики
Масиви у PostgreSQL — не просто теоретична штука, а інструмент, який реально працює в живих проектах. Наприклад, ти ведеш блог і в кожної статті є список тегів — масив дозволяє легко фільтрувати статті за потрібною темою або навіть складати топ популярних категорій.
Або, скажімо, ти аналізуєш поведінку користувачів, які обирають кілька цікавих курсів чи продуктів. Усі ці вподобання зручно зберігати в масиві — і так само зручно обробляти.
А ще масиви допомагають валідовувати дані: за допомогою array_length() можна, наприклад, обмежити кількість елементів — скажімо, щоб користувач не вибрав більше п’яти пунктів.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ