如何使用 Oracle JSON_OBJECT & JSON_ARRAYAGG 从多个列表中聚合不同的值

需要创建一个 Json_Object,其中可以包含多个嵌套的 Json_objects、Json_arrays & Json_arrayaggs。

我用一些虚拟数据创建了这个表来演示这个问题:

 create table test_tbl(
test_col1 varchar2(20),test_col2 varchar2(20),test_col3 varchar2(20),test_col4 varchar2(20),test_col5 varchar2(20),test_col6 varchar2(20)

);

insert into test_tbl values('val0','val1','val2','val7','val11','val12');
insert into test_tbl values('val0','val3','val4','val5','val6','val13','val14');
insert into test_tbl values('val0','val8','val12');
insert into test_tbl values('val1','val9','val10','val14');

使用以下查询创建 Json_object 时:

  SELECT JSON_OBJECT (
         'output' VALUE JSON_ARRAYAGG(
           JSON_OBJECT(
             'common' VALUE test_col1,'list'   VALUE JSON_ARRAYAGG(
               JSON_OBJECT(
                 'key1' VALUE test_col2,'key2' VALUE test_col3
               )
             ),'anotherlist' VALUE JSON_ARRAYAGG(
               JSON_OBJECT(
                 'key1' VALUE test_col5,'key2' VALUE test_col6
               )
             )
           )
         )
       )
FROM   (
  SELECT DISTINCT
         test_col1,test_col2,test_col3,test_col5,test_col6
  FROM   test_tbl
  WHERE  test_col4 = 'val7'
)
GROUP BY
       test_col1

这会导致以下json在聚合数组中具有重复的键值对-

{
  "output": [
    {
      "common": "val0","list": [
        {
          "key1": "val5","key2": "val6"
        },{
          "key1": "val3","key2": "val4"
        },{
          "key1": "val1","key2": "val2"
        },{
          "key1": "val5","key2": "val6"
        }
      ],"anotherlist": [
        {
          "key1": "val13","key2": "val14"
        },{
          "key1": "val11","key2": "val12"
        },"key2": "val12"
        }
      ]
    },{
      "common": "val1","list": [
        {
          "key1": "val9","key2": "val10"
        },{
          "key1": "val9","key2": "val10"
        }
      ],"anotherlist": [
        {
          "key1": "val11",{
          "key1": "val13","key2": "val14"
        }
      ]
    }
  ]
}

而我预期的 Json 是:

{
  "output": [
    {
      "common": "val0","key2": "val2"
        }
      ],"key2": "val14"
        }
      ]
    }
  ]
}

预先感谢您提供有关如何获得上述预期 Json 的任何建议。

shengsheng321 回答:如何使用 Oracle JSON_OBJECT & JSON_ARRAYAGG 从多个列表中聚合不同的值

对第一对列使用一个 DISTINCT 子查询,然后对另一对列使用第二个 DISTINCT 子查询,并在公共 {{1} 上使用 JOIN }}:

test_col1

输出:

SELECT JSON_OBJECT (
         'output' VALUE JSON_ARRAYAGG(
           JSON_OBJECT(
             'common'      VALUE c23.test_col1,'list'        VALUE c23.list,'anotherlist' VALUE c56.anotherlist
           )
         )
       )
FROM   (
         SELECT test_col1,JSON_ARRAYAGG(
                  JSON_OBJECT(
                    'key1' VALUE test_col2,'key2' VALUE test_col3
                  )
                ) AS list
         FROM   ( SELECT DISTINCT
                         test_col1,test_col2,test_col3
                  FROM   test_tbl
                  WHERE  test_col4 = 'val7'
         )
         GROUP BY test_col1
       ) c23
       INNER JOIN (
         SELECT test_col1,JSON_ARRAYAGG(
                  JSON_OBJECT(
                    'key1' VALUE test_col5,'key2' VALUE test_col6
                  )
                ) AS anotherlist
         FROM   ( SELECT DISTINCT
                         test_col1,test_col5,test_col6
                  FROM   test_tbl
                  WHERE  test_col4 = 'val7'
         )
         GROUP BY test_col1
       ) c56
       ON ( c23.test_col1 = c56.test_col1 )
本文链接:https://www.f2er.com/1916.html

大家都在问