Wypróbuj inne, czyste podejście z 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;
Jeśli nie interesują Cię wiersze z pustymi lub pustymi wartościami w bank_accounts
, użyj prostszego CROSS JOIN
:
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);
Kluczowym elementem Twojego problemu jest WITH ORDINALITY
który generuje numery wierszy w locie dla funkcji zwracających zestaw. Został wprowadzony w Postgresie 9.4 - działa dla Ciebie, jsonb
został również wprowadzony w wersji 9.4.
Są one unikalne w każdym wierszu bazowym. Aby być unikalnym w całej tabeli, dodaj id
tabeli poniżej.
Szczegóły dla WITH ORDINALITY
:
Powiązane:
- Zapytanie o elementy tablicy wewnątrz typu JSON
- Jak zamienić prostą tablicę json(b) int na liczbę całkowitą[] w PostgreSQL 9.4+