Essayez une approche différente et propre avec 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;
Si vous ne vous souciez pas des lignes avec des valeurs vides ou nulles dans bank_accounts
, utilisez un CROSS JOIN
plus simple :
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'élément clé de votre problème est WITH ORDINALITY
qui produit des numéros de ligne à la volée pour les fonctions renvoyant des ensembles. Il a été introduit avec Postgres 9.4 - fonctionne pour vous, jsonb
a également été introduit avec 9.4.
Ceux-ci sont uniques par ligne sous-jacente. Pour être unique sur l'ensemble du tableau, ajoutez le id
de la table sous-jacente.
Détails pour WITH ORDINALITY
:
Connexe :
- Requête pour les éléments de tableau dans le type JSON
- Comment transformer un simple tableau int json(b) en entier[] dans PostgreSQL 9.4+