微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?

如何解决如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?

我的 Oracle 数据库中有一些包含 json 的列,为了在查询提取它的数据,我使用了 REGEXP_SUBSTR

在以下示例中,value 是表 DOSSIER 中包含 json 的列。正则表达式提取该 json 中属性 client.reference 的值

SELECT REGEXP_SUBSTR(value,'"client"(.*?)"reference":"([^"]+)"',1,NULL,2) FROM DOSSIER;

所以如果 json 看起来像这样:

[...],"client": {
  "someproperty":"123","someobject": {
    [...]
  },"reference":"ABCD","someotherproperty":"456"
},[...]

sql 查询将返回 ABDC

我的问题是某些 json 有多个“客户端”实例,例如:

[...],"contract": {
  "client":"Name of the client","supplier": {
    "reference":"EFGH"
  }
},[...],[...]

你明白了,现在 sql 查询将返回 EFGH,这是供应商的参考。

如何确保“引用”包含在 json 对象“客户端”中?

编辑:我在 Oracle 11g 上,所以我不能使用 JSON API,我想避免使用第三方包

解决方法

假设您使用的是 Oracle 12c 或更高版本,那么您应该不要使用正则表达式,而应该使用 Oracle 的 JSON 函数。

如果你有表格和数据:

CREATE TABLE table_name ( value CLOB CHECK ( value IS JSON ) );

INSERT INTO table_name (
  value
) VALUES (
  '{
  "contract": {
    "client":"Name of the client","supplier": {
        "reference":"EFGH"
    }
  },"client": {
    "someproperty":"123","someobject": {},"reference":"ABCD","someotherproperty":"456"
  }
}'
);

然后就可以使用查询了:

SELECT JSON_VALUE( value,'$.client.reference' ) AS reference
FROM   table_name;

输出:

参考
ABCD

dbfiddle here


如果您使用的是 Oracle 11 或更早版本,那么您可以使用第三方 PLJSON 包来解析 PL/SQL 中的 JSON。例如,this question


或者在数据库中启用 Java,然后使用 CREATE JAVA(或 loadjava 实用程序)添加可以解析 JSON 到数据库的 Java 类,然后将其包装在 Oracle 函数中并使用它.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?