извлечь элементы из массива json по условию в oracle - PullRequest
0 голосов
/ 22 января 2020

Я изучаю некоторые основы Oracle json функций, но не могу понять, как сделать следующее.

У меня есть корень массива json в сгустке, например.

[{"str":"foo","num":1},{"str":"bar","num":2},{"str":"foobar","num":3}]

Я хотел бы извлечь определенные c элементы из массива, определяющие различные условия для объекта массива, например. когда я указываю условие "где num! = 2", то как-то должна получиться следующая строка:

[{"str":"foo","num":1},{"str":"foobar","num":3}]

Как это можно сделать с помощью функций Oracle bultin json? Как может быть указано любое произвольное условие?

Важно, чтобы не обязательно все ключи (имена атрибутов) были известны только тому, что означает условие, поэтому не может перечислить все из них, как этого требует json_table.


Другими словами, я ищу способ сделать то же самое с json, как написать

select * from jsontext where num!=2

для реальной таблицы.

1 Ответ

0 голосов
/ 22 января 2020

Единственное, о чем я могу думать, это проанализировать JSON, отфильтровать данные и снова сгенерировать JSON.

Поддержка формата JSON впервые была представлена ​​в 12.1, поэтому очень важно, чтобы вы на 12.1 или новее. Вот как получить версию

select version from v$instance;

Если вы используете 12.1 (только эта версия, не новее), то это может помочь

select '[' || listagg('{"str": "' || jt.str || '", "num": ' || jt.num || '}', ',') within group(order by 1) || ']'
  from json_table('[{"str":"foo","num":1},{"str":"bar","num":2},{"str":"foobar","num":3}]', 
                  '$[*]' columns(str path '$.str', num path '$.num')) jt
 where num != 2;

В 12.2 появилась другая функция это немного уменьшит объем кода. Функция json_object собирает столбцы в объект json и json_arrayagg, который объединяет данные в массив JSON. Поэтому на 12.2 и новее ваш код может выглядеть следующим образом

select json_arrayagg(json_object('str' value str, 'num' value jt.num))
  from json_table('[{"str":"foo","num":1},{"str":"bar","num":2},{"str":"foobar","num":3}]', 
                  '$[*]' columns(str path '$.str', num path '$.num')) jt
 where num != 2;       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...