如何从 PostgreSQL 中的 json 数组中获取具有唯一编号的元素?

How to get elements with a unique number from a json array in PostgreSQL?

我有一个 table bank_accounts:

    Column     |         Type          |                                Modifiers                                | Storage  | Stats target | Description 
---------------+-----------------------+-------------------------------------------------------------------------+----------+--------------+-------------
 id            | integer               | not null default nextval('bank_accounts_id_seq'::regclass)              | plain    |              | 
 name          | character varying(50) |                                                                         | extended |              | 
 bank_accounts | jsonb                 | not null                                                                | extended |              | 

它在 jsonb 列中有一些 JSON:

 id | name  |                              bank_accounts                               
----+-------+--------------------------------------------------------------------------
  1 | test1 | [{"name": "acct1", "balance": -500}, {"name": "acct2", "balance": -300}]

我正在使用 jsonb_array_elements 获取一个用户的帐户列表:

select jsonb_array_elements(bank_accounts)->>'name' as name, jsonb_array_elements(bank_accounts)->>'balance' as balance from bank_accounts;
 name  | balance 
-------+---------
 acct1 | -500
 acct2 | -300

太好了。但是如何让每一行都有一个唯一的 id 呢?我想将每一行映射到一个休眠对象,但是我很难做到这一点,因为我找不到让每一行都有唯一 ID 的方法。

使用 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 ...
FROM   bank_accounts b
     , jsonb_array_elements(b.bank_accounts) WITH ORDINALITY AS t (account, rn);

关键要素是 WITH ORDINALITY 即时为设置返回函数生成行号。它是在 Postgres 9.4 中引入的——就像 jsonb.

rnbank_accounts.
中每个基础行都是唯一的 要在整个结果集中唯一,请将其与 b.id.

组合

关于WITH ORDINALITY

  • PostgreSQL unnest() with element number

相关:

  • Query for array elements inside JSON type