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

时间:2019-04-13 17:40:04

标签: sql postgresql record postgresql-11

所以我在玩Postgres的composite types,但我一无所知。假设我要使用某些表的列的子集,或查询中使用的几个不同表的不同列的混合,并从中创建记录类型。

从逻辑上讲,简单的(c.id, c.name)应该可以工作,但是似乎实际上丢失了列名-用nameid来寻址记录的字段是不可能的,例如,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

0 个答案:

没有答案