所以我在玩Postgres的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