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

2つのJSON配列内のレコードをマージするにはどうすればよいですか?

    想定 データ型jsonb また、同じ「id」値を共有する各JSON配列のレコードをマージする必要があります。

    Postgres 9.5

    新しい連結を使用すると、簡単になります演算子|| jsonbの場合 値 :

    SELECT json_agg(elem1 || elem2) AS result
    FROM  (
       SELECT elem1->>'id' AS id, elem1
       FROM  (
          SELECT '[
            {"id":1, "percent":12.50}, 
            {"id":2, "percent":75.00}, 
            {"id":3, "percent":12.50}
           ]'::jsonb AS js
          ) t, jsonb_array_elements(t.js) elem1
       ) t1
    FULL JOIN (
       SELECT elem2->>'id' AS id, elem2
       FROM  (
          SELECT '[
            {"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
            {"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
            {"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
          ) t, jsonb_array_elements(t.js) elem2
       ) t2 USING (id);
    

    FULL [OUTER] JOIN 他のアレイで一致せずにレコードを失わないようにします。

    タイプjsonb レコード内の各キーの最新の値のみを保持する便利なプロパティがあります。したがって、結果の重複する「id」キーは自動的にマージされます。

    Postgres9.5のマニュアルにもアドバイスがあります:

    Postgres 9.4

    少し不便です。私の考えは、配列要素を抽出してから、すべてのキーと値のペアを抽出することです。UNION 両方の結果が1つの新しいjsonbに集約されます ID値ごとの値であり、最終的に1つの配列に集約されます。

    SELECT json_agg(j) -- ::jsonb
    FROM  (
       SELECT json_object_agg(key, value)::jsonb AS j
       FROM  (
          SELECT elem->>'id' AS id, x.*
          FROM  (
             SELECT '[
               {"id":1, "percent":12.50}, 
               {"id":2, "percent":75.00}, 
               {"id":3, "percent":12.50}]'::jsonb AS js
             ) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
          UNION ALL  -- or UNION, see below
          SELECT elem->>'id' AS id, x.*
          FROM  (
             SELECT '[
               {"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
               {"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
               {"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
             ) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
          ) t
       GROUP  BY id
       ) t;
    

    jsonbへのキャスト 重複するキーを削除します。または、UNIONを使用することもできます 重複を折りたたむ(たとえば、jsonが必要な場合) 結果として)。あなたのケースでどちらが速いかをテストしてください。

    関連:



    1. SQLServerデータベースをAzureSQLデータベースに移行する方法

    2. JPACriteriaAPIを使用して文字列の日付フィールドを検索する方法

    3. PL / SQLでファイルをZIPする方法は?

    4. PHPを使用して接続するSQLServerアドレス