簡體   English   中英

如何從 PostgreSQL 1:n 表生成 JSON 文檔?

[英]How do I produce a JSON document from PostgreSQL 1:n tables?

我有表“客戶”:

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 文檔。

我想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<>小提琴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM