PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment obtenir des éléments avec un numéro unique à partir d'un tableau json dans PostgreSQL ?

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 :