Probeer een andere, schone aanpak met 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;
Als u niet geeft om rijen met lege of null-waarden in bank_accounts
, gebruik een eenvoudigere 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);
Het belangrijkste element voor uw probleem is WITH ORDINALITY
die on-the-fly rijnummers produceert voor set-retourfuncties. Het werd geïntroduceerd met Postgres 9.4 - werkt voor jou, jsonb
werd ook geïntroduceerd met 9.4.
Die zijn uniek per onderliggende rij. Voeg de id
. toe om uniek te zijn in de hele tabel van de onderliggende tabel.
Details voor WITH ORDINALITY
:
Gerelateerd:
- Query voor array-elementen binnen JSON-type
- Een eenvoudige json(b) int-array omzetten in een geheel getal[] in PostgreSQL 9.4+