首页 > 解决方案 > 创建“子记录”类型保留列名称的最优雅方法

问题描述

所以我在玩 Postgres' composite types,但我无法弄清楚一件事。假设我想使用某个表的列的子集,或者混合查询中使用的几个不同表的不同列,并从中创建一个记录类型。

从逻辑上讲, simple(c.id, c.name)应该可以工作,但似乎列名实际上丢失了 - 无法通过nameand来寻址记录的字段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

标签: sqlpostgresqlrecordpostgresql-11

解决方案


推荐阅读