sql >> Databáze >  >> RDS >> PostgreSQL

Jak se připojit k prvkům pole jsonb v Postgres?

Za předpokladu alespoň Postgres 9.5 to bude fungovat:

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. Zrušte vnoření jsonb pole, vytváří 1 řádek na prvek pole:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. Pro každý prvek LEFT JOIN na images za podmínek, které
    a. klíč 'type' má hodnotu 'image':c.elem->>'type' = 'image'
    b. UUID v image_id odpovídá:i.id = (elem->>'image_id')::uuid

  3. Pro typy obrázků, kde byl nalezen odpovídající obrázek

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

    odstraňte klíč 'image_id' a přidejte související řádek obrázku jako jsonb hodnota:

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

    Jinak ponechte původní prvek.

  4. Znovu agregujte upravené prvky do nového content sloupec s jsonb_agg() .

  5. Bezpodmínečně LEFT JOIN LATERAL výsledek do posts a vyberte všechny sloupce, nahraďte pouze p.content s vygenerovanou náhradou c.content

  6. Ve vnějším SELECT , převeďte celý řádek na jsonb pomocí jednoduchého to_jsonb() .

Vše jsonb funkce jsou popsány v návodu zde.




  1. Jak se připojit k Amazon RDS přes SSL?

  2. Jak se vyhnout dělení nulou v MySQL

  3. Anatomie uváznutí SQL Serveru a nejlepší způsoby, jak se jim vyhnout

  4. Dotaz a zjistěte druhou sobotu každého měsíce v roce