如何在 PostgreSQL 中 return table 记录数组

How to return an array of table records in PostgreSQL

我在尝试 return 类型为 table1 的元素数组时收到类型不匹配错误,我声明的 table1 的固有类型。

Error occurred during SQL query execution

Razón:
 SQL Error [42P13]: ERROR: return type mismatch in function declared to return table1[]
  Detail: Actual return type is record[].
  Where: SQL function "arrayof_records"

这是重现我的问题的过于简化的代码。

drop table if exists table1 cascade;

create table table1 (
  id        serial primary key,
  title     text,
  create_dt timestamp default now()
);

insert into table1 (title) values 
('one'),
('two'),
('three');

create or replace function arrayof_records ()
returns table1[]
stable language sql as $$
  select array_agg (t.*)
  from (
    select * from table1
    order by create_dt desc
  ) as t;
$$;

很明显,解析器需要 array_agg 函数中的其他表达式。我试过 tt.**。都失败了。

我希望有一个语法,正如 PostgreSQL 12 文档所述“array_agg(表达式)|任何非数组类型”。

有什么想法吗?

您可以使用稍微不同的方法来创建数组:

create or replace function arrayof_records ()
  returns table1[]
  stable language sql 
as 
$$
  select array(
    select table1 
    from table1
    order by create_dt desc
  );
$$;

这通常也比 array_agg() 快。