为 select 中的每一行调用一个函数 - Postgres

Call a function for each row in select - Postgres

我有一个名为 "getList(date)" 的函数。这个函数 returns 我从参数中输入的日期开始的项目列表(有几列)。

如果我打电话:

SELECT * FROM getList('12/31/2014');

它工作正常。它 returns 给我一个包含日期、项目名称和价格的列表。

像这样:

date        item_description    price
-----------------------------------------------
12/31/2014      banana          1
12/31/2014      apple           2.5
12/31/2014      coconut         3

但我还有另一个 table,其中包含我要搜索的日期。

所以,我想 select 来自 table 的所有日期,并且对于返回的每一行,我想调用我的函数 "getList" 以获得如下结果:

 date       item_description    price
 -----------------------------------------------
 12/28/2014     banana          0.5
 12/28/2014     apple           1.5
 12/28/2014     coconut         2
 12/31/2014     banana          1
 12/31/2014     apple           2.5
 12/31/2014     coconut         3

我不知道具体怎么做。当然我的数据不是水果单。这只是为了更容易解释整个事情。

非常感谢。

正确的方式 - LATERAL加入

执行此操作的正确方法是使用横向查询(PostgreSQL 9.3 或更新版本):

SELECT d."date", f.item_description, f.price
FROM mydates d,
     LATERAL getList(d."date") f;

the manual

传统方式 - SELECT

中的 SRF

在旧版本中,您必须使用具有一些...古怪...属性的 PostgreSQL 扩展,支持 SELECT-列表中的集合返回函数。 除非您知道必须支持 PostgreSQL 9.2 或更早版本,否则不要使用它

SELECT d."date", (getList(d."date").*
FROM mydates d;

这可能会导致对 getList 函数进行多次计算,对输出的每一列计算一次。