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;