关于sql:在Oracle Query中对json数组进行分组

Grouping json array In Oracle Query

我有Oracle表:

1
2
3
4
CREATE TABLE jsonarray_test
(id VARCHAR2(50) PRIMARY KEY,
json_array_str VARCHAR2(256),
group_name VARCHAR2(50));

数据

1
2
3
4
5
INSERT ALL
INTO jsonarray_test (id, group_name, json_array_str) VALUES ('af1470c6-4883-454a-9cec-10cdd99c4446', 'sales', '["foo","bar"]')
INTO jsonarray_test (id, group_name, json_array_str) VALUES ('f310a5e0-b881-42d0-a4af-b6d1e9064676', 'sales', '["foo1","bar"]')
INTO jsonarray_test (id, group_name, json_array_str) VALUES ('688effbb-b665-4c58-b42a-be073823ec27', 'engineering', '["foo","bar1"]')
SELECT 1 FROM DUAL;

Oracle是否支持产生以下输出的查询? -重复数据删除并将所有分组到单个JSON数组中

1
2
sales       ["foo","foo1","bar"]
engineering ["foo","bar1"]

版本:Oracle Database 12c企业版12.2.0.1.0版-64位生产


从Oracle 12c开始,您可以使用json_table()取消嵌套json数组:从那里开始,您可以对元素进行重复数据删除,最后使用聚合函数json_arrayagg()重建数组:

1
2
3
4
5
6
7
8
9
10
11
SELECT
    group_name,
    json_arrayagg(val ORDER BY val) new_json_array_str
FROM (
    SELECT group_name, val
    FROM
        jsonarray_test j,
        json_table(j.json_array_str, '$[*]' COLUMNS(val varchar2(10) path '$')) t
    GROUP BY group_name, val
) x
GROUP BY group_name

请注意,由于某种原因,对于我来说似乎是个错误,您确实需要group by才能正确消除重复项:select distinct似乎不起作用(重复项仍在结果数组中显示-至少在我的数据库提琴中) )。

DB Fiddle上的演示:

1
2
3
4
GROUP_NAME  | NEW_JSON_ARRAY_STR  
:---------- | :-------------------
engineering | ["bar1","foo"]      
sales       | ["bar","foo","foo1"]