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

Jak dołączyć elementy tablicy jsonb w Postgresie?

Zakładając co najmniej Postgres 9.5, wykona to zadanie:

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;

Jak?

  1. Odblokuj jsonb tablica, tworząc 1 wiersz na element tablicy:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. Dla każdego elementu LEFT JOIN do images na warunkach, które
    a. Klucz „typ” ma wartość „obraz”:c.elem->>'type' = 'image'
    b. Identyfikator UUID w image_id dopasowania:i.id = (elem->>'image_id')::uuid

  3. W przypadku typów obrazów, w których znaleziono pasujący obraz

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

    usuń klucz „image_id” i dodaj powiązany wiersz obrazu jako jsonb wartość:

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

    W przeciwnym razie zachowaj oryginalny element.

  4. Ponowna agregacja zmodyfikowanych elementów do nowej content kolumna z jsonb_agg() .

  5. Bezwarunkowo LEFT JOIN LATERAL wynik do posts i zaznacz wszystkie kolumny, zamień tylko p.content z wygenerowanym zamiennikiem c.content

  6. W zewnętrznym SELECT , przekonwertuj cały wiersz na jsonb za pomocą prostego to_jsonb() .

Wszystkie jsonb funkcje są opisane w instrukcji tutaj.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Narzędzie do porównywania danych PostgreSQL

  2. RailsTutorial 3.2 Ch 11 - Błąd składni PostgreSQL powoduje przerwanie kanału statusu

  3. Zapytanie Postgresql, aby uzyskać liczbę miesięcy w ciągu jednego roku

  4. Postgres – Wiele sprzężeń powoduje, że moje zapytanie zwraca nieprawidłowe dane

  5. Parametr konfiguracyjny work_mem w PostgreSQL w systemie Linux