我正在尝试在 Oracle 19c 中组合 JSON 文档数组。
我想将项目附加到存储在表中的现有 JSON 中的数组。我知道这个问题之前已经以各种形式提出过(演示了辅助函数和 SQL 实现),但我仍然遇到问题,试图通过将数组拆分为行(cross_join_later 方法)或将适当的辅助函数组合在一起来将其组合在一起甲骨文 19c。
我想将值部分组合起来,最终得到这样的结果:
更新_JSON |
---|
{“键”:[“VAL1”,“VAL2”,“VAL3”],“值”:[[“1”,“2”,“3”],[“a”,“b”,“c "],["1","b","3"],["2","d","f"],["3","b","g"]]} |
还有一个问题:是否也可以按第一项(本例中为 val1)对数组值进行排序?
设置信息:
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 |
---|
{“键”:[“VAL1”,“VAL2”,“VAL3”],“值”:[[“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 |
---|
{“键”:[“VAL1”,“VAL2”,“VAL3”],“值”:[[“2”,“d”,“f”],[“3”,“b”,“g” “]]} |
路径和其他问题的最新尝试:
select *
from tbl3 t
CROSS JOIN LATERAL(
SELECT JSON_ARRAYAGG(value) AS col3
FROM (
SELECT value
FROM JSON_TABLE( t.json, '$[*]' COLUMNS value VARCHAR2 PATH '$')
UNION ALL
SELECT JSON_OBJECT('values' : json_arrayagg(json_array(val1, val2, val3 null on null))) AS js
FROM tbl2
)
);
您需要 onlx 来 UNION 两个表 tbl1 和 tbl2 并将其用作 json 的基础
WITH CTE1 AS(
SELECT val1, val2, val3 FROM tbl1
UNION
SELECT val1, val2, val3 FROM tbl2)
select json_object(
'keys' : ['VAL1', 'VAL2', 'VAL3'],
'values' : json_arrayagg(json_array(val1, val2, val3 null on null))) as js, null
from CTE1
JS | 空 |
---|---|
{“键”:[“VAL1”,“VAL2”,“VAL3”],“值”:[[“1”,“2”,“3”],[“a”,“b”,“c "],["1","b","3"],["2","d","f"],["3","b","g"]]} | 空 |