在 Oracle 查询中对 json 数组进行分组
Grouping json array In Oracle Query
我有 Oracle table:
CREATE TABLE jsonarray_test
(id VARCHAR2(50) PRIMARY KEY,
json_array_str VARCHAR2(256),
group_name VARCHAR2(50));
数据
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 数组
sales ["foo", "foo1", "bar"]
engineering ["foo", "bar1"]
版本:Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产
从 Oracle 12c 开始,您可以使用 json_table()
to unnest the json arrays: from there on, you can then deduplicate the elements, and finally use aggregate function json_arrayagg()
重建数组:
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
不需要似乎有效(重复项仍显示在结果数组中 - 至少在我的数据库中 fiddle)。
GROUP_NAME | NEW_JSON_ARRAY_STR
:---------- | :-------------------
engineering | ["bar1","foo"]
sales | ["bar","foo","foo1"]
我有 Oracle table:
CREATE TABLE jsonarray_test
(id VARCHAR2(50) PRIMARY KEY,
json_array_str VARCHAR2(256),
group_name VARCHAR2(50));
数据
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 数组
sales ["foo", "foo1", "bar"]
engineering ["foo", "bar1"]
版本:Oracle Database 12c 企业版 12.2.0.1.0 版 - 64 位生产
从 Oracle 12c 开始,您可以使用 json_table()
to unnest the json arrays: from there on, you can then deduplicate the elements, and finally use aggregate function json_arrayagg()
重建数组:
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
不需要似乎有效(重复项仍显示在结果数组中 - 至少在我的数据库中 fiddle)。
GROUP_NAME | NEW_JSON_ARRAY_STR :---------- | :------------------- engineering | ["bar1","foo"] sales | ["bar","foo","foo1"]