Опитайте различен, чист подход с 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;
Ако не ви е грижа за редове с празни или нулеви стойности в bank_accounts
, използвайте по-опростен 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);
Ключовият елемент за вашия проблем е WITH ORDINALITY
който произвежда номера на редове в движение за функции, връщащи множество. Беше представен с Postgres 9.4 - работи за вас, jsonb
също беше въведен с 9.4.
Те са уникални за всеки основен ред. За да бъдете уникални в цялата таблица, добавете id
на основната таблица.
Подробности за WITH ORDINALITY
:
Свързани:
- Заявка за елементи на масив в тип JSON
- Как да превърна прост json(b) int масив в цяло число[] в PostgreSQL 9.4+