如何从查询中返回json数组?

时间:2018-03-25 00:41:32

标签: json postgresql jsonb

在postgres 10数据库中,有三个表:

主要:

id | name
-----------
1  | first
2  | second
3  | third
…

物质

id  | name
----------------------
1   | gold
2   | silver
3   | aluminum
…

链路

id  | id_main  | id_substance
---------------------------------
1   | 1        | 1
2   | 1        | 2
3   | 1        | 3
4   | 2        | 1
5   | 3        | 2
6   | 3        | 3

如何进行查询以返回这样的json对象?

[
  {
    "name": "first",
    "substances": ["gold", "silver", "aluminum"]
  },
  {
    "name": "second",
    "substances": ["gold"]
   },
   {
    "name": "third",
    "substances": ["silver", "aluminum"]
   }
]

1 个答案:

答案 0 :(得分:2)

使用聚合函数jsonb_agg()两次在两个级别上构建json数组:

select jsonb_agg(a_row)
from (
    select 
        jsonb_build_object(
            'name', main_name, 
            'substances', jsonb_agg(substances_name)
        ) as a_row
    from (
        select m.name as main_name, s.name as substances_name
        from link l
        left join main m on id_main = m.id
        left join substances s on id_substances = s.id
        ) s
    group by main_name
    ) s;

(格式化)结果:

[
    {
        "name": "first",
        "substances": ["gold", "silver", "aluminum"]
    },
    {
        "name": "third",
        "substances": ["silver", "aluminum"]
    },
    {
        "name": "second",
        "substances": ["gold"]
    }
]
相关问题