从 table 函数在 Postgres 中 return 多行的最简单方法是什么?
What is the simplest way to return multiple rows from table function in Postgres?
有个tablemy_table
想通过table函数查询
create table my_table (
col_1 text,
col_2 numeric
// 10 more columns
);
根据 Internet 上的文档和文章,有几种方法可以做到这一点。但其中大部分涉及定义行类型,复制结果 table 的结构,例如
create function ... returns table( col_1 text, col_2 numeric, ...)
在这种情况下。
我找到的最简单的方法如下:
create or replace function my_func(p_x text)
returns my_table
as
$$
select * from my_table where col_1 = p_x;
$$
language sql;
--
select * from my_func('hello');
不幸的是,它 returns 只有结果的第一行 ,尽管查询 returns 很多。这不是我所期望的。
如果我们将函数头更改为
create or replace function my_func(p_x text)
returns table( col_1 text, col_2 numeric, /* and others */)
它工作正常,但最好避免这种重复并在此处重用 my_table
的行类型。
如何定义一个函数 table 结果与 my_table
中的列完全相同?
您需要将函数定义为 returns setof my_table
以表明它 returns 一组,而不是一行:
create or replace function my_func(p_x text)
returns SETOF my_table
as
$$
select * from my_table where col_1 = p_x;
$$
language sql;
有个tablemy_table
想通过table函数查询
create table my_table (
col_1 text,
col_2 numeric
// 10 more columns
);
根据 Internet 上的文档和文章,有几种方法可以做到这一点。但其中大部分涉及定义行类型,复制结果 table 的结构,例如
create function ... returns table( col_1 text, col_2 numeric, ...)
在这种情况下。
我找到的最简单的方法如下:
create or replace function my_func(p_x text)
returns my_table
as
$$
select * from my_table where col_1 = p_x;
$$
language sql;
--
select * from my_func('hello');
不幸的是,它 returns 只有结果的第一行 ,尽管查询 returns 很多。这不是我所期望的。
如果我们将函数头更改为
create or replace function my_func(p_x text)
returns table( col_1 text, col_2 numeric, /* and others */)
它工作正常,但最好避免这种重复并在此处重用 my_table
的行类型。
如何定义一个函数 table 结果与 my_table
中的列完全相同?
您需要将函数定义为 returns setof my_table
以表明它 returns 一组,而不是一行:
create or replace function my_func(p_x text)
returns SETOF my_table
as
$$
select * from my_table where col_1 = p_x;
$$
language sql;