1

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

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

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

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

但是,这会在.*. 我无法弄清楚如何使用 a 来做到这一点JOIN,因为p.id它是函数的参数。

如何将函数返回的记录解包到选择查询中?所需的结果将包含三列id和。ab

我正在使用 PostgreSQL 9.2。

4

1 回答 1

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。

于 2013-09-17T10:42:49.827 回答