Postgres9.5以降
array_agg(array expression)
があります :
array_agg
(anyarray
)→anyarray
すべての入力配列を1つの高次元の配列に連結します。 (入力はすべて同じ次元である必要があり、空またはnullにすることはできません。)
これは、カスタム集計関数array_agg_mult()
のドロップイン置換です。 以下に示します。これはCで実装されており、かなり高速です。使用してください。
Postgres 9.4
ROWS FROM
を使用します コンストラクトまたは更新されたunnest()
これは、複数のアレイを並行してアンネストする必要があります。それぞれの長さを変えることができます。 (ドキュメントごとに)取得します:
[...]この場合の結果行の数は、最大のfunctionresultの数であり、小さい結果には一致するnull値が埋め込まれます。
このよりクリーンでシンプルなバリアントを使用してください:
SELECT ARRAY[a,b] AS ab
FROM unnest('{a,b,c}'::text[]
, '{d,e,f}'::text[]) x(a,b);
Postgres9.3以前
シンプルなzip()
Postgres9.3以前の次のデモを検討してください :
SELECT ARRAY[a,b] AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
, unnest('{d,e,f}'::text[]) AS b
) x;
結果:
ab
-------
{a,d}
{b,e}
{c,f}
両方の配列に同じ数の要素が必要であることに注意してください 並行してアンネストするか、代わりにクロスジョインを取得します。
必要に応じて、これを関数にラップできます。
CREATE OR REPLACE FUNCTION zip(anyarray, anyarray)
RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT ARRAY[a,b] FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;
電話:
SELECT zip('{a,b,c}'::text[],'{d,e,f}'::text[]);
同じ結果。
zip()から多次元配列へ:
ここで、集計したい場合 その新しい配列のセットを1つの2次元に 配列、それはより複雑になります。
SELECT ARRAY (SELECT ...)
または:
SELECT array_agg(ARRAY[a,b]) AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
,unnest('{d,e,f}'::text[]) AS b
) x
または:
SELECT array_agg(ARRAY[ARRAY[a,b]]) AS ab
FROM ...
すべて同じエラーメッセージが表示されます(9.1.5ページでテスト済み):
エラー:データ型text []
の配列型が見つかりませんでした
しかし、この密接に関連する質問の下で解決したので、これを回避する方法があります。
カスタム集計関数を作成します:
CREATE AGGREGATE array_agg_mult (anyarray) (
SFUNC = array_cat
, STYPE = anyarray
, INITCOND = '{}'
);
そして、次のように使用します:
SELECT array_agg_mult(ARRAY[ARRAY[a,b]]) AS ab
FROM (
SELECT unnest('{a,b,c}'::text[]) AS a
, unnest('{d,e,f}'::text[]) AS b
) x
結果:
{{a,d},{b,e},{c,f}}
追加のARRAY[]
に注意してください 層!それなしでただ:
SELECT array_agg_mult(ARRAY[a,b]) AS ab
FROM ...
取得:
{a,d,b,e,c,f}
これは他の目的にも役立つ可能性があります。
別の関数をロールする:
CREATE OR REPLACE FUNCTION zip2(anyarray, anyarray)
RETURNS SETOF anyarray LANGUAGE SQL AS
$func$
SELECT array_agg_mult(ARRAY[ARRAY[a,b]])
FROM (SELECT unnest($1) AS a, unnest($2) AS b) x;
$func$;
電話:
SELECT zip2('{a,b,c}'::text[],'{d,e,f}'::text[]); -- or any other array type
結果:
{{a,d},{b,e},{c,f}}