所以我在玩 Postgres' composite types
,但我无法弄清楚一件事。假设我想使用某个表的列的子集,或者混合查询中使用的几个不同表的不同列,并从中创建一个记录类型。
从逻辑上讲, simple(c.id, c.name)
应该可以工作,但似乎列名实际上丢失了 - 无法通过name
and来寻址记录的字段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