Zakładając typ danych jsonb
i chcesz scalić rekordy każdej tablicy JSON, które mają tę samą wartość „id”.
Postgres 9,5
ułatwia to dzięki nowemu konkatenacji operator ||
dla jsonb
wartości
:
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
upewnia się, że nie stracisz rekordów bez dopasowania w drugiej tablicy.
Typ jsonb
ma wygodną właściwość, aby zachować tylko najnowszą wartość dla każdego klucza w rekordzie. Dlatego zduplikowany klucz „id” w wyniku jest automatycznie scalany.
Instrukcja Postgres 9.5 również radzi:
Postgres 9.4
Jest trochę mniej wygodny. Moim pomysłem byłoby wyodrębnienie elementów tablicy, a następnie wyodrębnienie wszystkich par klucz/wartość, UNION
oba wyniki agregują w jeden nowy jsonb
wartości na wartość identyfikatora i ostatecznie zagregowane w jedną tablicę.
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;
Przekaz do jsonb
usuwa zduplikowane klucze. Alternatywnie możesz użyć UNION
do składania duplikatów (na przykład, jeśli chcesz json
w wyniku). Sprawdź, który jest szybszy w Twoim przypadku.
Powiązane: