Prova ett annat, rent tillvägagångssätt 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;
Om du inte bryr dig om rader med tomma eller nullvärden i bank_accounts
, använd en enklare 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);
Nyckelelementet för ditt problem är WITH ORDINALITY
som producerar radnummer i farten för set-returfunktioner. Det introducerades med Postgres 9.4 - fungerar för dig, jsonb
introducerades också med 9.4.
Dessa är unika per underliggande rad. För att vara unik över hela tabellen, lägg till id
i den underliggande tabellen.
Detaljer för WITH ORDINALITY
:
Relaterat:
- Fråga efter arrayelement i JSON-typ
- Hur man förvandlar en enkel json(b) int-array till ett heltal[] i PostgreSQL 9.4+