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

时间:2015-01-16 19:24:09

标签: postgresql function postgresql-9.2

我有一个名为“getList(date)”的函数。此函数从参数中输入的日期返回一个项目列表(有几列)。

如果我打电话:

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

工作正常。它返回一个包含日期,项目名称和价格的列表。

这样的事情:

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

但我有另一张表格,上面有我要搜索的日期。

所以,我想从该表中选择所有日期,对于返回的每一行,我想调用我的函数“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

我不知道该怎么做。当然,我的数据不是水果清单。这只是为了解释整件事情。

非常感谢。

1 个答案:

答案 0 :(得分:16)

正确的方式 - 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扩展,其中包含一些... quirky ...属性,支持SELECT - 列表中的set-returns函数。 除非您知道必须支持PostgreSQL 9.2或更早版本,否则不要使用它。

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

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