基本上,我想要做的是:
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函数?
我正在寻找的语法是:
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)