如何形成 Postgres SQL 以返回多个数组对象而不是多个数组对象的数组?

问题描述 投票:0回答:1

我有多个表示表单选项的表,我想从中请求数据作为包含键值对的 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
}
sql database postgresql
1个回答
0
投票

可能的解决方案是使用

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;
© www.soinside.com 2019 - 2024. All rights reserved.