配列引数を使用して集合を返す関数を複数回呼び出す
この説明は、処理できる foo という名前の集合を返す関数を中心に説明します。特定のパラメータを利用したデータの配列であり、行のセットと追加の列を含む結果が提供されます。この関数は単一のデータ セットでは正常に動作しますが、参照用のデータ ID に依存せずに複数のデータ セットを処理しようとすると課題が発生します。
次の形式を利用するなど、構文を変更しようとするさまざまな試みが行われます。
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
が失敗したため、それぞれに対して関数が繰り返し呼び出されます。
解決策: 水平結合
PostgreSQL バージョン 9.3 以降では、LEFT JOIN LATERAL 構造を使用すると、通常、最適な結果が得られます。
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
この構文では、左側のすべての行が関数 foo が行を返さない場合でも、結合は保持されます。
foo が実際に行を返さず、それらの行を除外したい場合は、次の構文を使用できます:
CROSS JOIN LATERAL foo(sub.arr)
またはその短縮版:
, foo(sub.arr)
このアプローチは PostgreSQL マニュアルに記載されています。
以上がPostgreSQL で配列引数を指定してセットを返す関数を効率的に複数回呼び出すにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。