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

カスタム集計関数の最大長までNULLの配列をパッドします

    カスタム集計関数の使用array_agg_mult() この関連する回答で定義されているように:

    期待する結果は不可能です:

    {{1},NULL,{abc}}

    次のようにする必要があります:

    {{1},{NULL},{abc}}
    

    配列要素が0または1の単純なケース

    空の配列を置き換える単純なケースの場合:これは次の方法で実現できます:

    WITH t(arr) AS (
        VALUES
          ('{1}'::text[])
         ,('{}')
         ,('{abc}')
       )
    SELECT array_agg_mult(ARRAY[CASE WHEN arr = '{}' THEN '{NULL}' ELSE arr END])
    FROM   t;
    

    n個の要素の動的パディング

    array_fill()の使用 最大長までNULL要素で配列を埋めるには:

    SELECT array_agg_mult(ARRAY[
             arr || array_fill(NULL::text
                             , ARRAY[max_elem - COALESCE(array_length(arr, 1), 0)])
           ]) AS result
    FROM   t, (SELECT max(array_length(arr, 1)) AS max_elem FROM t) t1;
    

    それでも1次元でのみ機能します 基本的な配列。

    説明

    • サブクエリt1 基本的な1次元配列の最大長を計算します。
    • COALESCE(array_length(arr, 1), 0) この行の配列の長さを計算します。
      COALESCE デフォルトは0 NULLの場合 。
    • array_fill()を使用して、長さの違いに対応するパディング配列を生成します 。
    • それをarrに追加します ||を使用
    • 上記のようにarray_agg_mult()で集計します 。

    SQLフィドル。 すべてのデモンストレーション 。
    SQL Fiddleでの出力は誤解を招くため、結果をテキストにキャストしました。




    1. pgadmin sqlクエリにパラメータ値を追加するにはどうすればよいですか?

    2. コマンドラインを使用してLinux上にMySQLユーザーを作成する

    3. JDBCを使用したPostgreSQLへの低速挿入

    4. brianc/node-postgresを使用してPostgresに一括挿入