sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL 9.4:Aggregate / Join-tabel op JSON-veld-ID in array

Het basisidee is dat uw query moet verwachten dat uw json op een bepaalde manier is gestructureerd, anders wordt het erg complex. Op basis van de verwachte structuur kunnen we de json-structuur in kolommen ontleden met behulp van json_to_recordset en om het opnieuw op te bouwen met aanvullende informatie met behulp van json_build_object en 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

Dit werkt maar is zeer beperkt in termen van flexibiliteit:ik moet elk veld van je tabbladen en eigenschappen expliciet vermelden en ik verwacht dat het document een specifieke structuur heeft. Maar het is een goed begin :)




  1. Wat is het verschil tussen int en integer in MySQL 5.0?

  2. SYSDATETIMEOFFSET() Voorbeelden in SQL Server (T-SQL)

  3. Beperkingen toevoegen met behulp van subquery's uit een andere tabel

  4. Ernstige accenten in plaats van '' in mysqli_query