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:
- Consulte elementos de matriz dentro do tipo JSON
- Como transformar um array json(b) int simples em um inteiro[] no PostgreSQL 9.4+