PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como obter elementos com um número exclusivo de um array json no PostgreSQL?


Tente uma abordagem diferente e limpa com 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 você não se importa com linhas com valores vazios ou nulos em bank_accounts , use um CROSS JOIN mais simples :
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);

O elemento chave para o seu problema é WITH ORDINALITY que produz números de linha em tempo real para funções de retorno de conjunto. Foi introduzido com o Postgres 9.4 - funciona para você, jsonb também foi introduzido com 9.4.

Esses são exclusivos por linha subjacente. Para ser único em toda a tabela, adicione o id da tabela subjacente.

Detalhes para WITH ORDINALITY :

Relacionado: