L'idea di base è che la tua query dovrebbe aspettarsi che il tuo json sia strutturato in un certo modo, altrimenti diventa davvero complesso. Sulla base della struttura prevista, siamo in grado di sezionare la struttura json in colonne usando json_to_recordset
e per ricostruirlo con informazioni aggiuntive usando json_build_object
e 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
Funziona ma è molto limitato in termini di flessibilità:devo elencare esplicitamente ogni campo delle tue schede e proprietà e mi aspetto che il documento abbia una struttura specifica. Ma è un buon inizio :)