9.3以降:横方向のクエリ
PostgreSQL 9.3以降では、暗黙的なラテラルクエリを使用します。
SELECT f.* FROM things t, some_function(t.thing_id) f;
すべての新しいクエリにはこの定式化をお勧めします 。上記は標準的な定式化です 。
また、RETURNS TABLE
の関数でも正しく機能します。 またはRETURNS SETOF RECORD
また、RETURNS RECORD
のout-paramsを使用した関数もあります。 。
略記:
SELECT f.*
FROM things t
CROSS JOIN LATERAL some_function(t.thing_id) f;
9.3より前:ワイルドカード拡張(注意して)
以前のバージョンでは、some_function
の複数の評価が発生します 、しない some_function
の場合に機能します セットを返します。これは使用しないでください :
SELECT (some_function(thing_id)).* FROM things;
以前のバージョンでは、some_function
の複数の評価を回避しています 間接参照の第2層を使用します。かなり古いバージョンのPostgreSQLをサポートする必要がある場合にのみこれを使用してください。
SELECT (f).*
FROM (
SELECT some_function(thing_id) f
FROM things
) sub(f);
デモ:
セットアップ:
CREATE FUNCTION some_function(i IN integer, x OUT integer, y OUT text, z OUT text) RETURNS record LANGUAGE plpgsql AS $$
BEGIN
RAISE NOTICE 'evaluated with %',i;
x := i;
y := i::text;
z := 'dummy';
RETURN;
END;
$$;
create table things(thing_id integer);
insert into things(thing_id) values (1),(2),(3);
テスト実行:
demo=> SELECT f.* FROM things t, some_function(t.thing_id) f;
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)
demo=> SELECT (some_function(thing_id)).* FROM things;
NOTICE: evaluated with 1
NOTICE: evaluated with 1
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 2
NOTICE: evaluated with 2
NOTICE: evaluated with 3
NOTICE: evaluated with 3
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)
demo=> SELECT (f).*
FROM (
SELECT some_function(thing_id) f
FROM things
) sub(f);
NOTICE: evaluated with 1
NOTICE: evaluated with 2
NOTICE: evaluated with 3
x | y | z
---+---+-------
1 | 1 | dummy
2 | 2 | dummy
3 | 3 | dummy
(3 rows)