PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę scalić rekordy w dwóch tablicach JSON?

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Postgresql lewy zewnętrzny sprzężenie w tablicy json

  2. Konfigurowanie klucza obcego z innym typem danych

  3. Jak uzyskać wczorajszą datę w PostgreSQL

  4. Odejmij dni od daty w PostgreSQL

  5. Uzyskiwanie wyników między dwiema datami w PostgreSQL