Группировка json массив В Oracle Запрос - PullRequest
2 голосов
/ 27 февраля 2020

У меня есть Oracle таблица:

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 База данных 12 c Выпуск Enterprise Edition 12.2.0.1.0 - 64-битное производство

1 Ответ

0 голосов
/ 27 февраля 2020

Начиная с Oracle 12 c и далее, вы можете использовать json_table() для удаления вложенных массивов json: с этого момента вы можете дедуплицировать элементы и, наконец, использовать агрегатная функция 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

Обратите внимание, что по какой-то причине, которая для меня выглядит как ошибка, вам do нужно group by для правильной работы удалите дубликаты: select distinct, похоже, не работает (в результирующих массивах по-прежнему отображаются дуплики - по крайней мере, в моей скрипке БД).

Демонстрация на DB Fiddle :

GROUP_NAME  | NEW_JSON_ARRAY_STR  
:---------- | :-------------------
engineering | ["bar1","foo"]      
sales       | ["bar","foo","foo1"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...