Pruebe un enfoque diferente y limpio 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;
Si no le interesan las filas con valores vacíos o nulos en bank_accounts
, use un CROSS JOIN
más 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);
El elemento clave para su problema es WITH ORDINALITY
que produce números de fila sobre la marcha para funciones de devolución de conjuntos. Se introdujo con Postgres 9.4:funciona para usted, jsonb
también se introdujo con 9.4.
Esos son únicos por fila subyacente. Para ser único en toda la tabla, agregue el id
de la tabla subyacente.
Detalles para WITH ORDINALITY
:
Relacionado:
- Consulta de elementos de matriz dentro del tipo JSON
- Cómo convertir una matriz json(b) int simple en un entero[] en PostgreSQL 9.4+