Versuchen Sie einen anderen, sauberen Ansatz mit 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;
Wenn Ihnen Zeilen mit leeren oder Nullwerten in bank_accounts
egal sind , verwenden Sie einen einfacheren 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);
Das Schlüsselelement für Ihr Problem ist WITH ORDINALITY
die Zeilennummern on the fly für Set-Returning-Funktionen erzeugt. Es wurde mit Postgres 9.4 eingeführt - funktioniert für Sie, jsonb
wurde ebenfalls mit 9.4 eingeführt.
Diese sind pro zugrundeliegender Zeile eindeutig. Um in der gesamten Tabelle eindeutig zu sein, fügen Sie die id
hinzu der zugrunde liegenden Tabelle.
Details für WITH ORDINALITY
:
Verwandte:
- Suche nach Array-Elementen innerhalb des JSON-Typs
- Wie man ein einfaches json(b)-int-Array in eine ganze Zahl[] in PostgreSQL 9.4+ umwandelt