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)
但该函数会为每一列调用一次。
在 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)
克雷格的相关答案(丹尼尔引用)相应更新:
| 归档时间: |
|
| 查看次数: |
4529 次 |
| 最近记录: |