Как создать документ JSON из таблиц PostgreSQL 1: n? - PullRequest
1 голос
/ 09 мая 2020

У меня есть таблица «client» с:

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

И таблица «account» с:

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.

1 Ответ

1 голос
/ 09 мая 2020

Полагаю, столбец id таблицы client является первичным ключом. Ключевые функции: 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.

...