Postgresql 使用postgres进行Json数组操作

Postgresql 使用postgres进行Json数组操作,postgresql,Postgresql,我对postgres非常陌生,我正在尝试处理两个表中的数据,并将结果插入一个新表中 第一个表如下所示: create table table1 ( column1 json, column2 json ) Data in the first table is column1: {"source" : ["s1", "s2"], "channels":["c1", "c2"]} column2: {"c1" : ["k1", "k2"], "c2":["k3", "k4"]} 第二张桌

我对postgres非常陌生,我正在尝试处理两个表中的数据,并将结果插入一个新表中

第一个表如下所示:

create table table1
(
  column1 json,
  column2 json
)

Data in the first table is
column1:
{"source" : ["s1", "s2"], "channels":["c1", "c2"]}
column2:
{"c1" : ["k1", "k2"], "c2":["k3", "k4"]}
第二张桌子看起来很像

create table table2
(
  column1 json,
  column2 json
)

Data in the second table is
column1:
{"source" : ["s2", "s3"], "channels":["c2", "c3"]}
column2:
{"c2" : ["k1", "k2", "k5"], "c3":["k6", "k7", k8]}
我想将表1和表2的数据合并成一个json,并使用唯一的数组值将其放入第三个表中

第三个表的结构与表1和表2相同,数据如下

Data in the third table should be :
column1:
{"source" : ["s1", "s2", "s3"], "channels":["c1", "c2", "c3"]}
column2:
{"c1":["k1", k2"], "c2":["k1", "k2", "k3", "k4", "k5"], "c3":["k6", "k7", "k8"]}
我尝试了许多不同类型的查询结构,但不知何故,我无法完成上述任务。其中之一是,

SELECT array_cat(ARRAY(SELECT json_extract_path_text(a.column1, 'source')), ARRAY(SELECT json_extract_path_text(b.column1, 'source'))) AS txt_arr FROM   table1 a, table2 b;
请不要介意上面的问题,它甚至都不正确

由于我是博士后的新手,我真的非常感谢任何形式的帮助

如果您必须

select (
  select json_object_agg(key, vals)
  from (
    select key, json_agg(value) vals
    from (
      select j.key, v.value
      from table1
      left join lateral json_each(column1) j on (true)
      left join lateral json_array_elements_text(j.value) v on (true)
      union
      select j.key, v.value
      from table2
      left join lateral json_each(column1) j on (true)
      left join lateral json_array_elements_text(j.value) v on (true)
      ) t1
    group by key
    ) t1
  ) column1,
  (
  select json_object_agg(key, vals)
  from (
    select key, json_agg(value) vals
    from (
      select j.key, v.value
      from table1
      left join lateral json_each(column2) j on (true)
      left join lateral json_array_elements_text(j.value) v on (true)
      union
      select j.key, v.value
      from table2
      left join lateral json_each(column2) j on (true)
      left join lateral json_array_elements_text(j.value) v on (true)
      ) t1
    group by key
    ) t1
  ) column2

由于数据的异构性,我认为它无法简化。

您到底想做什么?请记住,这是一个RDBMS,而不是一个NoSQL数据库,尽管它确实对JSONINSERT有很好的支持,但表的插入不是很频繁。逻辑写在函数中,该函数在插入到表1和表2中时由触发器调用。此外,数据相对较少,因为插入的频率不是很高。不,我不是问你的插入。我在问你为什么要这样构建你的数据。我对这个问题做了一些修改,请看一下。实际上,通道的数量和通道内的键的数量可以增加到一个非常大的数字。如果我去规范化它们并将它们存储在一个表中,那么对于用户来说,它们将是大量重复的源和通道。尽管如此,计算速度还是很快的,但是我输入表中的数据不是很频繁,所以计算不是优先考虑的。哦,非常感谢你提供了非常棒的代码。然而,在使用json数据类型进行联合时,我遇到了一个错误。所以我对代码做了一个小改动。在聚合时,我将json更改为文本,然后再次更改为json。选择json_object_aggkey,选择键中的VAL,选择j.key中的json_aggvalue::json作为VAL,选择表1中的v.value::text。。。。。。。。诸如此类on@Sam我已经修复了我用jsonb测试过的代码,然后在没有测试的情况下用json替换了所有jsonb:-P,现在试试