从 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;