PostgreSQL:在FROM子句中多次调用函数

时间:2013-05-20 17:14:30

标签: function postgresql plpgsql

如何在FROM子句中调用多次返回记录的函数?我知道在使用返回记录的函数时我必须指定一个“列定义列表”。但是,我怎样才能为该函数使用别名?

示例:

CREATE OR REPLACE FUNCTION foo(which_foo int) RETURNS SETOF RECORD AS
$BODY$BEGIN
IF which_foo=0 THEN
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
ELSE 
 RETURN QUERY EXECUTE 'SELECT 1::int,2::int;';
END IF;
END$BODY$
LANGUAGE plpgsql;

SELECT * FROM foo(0) AS (a int, b int);;
SELECT * FROM foo(1) AS (c int, d int);
SELECT * FROM foo(0) AS (a int, b int), foo(1) AS (c int, d int);

最后一个select语句将失败:

ERROR:  table name "foo" specified more than once

我想继续使用列定义列表,因为我想在最后使用的函数必须尽可能通用。

2 个答案:

答案 0 :(得分:2)

SELECT f0.*, f1.*
FROM
    foo(0) AS f0 (a int, b int),
    foo(1) AS f1 (c int, d int);

答案 1 :(得分:0)

  

我知道我必须在何时指定'列定义列表'   使用返回记录的函数。

不,你没有。我不会使用匿名记录。 Declare the return type,因为你已经知道了:

CREATE OR REPLACE FUNCTION foo(which_foo int)
 RETURNS TABLE (a int, b int) AS
$func$
BEGIN
    IF which_foo = 0 THEN
        RETURN QUERY SELECT 1,2;
    ELSE 
        RETURN QUERY SELECT 1,2;
    END IF;
END
$func$ LANGUAGE plpgsql;

假设您不想将多个调用合并为一行,则应使用UNION ALL

SELECT * FROM foo(0)
UNION ALL
SELECT * FROM foo(1);