从 Postgres 中的表函数返回多行的最简单方法是啥?

Posted

技术标签:

【中文标题】从 Postgres 中的表函数返回多行的最简单方法是啥?【英文标题】:What is the simplest way to return multiple rows from table function in Postgres?从 Postgres 中的表函数返回多行的最简单方法是什么? 【发布时间】:2021-07-14 06:11:32 【问题描述】:

有一个表my_table,我想通过表函数查询。

create table my_table (
  col_1 text,
  col_2 numeric
  // 10 more columns
);

根据 Internet 上的文档和文章,有几种方法可以做到这一点。但是它们中的大多数都涉及定义一个行类型来复制结果表的结构,例如 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');

不幸的是,它只返回结果的第一行,尽管查询返回了很多。这不是我所期望的。

如果我们把函数头改成

create or replace function my_func(p_x text)
   returns table( col_1 text, col_2 numeric, /* and others */)

它工作正常,但最好避免这种重复并在此处重用 my_table 的行类型。

如何定义一个函数,其表结果与my_table 中的列完全相同?

【问题讨论】:

如果答案解决了您的问题,请接受。接受答案有助于未来的提问者遇到同样的问题。不要只留下一个已回答的问题。 【参考方案1】:

您需要将函数定义为returns setof my_table,以表明它返回一个集合,而不仅仅是一行:

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;

【讨论】:

感谢您的聪明才智和超快的反应。

以上是关于从 Postgres 中的表函数返回多行的最简单方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

将多行加入单行中的多列 Netezza/Postgres

从函数返回具有列定义的记录

postgres —— 窗口函数入门

如何创建自定义函数来分析 postgres 中的表

Postgres-存储过程 return 详解

Postgres存储函数如何返回表