带有 Postgress 的数组中的 JSON 构建对象

梅蒂尔

我正在为客户项目构建拖放功能,并且需要我的数据如下所示:

[ [Array(10)], [Array(5)], [Array(5)], [Array(5)], [Array(5)] ]

每个数组看起来像这样(每个数组都代表患者):

[ {id: 1, reccomendations: [array] } ]

更深一层的推荐数组将如下所示:

["providerName1", "providerName2", "providerName3"]

我的数据库是这样设置的:

病人表

+----+-----------+
| id | bucket_id |
+----+-----------+
|  1 |     1     |
|  2 |     2     |
|  3 |     3     |
|  4 |     4     |
|  5 |     5     |
|  6 |     6     |
|  7 |     2     |
|  8 |     3     |
|  9 |     4     |
| 10 |     5     |
+----+-----------+

患者_provider 表
provider_id 引用 provider.id
患者_id 引用 patiend.id

+----+-------------+-------------+
| id | provider_id | patient_id  |
+----+-------------+-------------+
|  1 |       1     |      1      |
|  2 |       7     |      1      |
|  3 |       3     |      1      |
|  4 |       1     |      2      |
|  5 |       8     |      3      |
|  6 |       7     |      3      |
|  7 |       3     |      4      |
|  8 |       2     |      5      |
|  9 |      11     |      5      |
| 10 |       1     |      6      |
+----+-------------+-------------+

提供者表
provider_id 引用 provider.idpatient_id
引用 patiend.id

+----+-------------+-------------+
| id | provider_id | patient_id  |
+----+-------------+-------------+
|  1 |       1     |      1      |
|  2 |       7     |      1      |
|  3 |       3     |      1      |
|  4 |       1     |      2      |
|  5 |       8     |      3      |
|  6 |       7     |      3      |
|  7 |       3     |      4      |
|  8 |       2     |      5      |
|  9 |      11     |      5      |
| 10 |       1     |      6      |
+----+-------------+-------------+

提供者表
有比这更多的行和列,但这是我唯一需要的列

+----+-----------+
| id |  program  |
+----+-----------+
|  1 |   blue    |
|  2 |    red    |
|  3 |   green   |
|  4 |   yellow  |
|  5 |    pink   |
|  6 |   teal    |
+----+-----------+

我已经运行了这个:

SELECT "patient".id, ARRAY_AGG(DISTINCT("provider".program)) as providers FROM "patient"
  LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
  LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
  GROUP BY "patient".id
  ORDER BY "patient".id ASC;

这将使我获得每位患者的提供者数组。

我也运行了这个:

SELECT JSON_AGG("patient") as patient FROM "patient"
WHERE "patient".bucket_id =1; 

有了这个,我可以获得所有的桶/列和属于这些列的患者。

我一直无法找到将两者组合成我需要的数据结构的方法。我已经阅读了一些关于 JSON Build Objects 的文章——这是要走的路吗?我该怎么做?我也愿意在服务器端执行此工作流程,使用函数拼接并手动获取我需要的数据结构……如果这是更好的方法的话。如果你认为这是要走的路,我会怎么做?

我会买咖啡给能帮我解决这个问题的人!我很想通过为他们构建这个功能来让我的客户开心!

飞思奥特

我用以下语句重新创建了您的案例

create table patient (id serial, bucket_id int);
insert into patient (bucket_id) values (1);
insert into patient (bucket_id) values (2);
insert into patient (bucket_id) values (3);
insert into patient (bucket_id) values (4);
insert into patient (bucket_id) values (5);
insert into patient (bucket_id) values (6);
insert into patient (bucket_id) values (2);
insert into patient (bucket_id) values (3);
insert into patient (bucket_id) values (4);
insert into patient (bucket_id) values (5);

create table patient_provider (id serial, provider_id int, patient_id int);
insert into patient_provider (provider_id, patient_id) values (1,1);
insert into patient_provider (provider_id, patient_id) values (7,1);
insert into patient_provider (provider_id, patient_id) values (3,1);
insert into patient_provider (provider_id, patient_id) values (1,2);
insert into patient_provider (provider_id, patient_id) values (8,3);
insert into patient_provider (provider_id, patient_id) values (7,3);
insert into patient_provider (provider_id, patient_id) values (3,4);
insert into patient_provider (provider_id, patient_id) values (2,5);
insert into patient_provider (provider_id, patient_id) values (11,5);
insert into patient_provider (provider_id, patient_id) values (1,6);

create table provider (id serial, program varchar);
insert into provider (program) values ('blue');
insert into provider (program) values ('red');
insert into provider (program) values ('green');
insert into provider (program) values ('yellow');
insert into provider (program) values ('pink');
insert into provider (program) values ('teal');

现在,进行您的第一个查询,并使用该json_build_object函数,您可以实现{id: 1, reccomendations: [array] }(实际上并不需要外部数组)。查询如下

SELECT json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program))) as obj FROM "patient"
LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
GROUP BY "patient".id
ORDER BY "patient".id ASC

结果是

                          obj
-------------------------------------------------------
 {"id" : 1, "reccomendations" : ["blue","green",null]}
 {"id" : 2, "reccomendations" : ["blue"]}
 {"id" : 3, "reccomendations" : [null]}
 {"id" : 4, "reccomendations" : ["green"]}
 {"id" : 5, "reccomendations" : ["red",null]}
 {"id" : 6, "reccomendations" : ["blue"]}
 {"id" : 7, "reccomendations" : [null]}
 {"id" : 8, "reccomendations" : [null]}
 {"id" : 9, "reccomendations" : [null]}
 {"id" : 10, "reccomendations" : [null]}
(10 rows)

现在,如果您想聚合上述结果,您可以使用该json_agg函数来进行。这是整体代码

With single_objects as (
    SELECT json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program))) as obj FROM "patient"
      LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
      LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
      GROUP BY "patient".id
      ORDER BY "patient".id ASC
      )
select json_agg(obj) from single_objects

和结果

                                                                                                                                                                                                                   json_agg
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [{"id" : 1, "reccomendations" : ["blue","green",null]}, {"id" : 2, "reccomendations" : ["blue"]}, {"id" : 3, "reccomendations" : [null]}, {"id" : 4, "reccomendations" : ["green"]}, {"id" : 5, "reccomendations" : ["red",null]}, {"id" : 6, "reccomendations" : ["blue"]}, {"id" : 7, "reccomendations" : [null]}, {"id" : 8, "reccomendations" : [null]}, {"id" : 9, "reccomendations" : [null]}, {"id" : 10, "reccomendations" : [null]}]
(1 row)

如果你真的需要为每个id做额外的数组封装,你只需要在上面提到json_build_arrayjson_build_object调用中添加一个函数即可完整查询

With single_objects as (
    SELECT json_build_array(json_build_object('id',"patient".id, 'reccomendations', ARRAY_AGG(DISTINCT("provider".program)))) as obj FROM "patient"
      LEFT JOIN "patient_provider" ON "patient_provider".patient_id = "patient".id
      LEFT JOIN "provider" ON "provider".id = "patient_provider".provider_id
      GROUP BY "patient".id
      ORDER BY "patient".id ASC
      )
select json_agg(obj) from single_objects

最终结果

                                                                                                                                                                                                                             json_agg
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [[{"id" : 1, "reccomendations" : ["blue","green",null]}], [{"id" : 2, "reccomendations" : ["blue"]}], [{"id" : 3, "reccomendations" : [null]}], [{"id" : 4, "reccomendations" : ["green"]}], [{"id" : 5, "reccomendations" : ["red",null]}], [{"id" : 6, "reccomendations" : ["blue"]}], [{"id" : 7, "reccomendations" : [null]}], [{"id" : 8, "reccomendations" : [null]}], [{"id" : 9, "reccomendations" : [null]}], [{"id" : 10, "reccomendations" : [null]}]]
(1 row)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有json的java中的对象返回数组

PHP返回带有JSON数组中特殊字符的对象

在php中创建JSON对象(带有数组)

带有数组头的 JSON 对象

带有 Aws postgress 的 SpringBoot

如何从jSon对象构建数组

从对象数组构建Json

使用Volley解析内部带有JSON数组的JSON对象

如何返回带有json数组的json对象?

在Twig中构建有效的json对象

用PHP创建带有数组数组的json对象

如何将带有数组的json数组解析为带有Set的java对象

Aurora Postgress 与 Aurora Mysql 中的字符串 JSON 文档

如何在重复控件中访问带有 json 对象的数组列表

无法从 JSON 字符串中获取 Java 对象(带有内部数组)

如何从请求中获取json数组,并在带有GAE的python中将其用于对象?

jq:如何在带有数组的嵌套json树中添加对象,键/值

带有AngularJs中嵌套对象的json数组的ng-repeat

在Retrofit2中使用带有对象数组的json

如何将带有嵌套数组的JSON对象映射到TypeScript模型中?

如何从带有Angular的json对象的数组中获取特定集合

将带有嵌套对象的JSON转换为JS中的列表数组

带有JSON数据并访问数组和对象的车把模板

带有数组的 JSON 对象的 React/JSX 箭头函数。

使用jQuery grep过滤带有值数组的json对象

如何从AngularJS中的对象数组构建带有rowspan的表

在 PHP 中构建 json 对象数组时出错

在postgress中访问jsonb对象会引发错误

如何从服务到android中的sqlite数据库解析带有JSON对象和JSON数组的JSON数据?