我有多个表示表单选项的表,我想从中请求数据作为包含键值对的 JSON 对象数组。
但是,我正在努力使用未构建的 Postgres JSON 函数以正确的形式返回数据。
我试过这个:
SELECT json_agg(form_values.data)
FROM ( SELECT json_build_object('state', json_agg(json_build_object('value', os.id, 'name,', os.name))) as data
FROM opt_state os
UNION ALL
SELECT json_build_object('status', json_agg(json_build_object('value', ostat.id, 'name,', ostat.name)))
FROM opt_status ostat
UNION ALL
SELECT json_build_object('survey_grade', json_agg(json_build_object('value', osg.id, 'name,', osg.name)))
FROM opt_survey_grade osg) form_values;
返回 this,其中每个数组对象都被列为父数组的一部分:
[
{
"state": [
{
"value": 2,
"name,": "Massachusetts"
},
{
"value": 1,
"name,": "New York"
},
{
"value": 3,
"name,": "Vermont"
}
etc etc
]
},
{
"status": [
{
"value": 1,
"name,": "Open"
},
{
"value": 2,
"name,": "Closed"
}
]
},
etc etc
]
但是我希望生成的 JSON 看起来像这样:
{
"state": [
{
"value": 2,
"name,": "Massachusetts"
},
{
"value": 1,
"name,": "New York"
},
{
"value": 3,
"name,": "Vermont"
}
etc etc
],
"status": [
{
"value": 1,
"name,": "Open"
},
{
"value": 2,
"name,": "Closed"
}
],
etc etc
}
可能的解决方案是使用
json_object_agg
函数而不是 json_agg
将 JSON 对象直接聚合为单个 JSON 对象:
SELECT json_object_agg(form_values.key, form_values.data) AS result
FROM (
SELECT 'state' AS key, json_agg(json_build_object('value', os.id, 'name', os.name)) AS data
FROM opt_state os
UNION ALL
SELECT 'status' AS key, json_agg(json_build_object('value', ostat.id, 'name', ostat.name)) AS data
FROM opt_status ostat
UNION ALL
SELECT 'survey_grade' AS key, json_agg(json_build_object('value', osg.id, 'name', osg.name)) AS data
FROM opt_survey_grade osg
) form_values;