Postgresql. Массивы и композитные типы.

Небольшая заметка-напоминалка.

Тип массив

Можно задать типом столбца в таблице одномерный или многомерный массив. Типом элемента массива может быть любой валидный для постгре – базовые типы вроде строк и чисел, другой массив, определеяемый пользователем и т.п.

Определение столбца в таблице

CREATE TABLE mytab_one (
    name text,
    vector integer ARRAY[4],
    once_vector integer[],
    multidim_array text[][]
);

Возможно использование как квадратных скобок, так и слова ARRAY.

Вставка записей

Вставка записи массива через insert – элементы массива заключаются в фигурные скобки и разделяются запятыми.

INSERT INTO mytab_one VALUES(
    'arrays in row','{100,200,300,400}','{100,200}',
    '{{"строка 11","строка 12"},{"строка 21","строка 22"}}'
);

Модификация массива

Самый простой вариант – использовать UPDATE для обычной записи значения, например:

UPDATE mytab_one 
SET vector = '{150,200,300,400}'
WHERE name = 'arrays in row';

Для изменения массива можно использовать функции для работы с массивами. (Это отдельная тема)
Пример – добавление элемента в массив с использованием функции array_append.

UPDATE mytab_one 
SET once_vector = array_append(once_vector,300) 
WHERE name = 'arrays in row';

Доступ к значениям массива

В запросах можно обращаться к массивам как и в других языках – через квадратные скобки с указанием индекса.

SELECT vector[2] AS someval FROM mytab_one;

Значение элемента массива может также использоваться в условной части запроса.

SELECT * FROM mytab_one WHERE vector[1] = 100;

Можно делать условие по всем элементам массива

SELECT * FROM mytab_one WHERE 100 = any (vector);

(Если первый попавшийся элемент массива равен 100)

Композитные типы

Тип в данном случае представляет собой набор именованных полей со своими типами, т.е в принципе – аналог строки таблицы.

Объявление типа

-- Объявление
CREATE TYPE user_info AS (
    name text,
    age integer,
    address text
);

-- и применение в таблице
CREATE TABLE orders (
    order_id integer primary key not null,
    customer user_info
);

Вставка записи композитного типа

-- просто со скобками
INSERT INTO orders VALUES (
    1,('Ivan',2,'Address: place 1')
);

-- функция row
INSERT INTO orders VALUES (
    2,ROW('Semen',5,'Address: place 2')
);

Доступ к значениям композитного типа

Для доступа в запросе используются круглые скобки и через точку имя поля композитного типа.

SELECT (customer).name, (customer).age 
FROM orders WHERE (customer).age > 10;

Leave a Reply

Your email address will not be published. Required fields are marked *