Vyzkoušejte jiný, čistý přístup pomocí 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;
Pokud vás nezajímají řádky s prázdnými nebo nulovými hodnotami v bank_accounts
, použijte jednodušší 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);
Klíčovým prvkem vašeho problému je WITH ORDINALITY
který za běhu vytváří čísla řádků pro funkce vracející sady. Byl představen s Postgres 9.4 – funguje pro vás, jsonb
byl také představen s 9.4.
Ty jsou jedinečné pro každý podkladový řádek. Chcete-li být jedinečný v celé tabulce, přidejte id
podkladové tabulky.
Podrobnosti pro WITH ORDINALITY
:
Související:
- Dotaz na prvky pole v rámci typu JSON
- Jak převést jednoduché pole json(b) int na celé číslo[] v PostgreSQL 9.4+