PostgreSQL による SELECT ステートメント内の複数のセットを返す関数の処理: バージョン固有の分析
SELECT
ステートメント内で複数のセットを返す関数が発生したときの PostgreSQL の動作は、データベースのバージョンによって大きく異なります。
PostgreSQL 10 以降:
バージョン 10 以降では、これらの関数は同期的に実行されます。 出力は、最も多くの行を生成する関数が結果セット内の総行数を決定するように構造化されています。 短い関数の出力には、この位置合わせを維持するために NULL
値が埋め込まれ、効果的にクロス結合のような結果が作成されます。
PostgreSQL 9.6 以前:
バージョン 9.6 より前では、結果は大幅に異なります。生成される行の合計数は、セットを返す各関数からの行数の最小公倍数 (LCM) に等しくなります。 これにより、特に行数に共通の因子がない場合、予測不可能で望ましくない結果が生じる可能性があります。
例:
クエリを調べてみましょう:
<code class="language-sql">SELECT generate_series(1, 3), generate_series(5, 7);</code>
PostgreSQL 10 出力:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 NULL | NULL NULL | NULL NULL | NULL</code>
PostgreSQL 9.6- 出力:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7</code>
重要な考慮事項:
CASE
および COALESCE
式内でのセットを返す関数の使用が禁止されています。LATERAL JOIN
リストに複数の集合を返す関数を直接含めるのではなく、ROWS FROM (...)
を SELECT
とともに使用することを強くお勧めします。関連ドキュメント:
以上が複数のセットを返す関数は、異なるバージョン間で PostgreSQL の SELECT 句でどのように動作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。