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.