sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL 9.4:Aggregate/Join-tabell på JSON-fält-id inuti array

Grundidén är att din fråga ska förvänta sig att din json ska vara strukturerad på ett visst sätt, annars blir den riktigt komplex. Baserat på den förväntade strukturen kan vi dissekera json-strukturen i kolumner med json_to_recordset och att bygga om den med ytterligare information med json_build_object och 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

Detta fungerar men är mycket begränsat när det gäller flexibilitet:jag måste uttryckligen lista varje fält av dina flikar och egenskaper och jag förväntar mig att dokumentet har en specifik struktur. Men det är en bra början :)




  1. Kan inte få kodningen rätt i MySQL

  2. jsonb vs jsonb[] för flera adresser för en kund

  3. Hur man infogar rader i SQL Server Table genom att redigera tabellrader GUI - SQL Server / TSQL Tutorial Del 101

  4. MySQL &PHP Parameter 1 som resurs