在同一查询中使用列参数化set-returns函数

Joe*_*ams 2 postgresql

基本上,我想要做的是:

SELECT set_returning_func(id) FROM my_table;
Run Code Online (Sandbox Code Playgroud)

但是,结果将是记录语法中的单个列,例如

             set_returning_func              
---------------------------------------------
 (old,17,"August    2, 2011 at 02:54:59 PM")
 (old,28,"August    4, 2011 at 08:03:12 AM")
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我希望将它解压缩到列中.如果我这样写这样的查询:

SELECT srf.* FROM my_table, set_returning_func(my_table.id);
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

ERROR:  function expression in FROM cannot refer to other relations of same query level
Run Code Online (Sandbox Code Playgroud)

那么,如何获得结果集,同时还提供带参数的set-returns函数?

Joe*_*ams 6

我正在寻找的语法是:

SELECT (set_returning_func(id)).* FROM my_table;
Run Code Online (Sandbox Code Playgroud)

细节

set_returning_func(id)是复合型的.就像*可以在表上使用语法一样:

SELECT my_table.* FROM my_table, my_other_table
Run Code Online (Sandbox Code Playgroud)

它也可以用于复合值(尽管它们必须用括号括起来).直觉上,还可以从复合返回函数中选择单个列:

SELECT (set_returning_func(id)).time FROM my_table;
Run Code Online (Sandbox Code Playgroud)

一些set-returns函数具有标量而不是复合返回类型.在这些情况下,(expr).*语法没有意义,并产生错误:

> SELECT (generate_series(1,5)).*;
ERROR:  type integer is not composite
Run Code Online (Sandbox Code Playgroud)

正确的语法很简单:

> SELECT generate_series(1,5);
 generate_series 
-----------------
               1
               2
               3
               4
               5
(5 rows)
Run Code Online (Sandbox Code Playgroud)