【问题标题】:Convert rows of one table to json and add it to another table PostgreSQL将一个表的行转换为json并添加到另一个表PostgreSQL
【发布时间】:2018-05-12 21:40:17
【问题描述】:

我有两个表progress_report 和progress_report_activity。

CREATE TABLE PROGRESS_REPORT
(
  REPORT_ID VARCHAR NOT NULL,
  PCP_PATIENT_ID VARCHAR NOT NULL,
  VC_PRODUCT_ID VARCHAR ,
  REPORT_DURATION_DAYS INTEGER NOT NULL,
  REPORT_GENERATION_DATE BIGINT,
  IS_REPORT_READ BOOLEAN ,
  ACTIVITY_DETAILS JSONB,
  SYMPTOMS_DETAILS JSONB,
  PRIMARY KEY (REPORT_ID)
);

CREATE TABLE PROGRESS_REPORT_ACTIVITY
(
REPORT_ACTIVITY_ID VARCHAR NOT NULL,
REPORT_ID VARCHAR NOT NULL,
ACTIVITY_CONFIG_ID VARCHAR NOT NULL,
ACTIVITY_ASSISTANCE VARCHAR NOT NULL,
PRIMARY KEY (REPORT_ACTIVITY_ID)
)

我需要将 ACTIVITY_CONFIG_ID 和 ACTIVITY_ASSISTANCE 从 PROGRESS_REPORT_ACTIVITY 转换为 json 并将这个 json 添加到 PROGRESS_REPORT 的 ACTIVITY_DETAILS 列中。

我尝试使用此查询形成 json:

SELECT ROW_TO_JSON(t) FROM (SELECT activity_config_id, activity_assistance FROM progress_report_activity pra inner join progress_report pr on pr.report_id=pra.report_id) t

但问题 PROGRESS_REPORT_ACTIVITY 会为同一个 report_id 返回多行,这在两个表中都很常见。

样本数据:

insert into progress_report_activity values ('1','1','11','qwerty')
insert into progress_report_activity values ('3','1','13','qwertyDup')
insert into progress_report_activity values ('2','2','12','qwerty2')
insert into progress_report_activity values ('10','2','11','qwerty12223')

insert into progress_report values ('1','123','taltz',123,123456,true,null,null);
insert into progress_report values ('10','123','olumiant',123,123456,true, null,null)

预期输出:以下是两种不同的输出格式,您能否建议对这两种格式的查询。

1]示例 progress_report 行应如下所示:

  1,123,taltz,123,123456,true, {"activity_config_id" : ["11","13"], "activity_assistance" : ["qwerty","qwertyDup"]}

2]progress_report 行示例:

1,123,taltz,123,123456,true, {"activity" : [{"activity_config_id":"11",
    "activity_assistance" : "qwerty"},
    {"activity_config_id":"13",
    "activity_assistance" : "qwertyDup" }]

【问题讨论】:

  • 已使用示例数据更新了问题
  • 为 progress_report 添加了一个示例预期行
  • 我已经给出了 report_id=1, '1','1','11','qwerty' , '3','1','13','qwertyDup' 这些的输出修改了两行以适合 '1','123','taltz',123,123456,true,,null
  • 是的,有你的问题,是的,它应该有,为简单起见,我已将其 report_id 修改为 2

标签: sql json postgresql postgresql-9.6


【解决方案1】:

9.2is very limited with json support。解决方案看起来不太好:

t=# with p as (SELECT pr.report_id,array_agg(activity_config_id) activity_config_id, array_agg(activity_assistance) activity_assistance FROM progress_report_activity pra inner join progress_report pr on pr.report_id=pra.report_id group by pr.report_id)
select row_to_json(j), report_id from p, (select activity_config_id,activity_assistance from p) j;
                                   row_to_json                                   | report_id
---------------------------------------------------------------------------------+-----------
 {"activity_config_id":["11","13"],"activity_assistance":["qwerty","qwertyDup"]} | 1
(1 row)

现在,当您根据 report_id 准备好 json 时,更新它:

t=# with p as (SELECT pr.report_id,array_agg(activity_config_id) activity_config_id, array_agg(activity_assistance) activity_assistance FROM progress_report_activity pra inner join progress_report pr on pr.report_id=pra.report_id group by pr.report_id)
, d as (select row_to_json(j), report_id from p, (select activity_config_id,activity_assistance from p) j)
update progress_report set ACTIVITY_DETAILS = row_to_json
from d where progress_report.report_id = d.report_id
;
UPDATE 1

更新以实现第二个预期结果,我不限于 9.2(因为显然 OP 有 9.6):

 with c as (select report_id,json_agg(json_build_object('activity_config_id',activity_config_id,'activity_assistance',activity_assistance)) AS j from progress_report_activity group by report_id)
update progress_report pr set ACTIVITY_DETAILS = concat('{"activity" :',j,'}')::json
from c where c.report_id = pr.report_id;

http://sqlfiddle.com/#!17/13555/2

【讨论】:

  • 这可行,但预期的响应略有不同
  • 是的,我昨天自己编辑了它。我面临的问题是array_agg应该在row_to_json之上,但我不想在row_to_json中加入report_id,这会在我尝试更新时导致问题
  • 我已经在这篇文章中添加了这两个问题,因为用相同的数据提出一个新问题会引发标记
  • 更新的答案有一些错误,我想你漏掉了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
相关资源
最近更新 更多