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
('Проект A', ARRAY[1, 2, 3]),
('Проект B', ARRAY[4, 5]);

Теперь у нас есть проект "Проект A", и мы хотим добавить нового участника с идентификатором 7 в массив team_members. Используем array_append():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Проект A';

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

Результат:

id name team_members
1 Проект A {1,2,3,7}
2 Проект 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
('Смартфон', ARRAY['Электроника', 'Гаджеты']),
('Ноутбук', ARRAY['Компьютеры', 'Электроника']);

-- Добавим новую категорию "Популярное" для "Смартфона"
UPDATE products
SET categories = array_append(categories, 'Популярное')
WHERE name = 'Смартфон';

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

Результат:

id name categories
1 Смартфон {Электроника,Гаджеты,Популярное}
2 Ноутбук {Компьютеры,Электроника}

Удаление элементов из массива с array_remove()

Если array_append() похож на добавление новой задачи в список, то array_remove() — это инструмент для вычёркивания уже сделанной задачи. Эта функция принимает в качестве аргументов:

  1. Исходный массив.
  2. Значение, которое вы хотите удалить.

Пример 1: Удаление элемента из массива чисел

Давайте вернёмся к таблице projects. Мы узнали, что участник с ID 7 больше не работает на проекте "Проект A". Удалим его из массива team_members:

UPDATE projects
SET team_members = array_remove(team_members, 7)
WHERE name = 'Проект A';

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

Результат:

id name team_members
1 Проект A {1,2,3}
2 Проект B {4,5}

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

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

Теперь посмотрим на таблицу products. Если категория "Популярное" больше не актуальна для смартфона, мы можем удалить её:

UPDATE products
SET categories = array_remove(categories, 'Популярное')
WHERE name = 'Смартфон';

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

Результат:

id name categories
1 Смартфон {Электроника,Гаджеты}
2 Ноутбук {Компьютеры,Электроника}
Важно:

если элемент, который вы пытаетесь удалить, отсутствует в массиве, array_remove() оставляет массив без изменений. Это очень удобно, ведь никаких ошибок при этом не возникает.

Комбинирование array_append() и array_remove()

Иногда нам нужно сначала убедиться, что элемент отсутствует в массиве, и только затем добавить его. Это можно сделать с помощью комбинации функций:

Пример: Добавление уникальных элементов

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

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Проект 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 = 'Проект A';

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

-- Это вызовет ошибку:
UPDATE projects
SET team_members = array_append(team_members, 'example');

Чтобы избежать этого, убедитесь, что типы данных совпадают. Если не уверены, приводите значение к нужному типу с помощью :::

-- Пример приведения типов:
UPDATE projects
SET team_members = array_append(team_members, '5'::INT);
2
Задача
SQL SELF, 35 уровень, 3 лекция
Недоступна
Добавление элемента в массив
Добавление элемента в массив
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ra Уровень 35 Student
8 августа 2025
1. В задаче дропается не та таблица - должно быть DROP TABLE IF EXISTS projects; 2. Тут нет array_remove() Пример: Добавление уникальных элементов Давайте убедимся, что участник с ID 7 добавляется в массив только в том случае, если его там ещё нет. Для этого используем проверку с array_remove():

UPDATE projects
SET team_members = array_append(team_members, 7)
WHERE name = 'Проект A' AND NOT (team_members @> ARRAY[7]);

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