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

PostgreSQL 9.4:Агрегиране/съединяване на таблица на JSON ID на полето вътре в масива

Основната идея е, че вашата заявка трябва да очаква вашият json да бъде структуриран по определен начин, в противен случай става наистина сложен. Въз основа на очакваната структура ние сме в състояние да разчленим структурата на json на колони с помощта на json_to_recordset и да го възстановите с допълнителна информация с помощта на json_build_object и json_agg .

WITH tab_properties_with_expanded_data_type AS (
    SELECT
      content_type.id AS content_type_id,
      tab.name AS tab_name,
      json_agg(
          -- re-build the property object, but with additional data_type information
          json_build_object(
              'name', property.name,
              'order', property.order,
              'help_text', property.help_text,
              'description', property.description,
              'data_type', json_build_object('id', data_type.id, 'html', data_type.html)
          )
      ) AS tab_properties
    FROM content_type,
      json_to_recordset(content_type.tabs) AS tab(name TEXT, properties JSON),
      json_to_recordset(tab.properties) AS property(name TEXT, "order" INTEGER, help_text TEXT, description TEXT, data_type INTEGER)
      LEFT JOIN data_type ON data_type.id = property.data_type
    GROUP BY 
      content_type.id, 
      tab.name
)
SELECT
  tab_properties_with_expanded_data_type.content_type_id AS id, 
  json_agg(
      -- rebuild the tab object
      json_build_object(
          'name', tab_properties_with_expanded_data_type.tab_name,
          'properties', tab_properties_with_expanded_data_type.tab_properties
      )
  )
FROM tab_properties_with_expanded_data_type
GROUP BY 
  tab_properties_with_expanded_data_type.content_type_id

Това работи, но е много ограничено по отношение на гъвкавостта:трябва изрично да изброя всяко поле на вашите раздели и свойства и очаквам документът да има специфична структура. Но това е добро начало :)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. psql:ФАТАЛНО:твърде много връзки за роля

  2. PostgreSQL:ФАТАЛНО - Удостоверяването на партньора не бе успешно за потребител (PG::ConnectionBad)

  3. Какво представлява JDBC аналог на командата \connect на Postgres?

  4. Postgres сървърът не отговаря на заявка за nodejs

  5. Таблица за представяне за PostgreSQL