PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да съединя елементи от масив jsonb в Postgres?

Ако приемем поне Postgres 9.5, това ще свърши работата:

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;

Как?

  1. Премахнете jsonb масив, произвеждащ 1 ред на елемент от масива:

    jsonb_array_elements(p.content) AS c(elem)
    
  2. За всеки елемент LEFT JOIN към images при условията, които
    а. Ключът 'type' има стойността 'image':c.elem->>'type' = 'image'
    б. UUID в image_id съвпада с:i.id = (elem->>'image_id')::uuid

  3. За типове изображения, където е намерено съответстващо изображение

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

    премахнете ключа 'image_id' и добавете свързания ред с изображение като jsonb стойност:

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

    В противен случай запазете оригиналния елемент.

  4. Реагрегирайте модифицираните елементи в ново content колона с jsonb_agg() .

  5. Безусловно LEFT JOIN LATERAL резултатът към posts и изберете всички колони, заменете само p.content с генерирания заместител c.content

  6. Във външния SELECT , конвертирайте целия ред в jsonb с прост to_jsonb() .

Всички jsonb функциите са документирани в ръководството тук.




  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?

  2. Предаване на C променливи в SQL команда

  3. Мониторинг и одит на производителността PostgreSQL - Топ ресурси

  4. грешка в postgresql PANIC:не можа да се намери валиден запис на контролна точка

  5. Как мога да постигна същото поведение на сортиране на Postgres в Linux като това в Mac OS?