PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie bekomme ich Elemente mit einer eindeutigen Nummer aus einem JSON-Array in PostgreSQL?

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: