使用数组参数多次调用set-returning函数

这是plpgsql函数的一个变体, 它返回多个被多次调用的列 。 但是,我希望find一个解决我的特定情况。

我有一个函数,用给定的参数处理行数组,并返回一组行+一个新的列。

CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS ... 

该function仅对一组数据有效

 SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 

但我想使它与多组数据一起工作,而不将数据传递给函数。 我尝试了一些变化:

 SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid 

但是这个函数被每一列调用一次。

在Postgres 9.3或更高版本中,最好使用( LEFTJOIN LATERAL

 SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true; 

如果函数foo()不能返回 ,那么安全forms就是LEFT JOIN LATERAL 。 否则,或者如果要排除没有横向连接结果的行,请使用JOIN LATERAL或其简写等效forms:

 , foo(sub.arr) 

这在手册中明确提到。

我已经相应地更新了Craig的相关答案(Daniel提到)

  • 如何避免SQL查询中的(func())。*语法的多个函数evals?

在这个上下文中函数被多次调用,不是因为它的input,而是因为func().*被实现

解释如下: 如何在SQL查询中使用(func())。*语法避免多个函数的返回值?

以下变体应该在所有支持的PostgreSQL版本(8.4或更新版本)上运行时没有多次演示:

 WITH subq as ( SELECT array_agg(data) as agg, dataid FROM datatable -- WHERE clause ? GROUP BY dataid) SELECT foo(agg,dataid) FROM subq;