SELECTリストでSet Returning Function(SRF)を使用する場合とFROM句でSRFを使用する場合で、動作に違いがあるのはなぜですか?
たとえば、2つの行を返す単純なSRFの場合:
CREATE OR REPLACE FUNCTION gen_series(out integer, out int)
RETURNS SETOF record AS $$
SELECT 1,1
UNION
SELECT 2,2;
$$ LANGUAGE SQL;
SELECT gen_series();
それぞれがレコードを含む2つの単一列の行を返します。
=> gen_series
------------
(1,1)
(2,2)
(2 rows)
一方SELECT * FROM gen_series();
、レコードが展開された2つの行を返します。
=> column1 | column2
---------+---------
1 | 1
2 | 2
(2 rows)
比較すると、SRFが単一の列を返す場合、SELECTまたはFROM句でSRFを呼び出しても違いはありません。例えば:
=> SELECT generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
=> SELECT * FROM generate_series(1,2);
generate_series
-----------------
1
2
(2 rows)
私の質問は:
2番目のケースで、返されたテーブルに単一の列があるという理由だけで、SRFの動作が最初のケースと異なる理由がよくわかりません。これは、型、タプル、およびセットに関して、本当に一貫した動作ですか?
異なる動作につながる2つのケースの違いは何ですか?
上記のようにSRFをテーブルとして使用できますが、テーブルを使用してSRFを置き換えることもできますか?例えば
SELECT my_table;
どうやら、これは実行できませんが、なぜSELECT my_SRF();
可能である
のに、SELECT my_table;
(関係と数学の観点から)許可されていないのですか?
SELECT my_table;
有効な構文ではありません