PostgreSQLは、SELECT
でのset-returning関数の呼び出しをサポートしています。 句。 LATERAL
ができたので、これはやや非推奨になりました。 動作がかなり不安定であるため、確かに推奨されませんが、引き続き有用です。
あなたの場合、あなたは書くことができます:
SELECT
i.*,
(partition_into_months(i.start_date, i.stop_or_current_date)).*
FROM invoicable_interval i;
ただし、これにより、partition_into_months
が1回呼び出される可能性があります。 (fn).*
が原因で、列ごとに返される 基本的には(fn).col1, (fn).col2, ...
にマクロ展開されます 。これを回避するには、サブクエリでラップします。例:
SELECT (x.i).*, (x.p).*
FROM
(
SELECT
i,
partition_into_months(i.start_date, i.stop_or_current_date) p
FROM invoicable_interval i
) x(i,p);
SELECT
に複数のセットを返す関数があると、奇妙な結果が発生することに注意してください。 リスト。あなたが期待するようなクロスジョインではありません。たとえば、次のように比較します。
SELECT generate_series(1,4), generate_series(1,4)
に
SELECT generate_series(1,4), generate_series(1,3);