使用数组参数多次调用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或更高版本中,最好使用( LEFT
) JOIN 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;