Основната идея е, че вашата заявка трябва да очаква вашият json да бъде структуриран по определен начин, в противен случай става наистина сложен. Въз основа на очакваната структура ние сме в състояние да разчленим структурата на json на колони с помощта на json_to_recordset
и да го възстановите с допълнителна информация с помощта на json_build_object
и 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
Това работи, но е много ограничено по отношение на гъвкавостта:трябва изрично да изброя всяко поле на вашите раздели и свойства и очаквам документът да има специфична структура. Но това е добро начало :)