在PostgreSQL中从JSON中获取所有信息

lkaoscv7  于 2023-11-18  发布在  PostgreSQL
关注(0)|答案(2)|浏览(123)

我有一个JSON,看起来像这样:
第一个月
我想从所有字段中获取所有数据,所以它最终看起来像这样:
| 用户标识|电子邮件|更新于|核实净收入|
| --|--|--|--|
| 1 |AAA| AAA| AAA|
| 1 |BBB| BBB| BBB|
| 1 |CCC| CCC| CCC|
有多个user_id,所以json字段中的条目数量可能会有所不同。
我尝试对每个user_id执行一个opr一个,但是由于条目的数量可能会有所不同,我不知道应该尝试多少条目。
编辑:每个user_id都有一个JSON,到目前为止,我的查询是这样的:

SELECT user_id, json_field
FROM users

字符串

wkyowqbh

wkyowqbh1#

可以使用jsonb_array_elements函数从列表中提取所有条目。

select j->>'email' email, j->>'updated_at' updated_at, j->>'net_income_verified' net_income_verified
from jsonb_array_elements(
'[
  {"email": "AAA", "updated_at": "AAA", "net_income_verified": 111}, 
  {"email": "BBB", "updated_at": "BBB", "net_income_verified": 222}, 
  {"email": "CCC", "updated_at": "CCC", "net_income_verified": 333}
]'::jsonb) j;

字符串
| 电子邮件|更新于|核实净收入|
| --|--|--|
| AAA| AAA| 111 |
| BBB| BBB| 222 |
| CCC| CCC| 333 |
但是我不知道user_id属性是从哪里来的。

编辑

考虑到每条记录都有一个JSON字段和user_id,那么查询看起来有点不同。我称之为“老派方法”,首先扁平化(这里使用横向连接),然后查询。t CTE是对实际表的模仿。

with t (user_id, json_field) as 
(
 values  
 (1, '[{"email": "AAA", "updated_at": "AAA", "net_income_verified": 111},{"email": "BBB", "updated_at": "BBB", "net_income_verified": 222},{"email": "CCC", "updated_at": "CCC", "net_income_verified": 333}]'::jsonb)
)
select user_id, j->>'email' email,
       j->>'updated_at' updated_at, j->>'net_income_verified' net_income_verified
from t cross join lateral jsonb_array_elements(json_field) j;


| 用户标识|电子邮件|更新于|核实净收入|
| --|--|--|--|
| 1 |AAA| AAA| 111 |
| 1 |BBB| BBB| 222 |
| 1 |CCC| CCC| 333 |

1l5u6lss

1l5u6lss2#

有一个json_populate_recordset()函数用于此目的:demo

create table r1(email text, updated_at text, net_income_verified text);

select user_id, j.* from users, json_populate_recordset(null::r1,json_field) j;

字符串
| 用户标识|电子邮件|更新于|核实净收入|
| --|--|--|--|
| 1 |AAA| AAA| AAA|
| 1 |BBB| BBB| BBB|
| 1 |CCC| CCC| CCC|
首先设置一个表/type,显示您希望jsonMap到的结构,然后给予该函数一个该表/类型的示例记录沿着目标json值,它将为您处理所有这些。

相关问题