Как извлечь данные из списка в строках с помощью plsql - PullRequest
0 голосов
/ 16 июня 2020
SELECT JSON_QUERY(A.RESPONSEXML,
'$.banking_info.ccris_banking_details.outstanding_credit.items[*].subAccount.subAccountItem.subAccountItem1.credit_position.items'
WITH ARRAY WRAPPER)
  FROM RAMCI_RESPONSE A
 WHERE A.APPID = '5004505'
   AND ROWNUM = 1;



 DBMS_OUTPUT.PUT_LINE(ITEMSDATA);

END;

это строка, которую я получаю после извлечения данных из вышеуказанного запроса

[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]

как мы можем получить данные в строках?

1 Ответ

0 голосов
/ 16 июня 2020

Вы можете использовать запрос иерархии следующим образом:

SQL> with dataa (d) as
  2  (select '[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]' from dual)
  3  -- query starts from here
  4  select '[' || ltrim(ltrim(regexp_substr(d,'[^]]+',1,level) || ']',','),'[') as str
  5  from dataa
  6  connect by level <= regexp_count(d,'\[') - 1;

STR
--------------------------------------------------------------------------------
["","","2","1","1","1","1","0","0","0","0","0"]
["","","0","0","0","1","2","3","2","0","0","0"]
["","","0","0","1","2","2","1","1","1","2","0"]
["","","0","0","0","1","2","2","2","1","0","0"]

SQL>

- Обновление:

SQL> with dataa (d) as
  2  (select '[["","","2","1","1","1","1","0","0","0","0","0"],["","","0","0","0","1","2","3","2","0","0","0"],["","","0","0","1","2","2","1","1","1","2","0"],["","","0","0","0","1","2","2","2","1","0","0"]]' from dual)
  3  -- query starts from
  4  SELECT COALESCE(SUM(CASE WHEN CNTR > 1 THEN 1 END),0) AS CNTR
  5  FROM
  6  (SELECT T.STR, REGEXP_SUBSTR(T.STR, '[0-9]+',1,COLUMN_VALUE) AS CNTR FROM
  7  (select LTRIM(regexp_substr(d,'[^]]+',1,level),',') as str
  8  from dataa
  9  connect by level <= regexp_count(d,'\[') - 1) T
 10  CROSS JOIN
 11  table(cast(multiset(select level from dual
 12  connect by  level <= length (regexp_replace(t.STR, '[^,]+'))  + 1)
 13  as sys.OdciNumberList)) levels);

      CNTR
----------
        10

SQL>
...