Единственное, о чем я могу думать, это проанализировать 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;