我构建了一个派生表,以便我知道派生表的结构与原始表相同:
create table people_derived as
select * from people where <some_predicate>;
是否可以根据原始表(人)将派生表(people_derived)的记录转换为复合类型(再一次我知道结构匹配)?我想要这个:
select p::"people" from people_derived p;
以上查询给出了以下错误: 错误:42846:无法将人类类型转移给人
原因是我有一个函数foo,它将“people”[]作为参数,但我想将它应用于简化的一组人。在我的实际应用程序中,它是一系列中间查询,但我知道我保留了原始表的结构。我所知道的唯一解决方案如下:
create table people_derived as
select *, p as p from people p where <some_predicate>;
select foo(array_agg(p)) from people_derived p;
但是我不喜欢这个解决方案,因为它会增加表people_derived的大小,并且我使用大表(百列,100M记录)。
答案 0 :(得分:0)
我相信只有在两个表之间存在正式的继承关系时才允许直接进行此类强制转换:
ALTER TABLE people_derived INHERIT people;
但是,这意味着SELECT * FROM people
也会返回people_derived
的内容,这可能不是您想要的内容(尽管您可以使用SELECT * FROM ONLY people
来避免这种情况。)
我能想到的最简单的解决方法,只要列类型和列顺序相同,就是转换为text
然后再转回:
SELECT p::text::people FROM people_derived p;
通过通用record
假型而不是text
进行投射会更好一点,但Postgres似乎在此上下文中忽略了这些投射。您可以使用派生表以稍微更迂回的方式将其强制转换为record
:
SELECT t::people FROM (SELECT * FROM people_derived) t