Json'a birden fazla sütun gönder


23

Postgresql 9.3.4 kullanıyorum. 3 alanlı bir masam var:

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

Verileri aşağıdaki gibi alanlarla yeni bir tabloya taşımam gerekiyor:

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

row_to_jsonBeni olduğunca çözüm değildir SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tekler idde sonuca. Veri alanımda ihtiyaç duyduğum alanları (ad ve adres) seçmenin bir yolu var mı?


Cevabın doğru olup olmadığından emin değilim. 2 yıl önce sordum. Ayrıca sorumu daha sonra yanıtladım ama doğru olarak işaretlemedi.
AliBZ

Yanıtlar:


52

json_build_object()Postgres 9.4+ ile daha iyi bir seçenek var :

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

Ancak row_to_json()Postgres 9.3'te daha basit ve daha hızlı bir yol var :

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

db <> Keman Burada
Eski SQL Keman Postgres 9.6.

İlgili cevaplar:


Bu daha iyi bir cevap ve kemanın ispatı var.
MIguelele

5

Bu bağlantıdaki cevabı buldum :

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
)

Kendi cevabını doğru olarak işaretlemeyi unutma (her ne kadar puan olmasa da :-(). Bunu hemen yapabileceğini sanmıyorum, ancak gelecekte benzer bir sorusu olan birine yardımcı olabilir.
Vérace

2
Dış sorgudaki eksik tablo diğer adı bir yana, bu da gerekenden daha karmaşık ve pahalıdır. Göstermek için bir kemanla başka bir cevap ekledim.
Erwin Brandstetter
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.