2014-09-12 4 views
1

У меня есть JSON строки в одном столбце в базе данных Oracle 10g, какразбора JSON строки в оракула

[{"id":"1","contactBy":"Rajesh Kumar"},{"id":"2","contactBy":"Rakesh Kumar"}] 

я должен получить значение для ContactBy в этой колонке для одного из отчетов.

есть ли встроенная функция для разбора строки JSON в Oracle 10g или любой определенный пользователем Funciton для разбора строки

+4

Встроенная поддержка JSON доступна с Oracle 12c [documenation] (http://docs.oracle.com/database/121/ADXDB/json.htm#ADXDB6246) –

+0

В противном случае я думаю, ваш лучший шанс на используйте сохраненную java или, возможно, pl/sql. Зависит от ваших конкретных потребностей - пример кода? –

+1

30 секунд Google: http://sourceforge.net/projects/pljson/ –

ответ

5

По словам Йенса в комментариях, поддержка JSON доступна только 12c, но вы можете использовать регулярные выражения, как обходной путь, чтобы получить то, что вы хотите:

select regexp_replace(regexp_substr('[{"id": "1", "contactBy":"Rajesh Kumar"},{"id": "2","contactBy": "Emmanuel Test"}]', 
            '"contactBy":\s*("(\w|)*")', 1, level), 
        '"contactBy":\s*"((\w|)*)"', '\1', 1, 1) contact 
from dual 
connect by regexp_substr('[{"id": "1","contactBy":"Rajesh Kumar"},{"id": "2","contactBy": "Emmanuel Test"}]', '"contactBy":\s*("(\w|)*")', 1, level) is not null 
; 

EDIT: запрос изменен, чтобы принимать как специальные символы и отображать ответы в одной строке:

select listagg(contact, ', ') within group (order by lev) 
from 
(
    select regexp_replace(regexp_substr('[{"id": "1", "contactBy":"Rajesh Kumar"},{"id": "2","contactBy": "Emmanuel Test+-"}]', 
             '"contactBy":\s*(".*?")', 1, level), 
         '"contactBy":\s*"(.*?)"', '\1', 1, 1) contact, level lev 
    from dual 
    connect by regexp_substr('[{"id": "1","contactBy":"Rajesh Kumar"},{"id": "2","contactBy": "Emmanuel Test+-"}]', '"contactBy":\s*(".*?")', 1, level) is not null 
) 
; 
+0

Мне нужен результат в одной строке, разделенной запятой, а не в нескольких строках. Является ли это возможным ? –

+0

, ваш фрагмент очень полезен для меня, но если contactBy содержит любые специальные символы, то он не работает. –

+0

Я изменил свой ответ, чтобы соответствовать всем вашим потребностям :-) – Emmanuel

0

@ Emmanuel Ваш код действительно очень помог, спасибо вам большое. но ваш запрос занимает слишком много времени, поэтому я переключился на функцию, которая вернет требуемые значения.

CREATE OR REPLACE FUNCTION SFGETCRCONTACTBY(INCRID NUMBER) RETURN VARCHAR2 AS 
TEMPINT NUMBER :=0; 
OUTPUT VARCHAR2(10000) ; 
TEMPVAR VARCHAR2(1000); 

BEGIN 

SELECT REGEXP_COUNT(CR_CONTACT_BY, '"contactBy":\S*(".*?")') 
INTO TEMPINT 
FROM T_LOAN_REQUEST_MARKET WHERE CR_ID=INCRID; 
WHILE TEMPINT > 0 
LOOP 
SELECT REGEXP_REPLACE(REGEXP_SUBSTR(CR_CONTACT_BY, '"contactBy":\S*(".*?")', 1,TEMPINT), '"contactBy":\S*"(.*?)"', '\1', 1, 1) INTO TEMPVAR 
FROM T_LOAN_REQUEST_MARKET WHERE CR_ID=INCRID; 
IF OUTPUT IS NULL THEN 
    OUTPUT := TEMPVAR; 
ELSE 
    OUTPUT := OUTPUT ||',' || TEMPVAR; 
END IF; 

TEMPINT := TEMPINT-1; 
END LOOP; 

RETURN OUTPUT; 
END; 
/
Смежные вопросы