postgresql - 使用 Postgres 将 2 个表中的数据作为数组输出
问题描述
我在 Postgres 数据库中有 2 个表,如果可能的话,需要一些帮助才能将查询放在一起以特定格式输出数据。
表 1(账户)
RowID Name AccountNo
1 John 45356333
2 Helen 74562445
表 2(代码)
RowID AccountNo Code Status
1 45356333 csdcwew Active
2 45356333 gererge Active
2 74562445 thwfewf Active
我希望能够获取数据,以便最终获得如下所示的 JSON 对象:
{
"Accounts": [
{
"AccountNo": "45356333",
"Codes": [
{
"Code": "csdcwew",
"Status": "Active"
},
{
"Code": "gererge",
"Status": "Active"
}
]
},
{
"AccountNo": "74562445",
"Codes": [
{
"Code": "thwfewf",
"Status": "Active"
}
]
}
]
}
我尝试了一个查询,该查询使用 array_agg 函数输出所有帐户和代码数组,但这是我所能得到的。真的,我也需要状态和描述。
SELECT a."Name",
array_agg(c."Codes")
FROM ("Accounts" a
LEFT JOIN "Codes" c ON ((c."AccountNo" = a."AccountNo")))
GROUP BY a."Name";
解决方案
你很接近。您可以继续按照聚合代码的方式聚合状态值。然后你会有两列,你可以按顺序迭代。
另一种选择是 Postgres 有一个非常合理的 JSON 语法,它允许您直接聚合到 JSON。
SELECT json_agg(json_build_object(
'AccountNo', accountNo,
'Codes', val ))
FROM (
select accountNo,
json_agg (json_build_object(
'code', code,
'status', status)) as val
from codes
group by accountNo) as c;
推荐阅读
- java - 在 Spring Boot Services 中运行 H2 数据库多个实例
- python - Python 子字符串搜索的对抗性输入
- outlook - 共享邮箱上的 MailItem.GetConversation()
- asp.net - 如何将 IHttpHandler 注册为默认文档
- multithreading - 我如何处理 Spring boot 主线程等到新线程进行一些计算
- javascript - 在 Vue2 中的方法内使用 eval() 可以工作,但不能同时工作
- java - java.lang.UnsupportedOperationException:此功能仅在元素类型实现 RealmModel 时可用
- reactjs - React create-react-app 在构建时更改静态目录的名称
- python - 期望值:第 1 行,第 1 列(字符 0),带有 Python JSON
- python - 根据字符数拆分字符串列