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

varchar []にarray_agg()を使用する方法

    標準の集計関数array_agg() 入力としての配列タイプではなく、基本タイプに対してのみ機能します(ただし、 Postgres 9.5+ array_agg()の新しいバリアントがあります できます!)

    カスタム集計関数array_agg_mult()を使用できます この関連する回答で定義されているように:
    Postgres配列へのデータの選択

    データベースごとに1回作成します。次に、クエリは次のように機能します。

    SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
          ,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
    FROM   base.sched_entry se
    LEFT   JOIN base.user_sched_entry use USING (sched_entry_id)
    WHERE  se.sched_entry_id = ANY(ARRAY[623, 625])
    GROUP  BY user_sched_id;
    

    リンクされた回答には詳細な根拠があります。

    エクステントは一致する必要があります

    あなたのコメントに応えて、配列タイプに関するマニュアルからのこの引用を検討してください:

    多次元配列は、次元ごとに一致する範囲を持っている必要があります。不一致があるとエラーが発生します。

    それを回避する方法はありません。配列型はPostgresでそのような不一致を許可しません。あなたはできた すべての次元が一致する範囲を持つように、配列にNULL値を埋め込みます。

    ただし、array_to_string()を使用して、配列をコンマ区切りのリストに変換したいと思います。 このクエリの目的で、string_agg()を使用します textを集約する -できれば別のセパレータを使用してください。私の例では改行を使用しています:

    SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
          ,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
    FROM   ...
    

    正規化

    まず、スキーマの正規化を検討することをお勧めします。通常、この例で概説されているように、別のテーブルを使用してこのようなn:m関係を実装します。
    PostgreSQLで多対多の関係を実装するにはどうすればよいですか?




    1. T-SQLで日付から日を取得する方法

    2. 列名を取得するためのMySQLクエリ?

    3. SELECT句で複数のセットを返す関数に期待される動作は何ですか?

    4. Dockerコンテナ内で実行されているPostgreSQLを監視する方法:パート1