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
の値が空またはnullの行を気にしない場合 、より単純な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
です。 これは、セットを返す関数のためにその場で行番号を生成します。これはPostgres9.4で導入されました-あなたのために働きます、jsonb
9.4でも導入されました。
これらは、基になる行ごとに一意です。テーブル全体で一意にするには、id
を追加します 基になるテーブルの。
WITH ORDINALITY
の詳細 :
関連: