sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL 9.4:Agregovat / spojit tabulku na id pole JSON uvnitř pole

Základní myšlenkou je, že váš dotaz by měl očekávat, že váš json bude strukturován určitým způsobem, jinak bude opravdu složitý. Na základě očekávané struktury jsme schopni rozdělit strukturu json do sloupců pomocí json_to_recordset a znovu jej sestavit s dalšími informacemi pomocí json_build_object a 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

Funguje to, ale je to velmi omezené, pokud jde o flexibilitu:musím výslovně uvést všechna pole vašich karet a vlastností a očekávám, že dokument bude mít specifickou strukturu. Ale je to dobrý začátek :)




  1. Mytop – Užitečný nástroj pro sledování výkonu MySQL/MariaDB v Linuxu

  2. Tabulkový prostor SYSMGMTDATA je PLNÝ v úložišti správy infrastruktury Grid (MGMTDB)

  3. Docker – Spusťte Apache na hostiteli a kontejneru pro různé webové stránky

  4. Jak získám textový obsah z BLOB v Oracle SQL