在PostgreSQL中是否可以扩展现有数据类型?本质上,我想要的是这段 TypeScript 代码的 SQL 版本:
interface Meeting {
id: number;
start: Date;
end: Date;
description: string;
}
interface ServiceHour extends Meeting {
total: number;
hours: number;
}
因为我有一个从meetings
表返回所有列的函数,然后在查询时计算额外的两个total
和hours
列。以下是该函数的样子:
create or replace function user_hours(org_id text, user_id text)
returns table (like meeting_instances)
as $$
select (sum(hours) over (order by _.instance_time)) total, * from (
select
extract(epoch from ((meeting_instances.time).to - (meeting_instances.time).from)) / 60 / 60 as hours,
meeting_instances.*
from meeting_instances inner join relation_people on relation_people.meeting = meeting_instances.id
where relation_people.user = user_id
and meeting_instances.org = org_id
and meeting_instances.instance_time <= current_date
) as _;
$$
language sql stable;
目前我遇到了类型不匹配的错误,因为table (like meeting_instances)
与包含meeting_instances
列和两个新列hours
和total
的表不同。 我想要实现的是像下面这样的操作(显然以下语法实际上不存在...但我不确定是否有其他类似的简写语法):
returns table (total float, hours float, meeting_instances.*)
returns table (total float, hours float) intersect (like meeting_instances)
returns table (total float, hours float) extends (like meeting_instances)
我的当前解决方法是创建一个视图,然后让该函数查询该视图并返回视图的类型。
CREATE TABLE ...
)。看起来您有多层嵌套的复合类型。在Postgres中,您可以这样做。但并不意味着您应该这样做。 - Erwin BrandstetterLIKE
子句)? - BergiRETURNS
子句中还是其他任何地方都不行。实际上,RETURNS (LIKE tbl)
甚至不是文档化的语法。我正在解开一个答案中的多层含义... - Erwin Brandstettermeeting_instances.time
已经是一个嵌套的复合类型了。而且我们不知道兔子洞有多深。 - Erwin Brandstetter