Sql 创建“子记录”类型并保留列名称的最优雅方法

Sql 创建“子记录”类型并保留列名称的最优雅方法,sql,postgresql,record,postgresql-11,Sql,Postgresql,Record,Postgresql 11,所以我在和博士后比赛,我想不出一件事。假设我想使用某个表的列子集,或者混合使用查询中使用的几个不同表的不同列,并用它们创建一个记录类型 从逻辑上讲,简单的c.id,c.name应该可以工作,但似乎列名实际上丢失了——不可能通过名称和id来寻址记录的字段,例如,to_json函数在使用该记录创建json时不能使用字段名。使用子查询select c.id时,c.name可能会失败,因为子查询必须只返回一列错误 当然,我可以使用横向联接或公共表表达式来创建这个子类型,但我在想——是否有更优雅的方法 请

所以我在和博士后比赛,我想不出一件事。假设我想使用某个表的列子集,或者混合使用查询中使用的几个不同表的不同列,并用它们创建一个记录类型

从逻辑上讲,简单的c.id,c.name应该可以工作,但似乎列名实际上丢失了——不可能通过名称和id来寻址记录的字段,例如,to_json函数在使用该记录创建json时不能使用字段名。使用子查询select c.id时,c.name可能会失败,因为子查询必须只返回一列错误

当然,我可以使用横向联接或公共表表达式来创建这个子类型,但我在想——是否有更优雅的方法

请参见with表示例和测试查询

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

您不需要从select id、name from test as横向连接select到jsonbtt@a_horse_with_no_name是的,但是如果我想在查询中也能使用列price呢?您不需要横向连接select到来自select id的jsonbt,来自test as的namet@a_horse_with_no_name对但是如果我想在查询中也能使用列price呢?