Postgres múltiples columnas a json

23

Estoy ejecutando postgresql 9.3.4. Tengo una tabla con 3 campos:

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

Necesito mover los datos a una nueva tabla con campos como:

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

row_to_jsonno es la solución para mí, ya que también se SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tsuma idal resultado. ¿Hay alguna manera de elegir los campos que necesito (nombre y dirección) en mi campo de datos?

AliBZ
fuente
No estoy seguro de si la respuesta es correcta. Lo pregunté hace 2 años. También respondí mi pregunta en ese momento, pero no la marqué como correcta.
AliBZ

Respuestas:

52

Hay una mejor opción con json_build_object()Postgres 9.4+ :

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

Pero también hay una manera más simple y rápida con 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
Old SQL Fiddle en Postgres 9.6.

Respuestas relacionadas:

Erwin Brandstetter
fuente
Esta es una mejor respuesta, y el violín tiene la prueba.
MIguelele
5

Encontré la respuesta de este enlace :

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
fuente
No te olvides de marcar tu propia respuesta como correcta (sin puntos :-(). No creo que puedas hacer esto de inmediato, pero podría ayudar a alguien con una pregunta similar en el futuro.
Vérace
2
Aparte del alias de la tabla que falta en la consulta externa, esto también es más complejo y costoso de lo necesario. Agregué otra respuesta con un violín para demostrar.
Erwin Brandstetter