Запрос Oracle для чтения вложенных данных JSON - PullRequest
0 голосов
/ 12 июня 2019

У меня есть таблица, в которой есть столбец с вложенными данными JSON, которые я хочу прочитать для результата запроса. Но тип данных столбца VARCHAR, а данные внутри - это строка JSON с вложенными объектами внутри.

Теперь, когда я нажимаю на запрос ниже, он работает нормально и дает мне результат,

select * from dataTable where regexp_like(metadata,'(*)"id":"33001"(*)');

Ниже приведен столбец метаданных dataTable:

{"id":"33001",
"digits":"1234",
"requestId":"5d54-f6-48-8d-8155190",
"deliveryMethod":"ATT",
"messageStatus":"{\"status\":[
{\"tokenId\":\"Zktx\",\"deliveryStatus\":\"SUCCESS\",\"code\":\"0\"},
{\"tokenId\":\"aGsx\",\"deliveryStatus\":\"SUCCESS\",\"code\":\"0\"}
]}"
}

Выше данных - все String в одном столбце метаданных, я разделил их, чтобы они были более читабельными.

Но я также хочу отфильтровать данные по содержанию «deliveryStatus». Поэтому, когда я пытаюсь выполнить запрос ниже,

select * from dataTable where regexp_like(metadata,'(*)"id":"33001"(*)') AND regexp_like(metadata,'(*)\"deliveryStatus\":\"SUCCESS\"(*)');

Это не работает. НЕ показывает никакого результата. Там нет ошибки, хотя. Мне кажется, мне нужен какой-то другой подход для чтения вложенного содержимого JSON внутри этой строки. Но я не уверен, как это сделать.

Может ли кто-нибудь рассказать о том, как этого добиться?

1 Ответ

1 голос
/ 12 июня 2019

Обратная косая черта - это escape-символ в регулярном выражении, поэтому вы должны избегать его с помощью второй обратной косой черты.

-- sample data
with datatable as (select '{"id":"33001",
"digits":"1234",
"requestId":"5d54-f6-48-8d-8155190",
"deliveryMethod":"ATT",
"messageStatus":"{\"status\":[
{\"tokenId\":\"Zktx\",\"deliveryStatus\":\"SUCCESS\",\"code\":\"0\"},
{\"tokenId\":\"aGsx\",\"deliveryStatus\":\"SUCCESS\",\"code\":\"0\"}
]}"
}' metadata from dual)
-- actual query
select * from dataTable where regexp_like(metadata,'(*)"id":"33001"(*)') 
    AND regexp_like(metadata,'(*)\\"deliveryStatus\\":\\"SUCCESS\\"(*)'); -- note double backslashes

Но я рекомендую изучить встроенную поддержку JSON, если вы используете Oracle 12c или более позднюю версию.Как упомянуто @thatjeffsmith.Regex работают, но они дорогие и хрупкие.

...