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

时间:2011-09-07 17:02:59

标签: postgresql

基本上,我想做的是:

SELECT set_returning_func(id) FROM my_table;

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

             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)

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

SELECT srf.* FROM my_table, set_returning_func(my_table.id);

我收到错误消息:

ERROR:  function expression in FROM cannot refer to other relations of same query level

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

1 个答案:

答案 0 :(得分:6)

我正在寻找的语法是:

SELECT (set_returning_func(id)).* FROM my_table;

详细信息

set_returning_func(id)是复合类型。就像*语法可用于表格一样:

SELECT my_table.* FROM my_table, my_other_table

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

SELECT (set_returning_func(id)).time FROM my_table;

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

> SELECT (generate_series(1,5)).*;
ERROR:  type integer is not composite

正确的语法很简单:

> SELECT generate_series(1,5);
 generate_series 
-----------------
               1
               2
               3
               4
               5
(5 rows)