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

Postgresでjsonb配列要素を結合する方法は?

    少なくともPostgres9.5を想定すると、これでうまくいきます:

    SELECT jsonb_pretty(to_jsonb(p)) AS post_row_as_json
    FROM  (
       SELECT id, title, author_id, c.content
       FROM   posts p
       LEFT   JOIN LATERAL (
          SELECT jsonb_agg(
                   CASE WHEN c.elem->>'type' = 'image' AND i.id IS NOT NULL
                        THEN elem - 'image_id' || jsonb_build_object('image', i)
                        ELSE c.elem END) AS content
          FROM   jsonb_array_elements(p.content) AS c(elem)
          LEFT   JOIN images i ON c.elem->>'type' = 'image'
                              AND i.id = (elem->>'image_id')::uuid
          ) c ON true
       ) p;
    

    どのように?

    1. jsonbのネストを解除します 配列、配列要素ごとに1行を生成します:

      jsonb_array_elements(p.content) AS c(elem)
      
    2. 各要素についてLEFT JOIN images
      a。 キー 'type'にはがあります 'image':c.elem->>'type' = 'image'
      b。 image_idのUUID 一致:i.id = (elem->>'image_id')::uuid

    3. 一致する画像が見つかった画像タイプの場合

      c.elem->>'type' = 'image' AND i.id IS NOT NULL
      

      キー「image_id」を削除し、関連する画像行をjsonbとして追加します 値:

      elem - 'image_id' || jsonb_build_object('image', i)
      

      それ以外の場合は、元の要素を保持します。

    4. 変更された要素を新しいcontentに再集約します jsonb_agg()の列 。

    5. 無条件にLEFT JOIN LATERAL 結果をposts すべての列を選択し、p.contentのみを置き換えます 生成された置換c.content

    6. 外側のSELECT 、行全体をjsonbに変換します 単純なto_jsonb()を使用します 。

    すべてのjsonb 機能については、こちらのマニュアルに記載されています。




    1. テーブルがSQLServer(T-SQL)でパーティション化されているかどうかを確認する

    2. トランザクションの影響を受けないシーケンス?

    3. Yii2 find()/QueryBuilderのWHERE条件を使用したSELECTサブクエリ

    4. SSISはVarchar2をDT_STRに変換します