【问题标题】:How do I produce a JSON document from PostgreSQL 1:n tables?如何从 PostgreSQL 1:n 表中生成 JSON 文档?
【发布时间】:2020-08-25 06:49:37
【问题描述】:

我的“客户”表有:

id  name     registered_on  status
--  -------  -------------  ------
 1  Alice    2020-03-04     a     
 2  Vincent  2020-03-05     p     
 3  Anne     2020-03-06     a     

和表“帐户”:

client_id  account_number  type  balance
---------  --------------  ----  -------
        1  300-1           CHK       100
        2  307-5           SAV        24
        2  307-6           CHK       350

我在DB Fiddle 中创建了它们。

现在,我需要一个 SQL 查询来生成 1:n JSON 文档。

表格之间存在 1:n 关系,部分客户可能没有帐户(例如“Anne”):

[
  {
    "id":1,
    "name":"Alice",
    "registered_on":"2020-03-04",
    "status":"a",
    accounts: [ 
      {
        "account_number": "300-1",
        "type": "CHK",
        "balance": 100.00
      }
    ]
  },
  {
    "id":2,
    "name":"Vincent",
    "registered_on":"2020-03-05",
    "status":"p",
    accounts: [ 
      {
        "account_number": "307-5",
        "type": "SAV",
        "balance": 24
      },
      {
        "account_number": "307-6",
        "type": "CHK",
        "balance": 350
      }
    ]
  },
  {
    "id":3,
    "name":"Anne",
    "registered_on":"2020-03-06",
    "status":"a",
    accounts: [ ]
  }  
]

结果是一个简单的连接(可能是外部连接),我知道该怎么做。我只是不知道如何从中生成 JSON 文档。

【问题讨论】:

    标签: sql json postgresql aggregate-functions jsonb


    【解决方案1】:

    我想client 表的id 列是主键。要使用的关键函数是to_jsonb()jsonb_agg().

    select jsonb_pretty(jsonb_agg(r))
    from (
        select
            to_jsonb(c) || jsonb_build_object(
                'accounts', 
                coalesce(nullif(jsonb_agg(to_jsonb(a)- 'client_id'), '[null]'), '[]')
                ) as r
        from client c
        left join account a on client_id = id
        group by c.id
        ) s
    

    Db<>fiddle.

    【讨论】:

    • 我刚刚发现了一个小细节。在第三种情况下,“Anne”JSON 对象应该包含一个空的帐户数组,但最终会得到一个大小为 1 的数组,其中包含一个“null”值。不是主要问题,但至少想记录下来。再次感谢。
    猜你喜欢
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2014-08-24
    • 2011-08-29
    • 1970-01-01
    • 2016-03-24
    相关资源
    最近更新 更多