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:
- Query per gli elementi dell'array all'interno del tipo JSON
- Come trasformare un semplice array json(b) int in un intero[] in PostgreSQL 9.4+