Postgres nhiều cột để json


23

Tôi đang chạy postgresql 9.3.4. Tôi có một bảng có 3 trường:

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

Tôi cần di chuyển dữ liệu sang một bảng mới với các trường như:

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

row_to_jsonkhông phải là giải pháp cho tôi khi SELECT t.id, row_to_json(t) as data FROM (select id, name, addr from myt) tthêm idvào kết quả là tốt. Có cách nào để chọn các trường tôi cần (tên & addr) trong trường dữ liệu của tôi không?


Tôi không chắc câu trả lời có đúng không. Tôi đã hỏi nó 2 năm trước. Tôi cũng đã trả lời câu hỏi của mình sau đó nhưng không đánh dấu là đúng.
AliBZ

Câu trả lời:


51

Có một tùy chọn tốt hơn với json_build_object()trong Postgres 9.4+ :

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

Nhưng đó cũng là một cách đơn giản và nhanh hơn với row_to_json()Postgres 9.3 :

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

db <> fiddle ở đây
Fiddle SQL cũ trên Postgres 9.6.

Câu trả lời liên quan:


Đây là một câu trả lời tốt hơn, và fiddle có bằng chứng.
MIguelele

5

Tôi tìm thấy câu trả lời từ liên kết này :

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
)

Đừng quên đánh dấu câu trả lời của bạn là chính xác (dù không có điểm nào :-(). Tôi không nghĩ rằng bạn có thể làm điều này ngay lập tức, nhưng nó có thể giúp ai đó có câu hỏi tương tự trong tương lai.
Vérace

2
Ngoài bí danh bảng bị thiếu trong truy vấn bên ngoài, điều này cũng phức tạp và tốn kém hơn mức cần thiết. Tôi đã thêm một câu trả lời với một câu đố để chứng minh.
Erwin Brandstetter
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.