sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL 9.4:Aggregate / Join tabel på JSON felt-id inde i array

Den grundlæggende idé er, at din forespørgsel skal forvente, at din json er struktureret på en bestemt måde, ellers bliver den virkelig kompleks. Baseret på den forventede struktur er vi i stand til at dissekere json-strukturen i kolonner ved hjælp af json_to_recordset og for at genopbygge den med yderligere information ved hjælp af json_build_object og 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

Dette virker, men er meget begrænset med hensyn til fleksibilitet:Jeg skal udtrykkeligt angive hvert felt af dine faner og egenskaber, og jeg forventer, at dokumentet har en specifik struktur. Men det er en god start :)




  1. Tidsstempel med en millisekunds præcision:Sådan gemmer du dem i MySQL

  2. Oprettelse af en tabel med mysql, php og ajax (med jquery)

  3. Formater sysjobhistorie, dato og varighed Kolonner i SQL Server

  4. Samlet antal 1'ere i en Postgres bitmaske