1

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

最終的に使用したい関数は可能な限り汎用的でなければならないため、列定義リストを使用し続けたいと考えています。

4

2 に答える 2

2
SELECT f0.*, f1.*
FROM
    foo(0) AS f0 (a int, b int),
    foo(1) AS f1 (c int, d int);
于 2013-05-20T17:18:27.657 に答える
0

レコードを返す関数を使用する場合、「列定義リスト」を指定する必要があることを理解しています。

いいえ、ありません。私は匿名の記録を操作しません。すでにわかっているので、戻り値の型を宣言します。

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;

また、複数の呼び出しを 1 つの行に結合したくない場合は、次を使用する必要がありますUNION ALL

SELECT * FROM foo(0)
UNION ALL
SELECT * FROM foo(1);
于 2013-05-20T17:31:17.340 に答える