Postgres banyak kolom ke json

23

Saya menjalankan postgresql 9.3.4. Saya punya tabel dengan 3 bidang:

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

Saya perlu memindahkan data ke tabel baru dengan bidang seperti:

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

row_to_jsonbukan solusi bagi saya karena SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tmenambah idhasil juga. Apakah ada cara untuk memilih bidang yang saya butuhkan (nama & addr) di bidang data saya?

AliBZ
sumber
Saya tidak yakin apakah jawabannya benar. Saya menanyakannya 2 tahun lalu. Saya juga menjawab pertanyaan saya saat itu tetapi tidak menandainya sebagai benar.
AliBZ

Jawaban:

52

Ada opsi yang lebih baik json_build_object()di Postgres 9.4+ :

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

Tetapi ada juga cara yang lebih sederhana dan lebih cepat row_to_json()dalam Postgres 9.3 :

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

db <> biola di sini
Old SQL Fiddle di Postgres 9.6.

Jawaban terkait:

Erwin Brandstetter
sumber
Ini adalah jawaban yang lebih baik, dan biola memiliki buktinya.
MIguelele
5

Saya menemukan jawabannya dari tautan ini :

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
sumber
Jangan lupa untuk menandai jawaban Anda sendiri sebagai benar (tidak ada poin :-(). Saya tidak berpikir bahwa Anda dapat melakukan ini dengan segera, tetapi mungkin membantu seseorang dengan pertanyaan serupa di masa depan.
Vérace
2
Selain dari tabel yang hilang alias di kueri luar, ini juga lebih kompleks dan mahal daripada yang diperlukan. Saya menambahkan jawaban lain dengan biola untuk diperagakan.
Erwin Brandstetter