Postgres: выбор данных для объекта jsonb - PullRequest
0 голосов
/ 20 мая 2019

Я новичок в json в postgres, поэтому, пожалуйста, ничего не бросайте в меня Я пытаюсь выбрать данные для объекта JSONB. Я планирую использовать его для обновления из избранных. Прямо сейчас это выглядит так:

select to_jsonb(full_address) as full_address
from (
         select "user".living_addr      as living_id,
                "user".living_addr_path as living_path,
                null                    as living_house,

                "user".address_level_id as registration_id,
                "user".address_path     as registration_path,
                null                    as registration_house,

                "user".work_addr      as work_id,
                "user".work_addr_path as work_path,
                null                  as work_house,

                public."user".user_id

         from public."user"
     ) full_address
group by user_id, full_address
order by user_id

Но мне нужно, чтобы "living_id", "living_path", "living_house" находились в объекте так:

{
    "living": {"id", "path", "house"}
}

и то же самое для регистрации, работы и обучения.

Кроме того, мне не нужен user_id в объекте результата.

Пытался использовать такие подзапросы, как:

select to_jsonb(living)            as living,
       to_jsonb(registration)      as registration,
       ...
from (
    select "user".living_addr      as id,
           "user".living_addr_path as path,
           null                    as house
    from public."user"
) living,
(
    select "user".address_level_id as id,
           "user".address_path     as path,
           null                    as house
    from public."user"
) registration
... etc

Но сейчас результат неправильный без группировки, и я не могу найти подсказку, как использовать group by в этом. Должен быть другой, более простой способ, которого я не вижу.

Объект результата должен выглядеть следующим образом:

{
    "work": {"id": ..., "path": [..., ...], "house": null}, 
    "living": {"id": ..., "path": [..., ...], "house": null}, 
    "registration": {"id": ..., "path": [..., ...], "house": null}
}

Есть ли способ сделать это в postgres 9.6?

1 Ответ

0 голосов
/ 20 мая 2019

Да, это намного проще:

select jsonb_build_object(
               'registration', jsonb_build_object('id', u.address_level_id, 'path', u.address_path, 'house', null),
               'living', jsonb_build_object('id', u.living_addr, 'path', living_addr_path, 'house', null),
               'work', jsonb_build_object('id', u.work_addr, 'path', u.work_addr_path, 'house', null)
           )
from public.user u

И обновления не требуется, просто обновите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...