使用数组参数多次调用设置返回函数

rap*_*ael 1 sql postgresql join plpgsql set-returning-functions

这是plpgsql 函数的一个变体,它返回多个列,并被多次调用。然而,我希望找到针对我的特殊情况的解决方案。

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

CREATE OR REPLACE foo(data data[], parameter int) RETURNS SETOF enhanceddata AS
...
Run Code Online (Sandbox Code Playgroud)

该函数适用于只有一组数据的测试用例

SELECT * FROM foo( (SELECT ARRAY_AGG(data) FROM datatable GROUP BY dataid WHERE dataid = something), 1) 
Run Code Online (Sandbox Code Playgroud)

但我想让它处理多组数据,而不将 a 传递dataid给函数。我尝试了多种变体:

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

但该函数会为每一列调用一次。

Erw*_*ter 6

在 Postgres 9.3 或更高版本中,通常最好使用LEFT JOIN LATERAL ... ON true

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;
Run Code Online (Sandbox Code Playgroud)

如果函数foo()不能返回任何 rows,那么这是安全的形式,因为它保留连接左侧的所有行,即使没有行返回到右侧。

否则,或者如果您排除没有横向连接结果的行,请使用:

CROSS JOIN LATERAL foo(sub.arr)
Run Code Online (Sandbox Code Playgroud)

或简写:

, foo(sub.arr)
Run Code Online (Sandbox Code Playgroud)

说明书上有明确提及。

克雷格的相关答案(丹尼尔引用)相应更新: