我正在尝试在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
1条答案
按热度按时间pbwdgjma1#
你可以使用json_transform
| 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