Oracle查询以读取嵌套的JSON数据

时间:2019-06-12 11:53:11

标签: oracle oracle-sqldeveloper

我有一个表,该表的列包含要查询的查询结果的嵌套JSON数据。但是column的数据类型是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 个答案:

答案 0 :(得分:1)

反斜杠是正则表达式中的转义字符,因此您必须使用第二个反斜杠对其进行转义。

-- 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

但是,如果您使用的是Oracle 12c或更高版本,建议不要使用本机JSON支持,例如@thatjeffsmith。正则表达式可以工作,但是它们昂贵且脆弱。