既存の回答はすべて時代遅れであるか、そもそも非効率的でした。
3つの列を返したいと仮定しintegerます。
PL/pgSQL関数
最新のPL/pgSQL(PostgreSQL 8.4以降)でこれを行う方法は次のとおりです。
CREATE OR REPLACE FUNCTION f_foo() -- (open_id numeric) -- parameter not used
RETURNS TABLE (a int, b int, c int) AS
$func$
BEGIN
RETURN QUERY VALUES
(1,2,3)
, (3,4,5)
, (3,4,5)
;
END
$func$ LANGUAGE plpgsql IMMUTABLE ROWS 3;
Postgres 9.6以降では、を追加することもできPARALLEL SAFEます。
電話:
SELECT * FROM f_foo();
主なポイント
RETURNS TABLE返すアドホック行タイプを定義するために使用します。
またはRETURNS SETOF mytbl、事前定義された行タイプを使用します。
RETURN QUERY1つのコマンドで複数の行を返すために使用します。
式を使用して、VALUES複数の行を手動で入力します。これは標準SQLであり、ずっと前から存在しています。
実際にパラメータが必要な場合(open_id numeric)は、の代わりにパラメータ名を使用してください。ALIASこれはお勧めできません。この例では、パラメータは使用されておらず、ノイズだけです...
完全に正当な識別子を二重引用符で囲む必要はありません。二重引用符は、他の方法では違法な名前(大文字と小文字が混在する、違法な文字、または予約語)を強制する場合にのみ必要です。
IMMUTABLE結果は決して変化しないため、関数のボラティリティはになる可能性があります。
ROWS 3はオプションですが、返される行数がわかっているので、Postgresに宣言することもできます。クエリプランナーが最適なプランを選択するのに役立ちます。
単純なSQL
このような単純なケースでは、代わりにプレーンSQLステートメントを使用できます。
VALUES (1,2,3), (3,4,5), (3,4,5)
または、特定の列名とタイプを定義する(または定義する必要がある)場合:
SELECT *
FROM (
VALUES (1::int, 2::int, 3::int)
, (3, 4, 5)
, (3, 4, 5)
) AS t(a, b, c);
SQL関数
代わりに、単純なSQL関数にラップすることができます。
CREATE OR REPLACE FUNCTION f_foo()
RETURNS TABLE (a int, b int, c int) AS
$func$
VALUES (1, 2, 3)
, (3, 4, 5)
, (3, 4, 5);
$func$ LANGUAGE sql IMMUTABLE ROWS 3;