PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come ottenere elementi con un numero univoco da un array json in PostgreSQL?

Prova un approccio diverso e pulito con 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;

Se non ti interessano le righe con valori vuoti o nulli in bank_accounts , usa un CROSS JOIN più semplice :

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);

L'elemento chiave per il tuo problema è WITH ORDINALITY che produce numeri di riga al volo per funzioni di restituzione di set. È stato introdotto con Postgres 9.4 - funziona per te, jsonb è stato introdotto anche con 9.4.

Quelli sono univoci per riga sottostante. Per essere univoco nell'intera tabella, aggiungi l'id della tabella sottostante.

Dettagli per WITH ORDINALITY :

Correlati: