Могу ли я использовать строку JSON для обработки результатов запроса? - PullRequest
0 голосов
/ 28 марта 2019

Некоторые процедуры, над которыми я работаю, принимают строку JSON в качестве varchar2 в качестве входного параметра, который содержит параметры, отправленные в виде пар ключ-значение с нашего веб-сервера, которые предназначены для фильтрации результатов запроса. В зависимости от варианта использования некоторые параметры могут не отображаться во входящем JSON. Мне интересно, есть ли способ использовать значения параметров в строке JSON в качестве условий в запросе, даже если определенные параметры могут не возвращать значение? Примерно так:

v_json VARCHAR2 := '{"paramA":"valueA","paramB":"valueB"}';
//the JSON can include values for either paramA, paramB, and paramC
SELECT * 
FROM table
WHERE colA = paramA 
  AND colB > paramB
  AND colC LIKE paramC;

Поскольку в JSON нет paramC, мне нужно выполнить запрос, подобный следующему:

SELECT *
FROM table
WHERE colA = paramA
  AND colB > paramB
//condition C shouldn't be considered, since a null value would have
//produce the wrong results

1 Ответ

0 голосов
/ 29 марта 2019

В Oracle версии 12c или выше вы можете достичь этого, используя JSON_EXISTS условный и JSON_VALUE, чтобы получить значение.Ниже приведен пример кода на основе вашего обновленного требования.

declare
   v_json VARCHAR2(4000) := '{"paramA":"valueA","paramB":"valueB"}';
   l_cntA number;
   l_cntB number;
   l_cntC number;
   l_cnt number;
   v_sql varchar2(4000);
begin
  select count(1) into l_cntA  from dual where JSON_EXISTS(v_json,'$.paramA');
  select count(1) into l_cntB  from dual where JSON_EXISTS(v_json,'$.paramB');
  select count(1) into l_cntC  from dual where JSON_EXISTS(v_json,'$.paramC');
v_sql := '
SELECT count(1) 
FROM table
WHERE  '|| 
  case when l_cntA > 0 then 
      'colA=JSON_VALUE('''||v_json||''',''$.paramA'')' end ||
  case when (l_cntA > 0 and l_cntB > 0 ) then  
      ' AND ' end  ||
  case when l_cntB > 0  then 
      'colB = JSON_VALUE('''||v_json||''',''$.paramB'')' end ||
  case when ((l_cntA > 0  or l_cntB > 0 ) and l_cntC > 0 )  then 
      ' AND ' end ||
  case when l_cntC > 0  then
      'colC LIKE ''%''||JSON_VALUE('''||v_json||''',''$.paramC'')||''%''' 
  end; 
DBMS_OUTPUT.PUT_LINE('v_sql' || v_sql); 

execute immediate v_sql into  l_cnt;

DBMS_OUTPUT.PUT_LINE('v_name ' || l_cnt);

exception 
when others then
DBMS_OUTPUT.PUT_LINE('No Data Found'); 
end;

Для версии Oracle старше 12 / 18c вы можете скачать, установить и использовать пакет PL/JSON с открытым исходным кодом для достижения этой цели. Нажмите здесь, чтобы загрузить PL / JSON Надеюсь, что этопомогает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...