追加到Oracle中现有JSON中的JSON_ARRAY

qybjjes1  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(152)

我正在尝试在Oracle 19 c中组合JSON文档的合并数组。
我想将项目附加到存储在表中的现有JSON中的数组中。我知道这个问题以前已经以各种形式提出过(演示了helper函数和SQL实现),但我仍然有问题试图通过将数组拆分为行(cross_join_lateral方法)或为Oracle 19 c组合一个适当的helper函数来将其整合在一起。
我想将价值观部分合并以如下形式结束:
| XML_JSON|
| --|
| {“键”:[“VAL 1”,“VAL 2”,“VAL 3”],“值”:[[“1”,“2”,“3”],[“a”,“B”,“c”],[“1”,“B”,“3”],[“2”,“d”,“f”],[“3”,“B”,“g”]}|
还有一个问题是否也可以按第一项(本例中为val 1)对数组值进行排序?
设置信息:

CREATE TABLE tbl1 (val1 varchar2(10), val2 varchar2(10), val3 varchar2(10));
CREATE TABLE tbl2 (val1 varchar2(10), val2 varchar2(10), val3 varchar2(10));
CREATE TABLE tbl3 (json clob, json_updated clob);
INSERT INTO tbl1 VALUES ('1','2','3');
INSERT INTO tbl1 VALUES ('a','b','c');
INSERT INTO tbl1 VALUES ('1','b','3');
INSERT INTO tbl2 VALUES ('2','d','f');
INSERT INTO tbl2 VALUES ('3','b','g');
insert into tbl3
select json_object(
'keys' : ['VAL1', 'VAL2', 'VAL3'],
'values' : json_arrayagg(json_array(val1, val2, val3 null on null))) as js, null
from tbl1
select json from tbl3

| JSON|
| --|
| {“键”:[“VAL 1”,“VAL 2”,“VAL 3”],“值”:[[“1”,“2”,“3”],[“a”,“B”,“c”],[“1”,“B”,“3”]}|

select json_object(
'keys' : ['VAL1', 'VAL2', 'VAL3'],
'values' : json_arrayagg(json_array(val1, val2, val3 null on null))) as js
from tbl2

| JS|
| --|
| {“keys”:[“VAL1”,“VAL2”,“VAL3”],“values”:[[“2”,“d”,“f”],[“3”,“B”,“g”]]}|
这会正确输出新值,但会使用它更新文档。

SELECT new_value
  FROM   tbl3 t
         CROSS JOIN LATERAL(
         SELECT JSON_ARRAYAGG(json) AS new_value
         FROM   (
           SELECT json
           FROM   JSON_TABLE( t.json, '$.values[*]' COLUMNS (json CLOB FORMAT JSON PATH '$'))
           UNION ALL
           select json_array(val1, val2, val3 null on null returning clob)
           from tbl2
         )
       );

| JS|
| --|
| [[“1”,“2”,“3”],[“a”,“B”,“c”],[“1”,“B”,“3”],[“2”,“d”,“f”],[“3”,“B”,“g”]]|
fiddle

pbwdgjma

pbwdgjma1#

你可以使用json_transform

SELECT  json_transform(
    tbl3.JSON,
    APPEND '$.values' = JSON_QUERY(t2.JS,'$.values'))
  FROM tbl3 
  JOIN (select json_object(
'keys' : ['VAL1', 'VAL2', 'VAL3'],
'values' : json_arrayagg(json_array(val1, val2, val3 null on null))) as js
from tbl2)  t2 on JSON_QUERY(tbl3.JSON,'$.keys') = JSON_QUERY(t2.JS,'$.keys')

| JSON_TRANSFORM(TBL3.JSON,APPEND'$.VALUES'=JSON_QUERY(T2.JS,'$. VALUES'))|
| --|
| {“键”:[“VAL 1”,“VAL 2”,“VAL 3”],“值”:[[“1”,“2”,“3”],[“a”,“B”,“c”],[“1”,“B”,“3”],[[“2”,“d”,“f”],[“3”,“B”,“g”]]}|
fiddle

相关问题