Prøv en anden, ren tilgang med 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;
Hvis du er ligeglad med rækker med tomme eller null-værdier i bank_accounts
, brug en enklere CROSS JOIN
:
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);
Nøgleelementet for dit problem er WITH ORDINALITY
som producerer rækkenumre i farten til sæt-retur-funktioner. Det blev introduceret med Postgres 9.4 - virker for dig, jsonb
blev også introduceret med 9.4.
Disse er unikke pr. underliggende række. For at være unik på tværs af hele tabellen skal du tilføje id
af den underliggende tabel.
Detaljer for WITH ORDINALITY
:
Relateret:
- Forespørgsel efter matrixelementer inde i JSON-typen
- Sådan forvandler man en simpel json(b) int-array til et heltal[] i PostgreSQL 9.4+