想定 データ型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
が必要な場合) 結果として)。あなたのケースでどちらが速いかをテストしてください。
関連: