Coba pendekatan yang berbeda dan bersih dengan 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;
Jika Anda tidak peduli dengan baris dengan nilai kosong atau nol di bank_accounts
, gunakan CROSS JOIN
yang lebih sederhana :
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);
Elemen kunci untuk masalah Anda adalah WITH ORDINALITY
yang menghasilkan nomor baris dengan cepat untuk fungsi set-return. Itu diperkenalkan dengan Postgres 9.4 - bekerja untuk Anda, jsonb
juga diperkenalkan dengan 9.4.
Itu unik per baris yang mendasarinya. Agar unik di seluruh tabel, tambahkan id
dari tabel yang mendasarinya.
Detail untuk WITH ORDINALITY
:
Terkait:
- Kueri untuk elemen array di dalam tipe JSON
- Cara mengubah json(b) int array menjadi integer[] di PostgreSQL 9.4+