Самый элегантный способ создания типа 'subrecord' с сохранением имен столбцов - PullRequest
0 голосов
/ 13 апреля 2019

Итак, я играю с Postgres '1001 *composite types, и я не могу понять одну вещь.Предположим, я хочу использовать подмножество столбцов определенной таблицы или сочетание разных столбцов нескольких разных таблиц, используемых в запросе, и создать из них тип записи.

По логике, простой (c.id, c.name) должен работать,но кажется, что имена столбцов фактически потеряны - невозможно адресовать поля записей с помощью name и id, и, например, функция to_json не может использовать имена полей при создании json из этой записи.Использование подзапроса (select c.id, c.name) предсказуемо завершается с ошибкой subquery must return only one column.

Конечно, я могу использовать боковое соединение или общее табличное выражение для создания этого подтипа, но я думаю - если есть более элегантныйспособ?

см. db<>fiddle demo с примером таблицы и тестовым запросом

create table test(id integer, name text, price int);

insert into test(id,name,price)
values
    (1,'name1',1),
    (2,'name2',12),
    (3,'name3',23),
    (5,'name5',4),
    (9,'name9',3);

create type sub_test as (id integer, name text);

select
    c.price,
    -- using predefined type - works
    to_json((c.id, c.name)::sub_test),
    -- creating row type on the fly - doesn't work, names are lost
    to_json((c.id, c.name)),
    -- using derived table created with lateral join - works
    to_json(d)
from test as c, lateral(select c.id, c.name) as d
...