sql >> データベース >  >> RDS >> PostgreSQL

2つの配列を組み合わせたPostgreSQLのzip()関数のようなものはありますか?

    Postgres9.5以降

    array_agg(array expression)があります

    array_agganyarray )→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}}
    


    1. SQLServerストアドプロシージャからのAPIの呼び出し

    2. PostgreSQLのカスタムトリガーベースのアップグレード

    3. jsonをキャッシュするための最良の方法

    4. MySQL、Postgres、Aurora用のサーバーレスGraphQLAPIを作成する方法