我有一个表,该表的列包含要查询的查询结果的嵌套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内容。但是我不确定该怎么做。
有人可以提供有关如何实现此目标的任何见解吗?
答案 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。正则表达式可以工作,但是它们昂贵且脆弱。