Postgres várias colunas para json

23

Estou executando o postgresql 9.3.4. Eu tenho uma tabela com 3 campos:

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

Eu preciso mover os dados para uma nova tabela com campos como:

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

row_to_jsonnão é a solução para mim, pois SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tcontribui idpara o resultado também. Existe uma maneira de escolher os campos que eu preciso (nome e endereço) no meu campo de dados?

AliBZ
fonte
Não tenho certeza se a resposta está correta. Eu perguntei 2 anos atrás. Também respondi minha pergunta na época, mas não a marquei como correta.
AliBZ

Respostas:

51

Existe uma opção melhor json_build_object()no Postgres 9.4+ :

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

Mas também existe uma maneira mais simples e rápida row_to_json()no Postgres 9.3 :

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

db <> fiddle aqui
Old SQL Fiddle no Postgres 9.6.

Respostas relacionadas:

Erwin Brandstetter
fonte
Esta é uma resposta melhor, e o violino tem a prova.
MIguelele
5

Encontrei a resposta neste link :

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
fonte
Não esqueça de marcar sua própria resposta como correta (sem pontos :-(). Não acho que você possa fazer isso imediatamente, mas isso pode ajudar alguém com uma pergunta semelhante no futuro.
Vérace
2
Além do alias da tabela ausente na consulta externa, isso também é mais complexo e caro do que o necessário. Eu adicionei outra resposta com um violino para demonstrar.
Erwin Brandstetter