解包函数的返回值

时间:2013-09-17 09:08:02

标签: sql postgresql

我有一个这样的函数,它总是只返回一条记录:

CREATE FUNCTION foo(pid int) RETURNS TABLE (a int, b int)
AS $$
   -- …
$$ LANGUAGE sql;

我想从表中选择这样的行:

SELECT p.id
     , foo(p.id).*
  FROM puns AS p;

但是,这会在.*处出现语法错误。我无法弄清楚如何使用JOIN,因为p.id是函数的参数。

如何将函数返回的记录解压缩到select查询中?期望的结果将包含三列idab

我正在使用PostgreSQL 9.2。

1 个答案:

答案 0 :(得分:2)

选项1 - 升级到postgres 9.3并使用LATERAL

选项2 - 使用类似:

SELECT sub_q.id, (sub_q.foo_row).a, (sub_q.foo_row).b
FROM (
SELECT p.id
     , foo(p.id) as foo_row
  FROM puns AS p ) sub_q;

选项3 - 尝试其他括号,如:

SELECT p.id
     , (foo(p.id)).*
  FROM puns AS p;

但我没有测试选项3。