oracle - 用于读取嵌套 JSON 数据的 Oracle 查询
问题描述
我有一个表,其中有一列包含我想读取的嵌套 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\"}
]}"
}
上面的数据是单个元数据列中的所有字符串,我将其拆分只是为了使其更具可读性。
但我也想根据“deliveryStatus”内容过滤数据。所以当我尝试下面的查询时,
select * from dataTable where regexp_like(metadata,'(*)"id":"33001"(*)') AND regexp_like(metadata,'(*)\"deliveryStatus\":\"SUCCESS\"(*)');
它不起作用。不显示任何结果。虽然没有错误。我觉得我需要一些其他方法来读取该字符串中嵌套的 JSON 内容。但我不知道该怎么做。
有人可以提供有关如何实现这一目标的任何见解吗?
解决方案
反斜杠是正则表达式中的转义字符,因此您必须使用第二个反斜杠对其进行转义。
-- 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 提到的那样。正则表达式有效,但它们既昂贵又脆弱。
推荐阅读
- project - 如何执行“AL:GO!” 作为脚本一部分的任务
- php - 如何使用“location = script”指令通过 Nginx 将 php-script 传递给 Apache?
- python - 高斯过程回归的各向异性内核如何与可变数量的特征一起使用?
- javascript - 型号名称(猫鼬)的大写?
- java - Spring-boot 出现与 rabbitmq 相关的“第二个‘channel.open’”错误
- lambda - 如何制作一个可以序列化所有数据(包括 lambda 函数)的解释器?
- r - ggplotly 与 geom_ribbon 分组
- jquery - 如何使超链接同时扩展并流向所需的文本?
- c# - 有没有办法使用 C# 为服务器端开发 Outlook 加载项?
- ios - 如何在 ios 的 App Purchase 中使用折扣