В объектно-ориентированных языках типа JavaScript существуют встроенные классы со своими конструкторами. Когда из конструктора класса рождается новый объект, то он наследует все свойства экземпляра класса. Так в JS все массивы имеют унаследованный метод push(), который тупо делает вставку нового значения в конец массива, на котором был вызван.
В случае с PostgreSQL нужно изобретать велосипед т. к. встроенных методов в нём нет. В PostgreSQL существует понятие «Объекта Базы Данных», но это про другие объекты — не про те что нас интересуют.
Что делать?
Решение
— Как дописать элемент в конец массива в PostgreSQL?
DO $$
DECLARE
— При объявлении массива дописываем квадратные скобки после типа данных
arr integer[];
BEGIN
RAISE NOTICE ‘Присваиваем переменной a массив из двух элементов через оператор ARRAY’;
arr := ARRAY[10,20];
RAISE NOTICE ‘Массив ДО конкатенации%’, arr; — При выводе в консоль оформляется фигурными скобками
RAISE NOTICE ‘Конкатенируем новый элемент с массивом’;
arr := arr||30;
RAISE NOTICE ‘Массив ПОСЛЕ конкатенации%’, arr;
END;
$$
LANGUAGE plpgsql;
Для простоты показа работоспособности мы используем оператор DO. И вместо вывода данных из функции мы просто выводим в консоль промежуточные результаты при помощи команды RAISE NOTICE.
Ключевое выражение здесь:
arr := arr||30;
Мы тупо конкатенируем || существующий массив из элементов с числовым значением 30 и потом переписываем сам идентификатор привязки arr при помощи присваивания в виде двоеточия и знака равенства — :=
PostgreSQL каким-то магическим образом понимает куда нужно подпихнуть эту тридцаточку. Положение целого числа 30 относительно двух вертикальных линий || здесь важно. Если слева от || записать 30, а потом arr, то новый элемент добавится в начало массива. В таком случае произойдёт сдвиг элементов. Это может быть критически важно, если будут склеиваться несколько массивов в один табличный результат.
Результат работы оператора DO при дописывании нового элемента в конец массива в PostgreSQL
В веб-интерфейсе pgAdmin 4 хорошо видно, как шло добавление нового элемента в конец существующего массива. Каждый шаг выполнения мы выводили в консоль «Messages» в виде замечания «NOTICE«.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Раздел «Функции и операторы для работы с массивами» — https://postgrespro.ru/docs/postgresql/15/functions-array