Postgres несколько столбцов в JSON

23

Я использую postgresql 9.3.4. У меня есть таблица с 3 полями:

id   name  addr
---  ----  ----
1    n1    ad1
2    n2    ad2
...

Мне нужно переместить данные в новую таблицу с такими полями:

id   data
---  ----
1    {'name': 'n1', 'addr': 'ad1'}
2    {'name': 'n2', 'addr': 'ad2'}
...

row_to_jsonэто не решение для меня, а SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tдобавляет idк результату. Есть ли способ выбрать поля, которые мне нужны (имя и адрес) в моем поле данных?

AliBZ
источник
Я не уверен, что ответ правильный. Я спросил это 2 года назад. Я также ответил на свой вопрос тогда, но не отметил его как правильный.
AliBZ

Ответы:

52

В json_build_object()Postgres 9.4+ есть лучший вариант :

SELECT id, json_build_object('name', name, 'addr', addr) AS data
FROM   myt;

Но row_to_json()в Postgres 9.3 также есть более простой и быстрый способ :

SELECT id, row_to_json((SELECT d FROM (SELECT name, addr) d)) AS data
FROM   myt;

db <> fiddle here
Старая скрипта SQL на Postgres 9.6.

Связанные ответы:

Эрвин Брандштеттер
источник
Это лучший ответ, и у скрипки есть доказательства.
Мигеле
5

Я нашел ответ по этой ссылке :

select * from (
  select id,
    (
      select row_to_json(d)
      from (
        select name, addr
        from myt d
        where d.id=s.id
      ) d
    ) as data
  from myt s
)
AliBZ
источник
Не забудьте пометить свой собственный ответ как правильный (но без баллов :-(). Я не думаю, что вы можете сделать это сразу, но это может помочь кому-то с подобным вопросом в будущем.
Vérace
2
Помимо отсутствующего псевдонима таблицы во внешнем запросе, это также более сложно и дорого, чем необходимо. Я добавил еще один ответ с скрипкой, чтобы продемонстрировать.
Эрвин Брандштеттер