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

多次元配列を集約する関数の初期配列

    Postgres9.5以降

    ...集計関数array_agg()の追加のバリアントが付属しています 。マニュアル:

    1つの高次元の配列に連結された入力配列(入力はすべて同じ次元である必要があり、空またはnullにすることはできません)

    したがって、カスタム集計関数array_agg_mult()とまったく同じではありません。 下。ただし、可能であればそれを使用してください。より高速です。

    関連:

    • PostgreSQLで2次元のint配列を並べ替える方法は?

    Postgres9.4以前

    anyの集計関数 配列型

    ポリモーフィックタイプanyarray あらゆる種類の配列(integer[]を含む)で機能します ):

    CREATE AGGREGATE array_agg_mult (anyarray) (
       SFUNC     = array_cat
     , STYPE     = anyarray
     , INITCOND  = '{}'
    );
    

    @Lukasが提供したように、カスタム関数arrayappend() 必要ありません。組み込みのarray_cat() 仕事をします。しかし、それは理由を説明していません あなたの例は失敗しますが、Lukasの答えの例は機能します。関連する違いは、Lukasがarray[d.a]を使用して配列を別の配列レイヤーにネストしたことです。 。

    タイプint[][]を宣言できるという誤った仮定につまずきます 。ただし、次のことはできません:int[][] 同じタイプです int[]として PostgreSQL型システムの場合。マニュアルのアレイタイプに関する章では、次のように説明しています。

    現在の実装では、宣言されたディメンションの数も強制されません。特定の要素タイプの配列は、サイズや次元数に関係なく、すべて同じタイプであると見なされます。したがって、CREATE TABLEで配列のサイズまたは次元数を宣言します。 単なるドキュメントです。実行時の動作には影響しません。

    n -次元整数配列は事実上n-1の配列です -PostgreSQLの整数の次元配列。 基本要素のみを定義するタイプからはわかりません。 。 array_dims()に問い合わせる必要があります 詳細を取得します。

    デモンストレーション:

    SELECT array_agg_mult(arr1)               AS arr1  --> 1-dim array
         , array_agg_mult(ARRAY[arr1])        AS arr2  --> 2-dim array
         , array_agg_mult(ARRAY[ARRAY[arr1]]) AS arr3  --> 3-dim array
           -- etc.
    FROM  (
       VALUES
          ('{1,2,3}'::int[])                           -- 1-dim array
        , ('{4,5,6}')
        , ('{7,8,9}')
       ) t(arr1);
    

    または:

    SELECT array_agg_mult(arr2)        AS arr2  --> 2-dim array
         , array_agg_mult(ARRAY[arr2]) AS arr3  --> 3-dim array
         , array_agg(arr2)             AS arr3  --> 3-dim array; superior in Postgres 9.5+
    FROM  (
       VALUES
          ('{{1,2,3}}'::int[])                  -- 2-dim array
         ,('{{4,5,6}}')
         ,('{{7,8,9}}')
       ) t(arr2);
    

    すべて 結果の列は同じタイプです :int[] (異なる数の次元が含まれている場合でも)



    1. Oracletnsnames.oraのSIDとサービス名の違い

    2. SequelizeおよびMySQLでのPassportの使用

    3. SQLiteデータ型

    4. Postgresql集約配列