あなたは愛する Postgresのこの新機能9.4 :
unnest(anyarray, anyarray [, ...])
unnest()
複数のアレイを並列にクリーンにアンネストするための待望の(少なくとも私は)機能を備えています 。マニュアル:
複数の配列(おそらく異なるタイプ)を行のセットに展開します。これはFROM句でのみ許可されます;
これは、新しいROWS FROM
の特別な実装です。 機能。
これで、関数は次のようになります。
CREATE OR REPLACE FUNCTION multi_unnest(_some_id int
, _amounts numeric[]
, _invoices text[])
RETURNS TABLE (some_id int, amount numeric, invoice text) AS
$func$
SELECT _some_id, u.* FROM unnest(_amounts, _invoices) u;
$func$ LANGUAGE sql;
電話:
SELECT * FROM multi_unnest(123, '{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]);
もちろん、単純なフォームはプレーンSQLに置き換えることができます (追加機能なし):
SELECT 123 AS some_id, *
FROM unnest('{100, 40.5, 76}'::numeric[]
, '{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS u(amount, invoice);
以前のバージョン(Postgres 9.3- )、エレガントで安全性の低いフォームを使用できます:
SELECT 123 AS some_id
, unnest('{100, 40.5, 76}'::numeric[]) AS amount
, unnest('{01-2222-05,01-3333-04,01-4444-08}'::text[]) AS invoice;
古い省略形の警告:SELECT
にset-returning関数があることは非標準であることに加えて リストでは、返される行数は、各配列の要素数の最小公倍数になります(数が等しくない場合は驚くべき結果が得られます)。これらの関連する回答の詳細:
- PostgreSQLでの並列unnest()と並べ替え順序
- 2つの配列を組み合わせたPostgreSQLのzip()関数のようなものはありますか?
この動作は、 Postgres 10でようやくサニタイズされました。 。 SELECT
内の複数のセットを返す関数 リストは「ロックステップ」で行を生成するようになりました。参照:
- SELECT句で複数のセットを返す関数に期待される動作は何ですか?