PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để trả về mảng jsonb và mảng đối tượng từ dữ liệu của tôi?

Bạn coi kết quả của phép nối đầu tiên là JSON, không phải là chuỗi văn bản, vì vậy hãy sử dụng jsonb_each() thay vì jsonb_each_text() :

SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM   mytable t
JOIN   LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
JOIN   LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
WHERE  t.employee = 'Jim'  -- works because employee is unique
GROUP  BY 1;

GROUP BY 1 là viết tắt của GROUP BY t.employee .
Kết quả:

employee | sales
---------+--------
Jim      | '{ "sales_tv" : 40, "sales_radio" : 76 }'

Tôi cũng gỡ rối và đơn giản hóa truy vấn của bạn.

json_object_agg() là công cụ để tổng hợp các cặp tên / giá trị dưới dạng đối tượng JSON. Tùy chọn truyền tới jsonb nếu bạn cần - hoặc sử dụng jsonb_object_agg() trong Postgres 9.5 trở lên.

Sử dụng JOIN rõ ràng cú pháp để đính kèm các điều kiện ở vị trí rõ ràng nhất.
Giống nhau không có JOIN rõ ràng cú pháp:

SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM   mytable t
     , jsonb_each(t.data)      a(k,v) 
     , jsonb_to_recordset(a.v) d(yr text, value float)
WHERE  t.employee = 'Jim'
AND    a.k LIKE 'sales_%'
AND    d.yr = '2012'
GROUP  BY 1;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách lấy văn bản SQL từ trình kích hoạt sự kiện Postgres

  2. Cài đặt pg gem; LỖI:Không thể tạo tiện ích mở rộng gốc đá quý

  3. Sự khác biệt giữa chỉ số GiST và GIN

  4. Không tìm thấy trình điều khiển phù hợp cho jdbc:postgresql://192.168.1.8:5432 / NexentaSearch

  5. Hiệu suất ứng dụng dựa trên PostgreSQL:độ trễ và độ trễ ẩn