Hãy thử một cách tiếp cận khác, rõ ràng với JOIN LATERAL
:
select b.id, t.rn
, t.account->>'name' AS name
, t.account->>'balance' AS balance
FROM bank_accounts b
LEFT JOIN LATERAL jsonb_array_elements(b.bank_accounts)
WITH ORDINALITY AS t (account, rn) ON true;
Nếu bạn không quan tâm đến các hàng có giá trị trống hoặc rỗng trong bank_accounts
, sử dụng CROSS JOIN
đơn giản hơn :
select b.id, t.rn
, t.account->>'name' AS name
, t.account->>'balance' AS balance
FROM bank_accounts b
, jsonb_array_elements(b.bank_accounts) WITH ORDINALITY AS t (account, rn);
Yếu tố quan trọng cho vấn đề của bạn là WITH ORDINALITY
tạo ra số hàng một cách nhanh chóng cho các chức năng trả về thiết lập. Nó được giới thiệu với Postgres 9.4 - phù hợp với bạn, jsonb
cũng được giới thiệu với 9.4.
Đó là duy nhất cho mỗi hàng cơ bản. Để trở thành duy nhất trên toàn bộ bảng, hãy thêm id
của bảng bên dưới.
Chi tiết cho WITH ORDINALITY
:
Có liên quan:
- Truy vấn cho các phần tử mảng bên trong loại JSON
- Cách biến một mảng int json (b) đơn giản thành một số nguyên [] trong PostgreSQL 9.4+