Можно ли в Oracle SQL объединить JSON массивы, полученные из результатов запросов?

Каким образом можно объединить все JSON массивы, извлеченные из полей item в результате выполнения запроса <code class="sql">select item from table</code>, в один общий JSON массив?
  • 26 июня 2024 г. 20:11
Ответы на вопрос 2
Да, в Oracle SQL можно объединить JSON массивы, полученные из результатов запросов. Для этого можно использовать функцию LISTAGG в сочетании с JSON_ARRAYAGG.

Пример запроса:

```
SELECT JSON_ARRAYAGG(value) AS combined_json_array
FROM (
  SELECT JSON_VALUE(item, '$.value') AS value
  FROM table
);
```

В данном запросе сначала извлекается значение из каждого элемента массива item и затем с помощью функции JSON_ARRAYAGG объединяются все значения в один общий JSON массив.
Смотрите в сторону функции ListAgg - она объединит все значения через разделитель. 
Потом останется только обрамить результат в скобки:
select '[' || ListAgg(item, ',') over (order by rownum) || ']'  as item_arr
  from table

PS: ListAgg работает с данными, которые можно привести к varchar/varchar2. То есть, у вас есть физическое ограничение в 4000 символов в результирующей строке. Или у вас данные изначально в BLOB/CLOB.
В этих случаях вам нужно использовать хранимую функцию, поскольку в чистом SQL вы не сможете работать с безразмерными атрибутами.
PPS: А вообще, нужно избавиться от JSON и нормализовать таблицу.
PPPS: Если вы делаете API, то формировать JSON для ответа API - это не функция СУБД, этим должна заниматься прослойка перед СУБД.
Похожие вопросы