如何在 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
函数中的其他表达式。我试过 t
、t.*
和 *
。都失败了。
我希望有一个语法,正如 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() 快。
我在尝试 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
函数中的其他表达式。我试过 t
、t.*
和 *
。都失败了。
我希望有一个语法,正如 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() 快。