Итак, я играю с 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