如何从 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
.
rn
在 bank_accounts
.
中每个基础行都是唯一的
要在整个结果集中唯一,请将其与 b.id
.
组合
关于WITH ORDINALITY
:
- PostgreSQL unnest() with element number
相关:
- Query for array elements inside JSON type
我有一个 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
.
rn
在 bank_accounts
.
中每个基础行都是唯一的
要在整个结果集中唯一,请将其与 b.id
.
关于WITH ORDINALITY
:
- PostgreSQL unnest() with element number
相关:
- Query for array elements inside JSON type