postgres หลายคอลัมน์เพื่อ json


23

ฉันกำลังเรียกใช้ postgresql 9.3.4 ฉันมีตารางที่มี 3 ฟิลด์:

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

ฉันต้องการย้ายข้อมูลไปยังตารางใหม่ที่มีฟิลด์เช่น:

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

row_to_jsonไม่ใช่วิธีแก้ปัญหาสำหรับฉันเหมือนSELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tเป็นการเพิ่มidผลลัพธ์เช่นกัน มีวิธีเลือกเขตข้อมูลที่ฉันต้องการ (ชื่อ & addr) ในเขตข้อมูลของฉันหรือไม่


ฉันไม่แน่ใจว่าคำตอบนั้นถูกต้องหรือไม่ ฉันถามมันเมื่อ 2 ปีก่อน ฉันยังตอบคำถามของฉันด้วย แต่ไม่ได้ทำเครื่องหมายว่าถูกต้อง
AliBZ

คำตอบ:


52

มีตัวเลือกที่ดีกว่าjson_build_object()ใน Postgres 9.4+ :

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

แต่ยังมีวิธีที่ง่ายกว่าและเร็วกว่าด้วยrow_to_json()ใน Postgres 9.3 :

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

db <> fiddle ที่นี่
Old SQL Fiddleบน Postgres 9.6

คำตอบที่เกี่ยวข้อง:


นี่เป็นคำตอบที่ดีกว่าและซอก็มีหลักฐาน
MIguelele

5

ฉันพบคำตอบจากลิงค์นี้ :

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
)

อย่าลืมทำเครื่องหมายคำตอบของคุณเองอย่างถูกต้อง (ไม่มีประเด็น :-() ฉันไม่คิดว่าคุณจะทำได้ทันที แต่มันอาจช่วยคนที่มีคำถามคล้ายกันในอนาคต
Vérace

2
นอกเหนือจากนามแฝงของตารางที่ขาดหายไปในคิวรีด้านนอกแล้วยังมีความซับซ้อนและราคาแพงกว่าที่จำเป็น ฉันเพิ่มคำตอบอีกหนึ่งคำเพื่อแสดงให้เห็น
Erwin Brandstetter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.