【问题标题】:How can I use the oracle REGEXP_SUBSTR to extract specific json values?如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?
【发布时间】:2021-09-16 02:54:29
【问题描述】:

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

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

SELECT REGEXP_SUBSTR(value, '"client"(.*?)"reference":"([^"]+)"', 1, 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"
  }
},
[...],
"client": {
  "someproperty":"123",
  "someobject": {
    [...]
  },
  "reference":"ABCD",
  "someotherproperty":"456"
},
[...]

您遇到了问题,现在 SQL 查询将返回 EFGH,这是供应商的参考。

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

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

【问题讨论】:

  • 你应该使用 Oracle 的 JSON API 而不是纯正则表达式。
  • @TimBiegeleisen 是的,我忘了在问题中添加这个:我在 Oracle 11g 上,所以很遗憾没有可用的 json API

标签: json regex oracle oracle11g regexp-substr


【解决方案1】:

假设您使用的是 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;

哪些输出:

REFERENCE
ABCD

db小提琴here


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


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

【讨论】:

  • 感谢您的回答,不幸的是我使用的是 Oracle 11g,所以第一个选项是不可能的。第二个选项可能很简洁,但我的客户不会在他的服务器上安装 3rd 方包,所以我也被困在这一端。我可能会使用他们的脚本来找到一种方法来做我想做的事
  • @Natty 也许您可以在数据库中启用 Java 并使用 Java 类进行解析?或者您可以建议客户升级数据库? (尝试使用正则表达式或其他字符串函数是行不通的)。
  • 数据库升级是他们基础设施上正在进行的一项工作(公平地说,这项工作已经进行了一年多......),这就是他们不想使用的原因“仅几个月”的第三次聚会。从未听说过在 Oracle 函数中使用 java 代码,我会检查它是如何工作的!
  • @Natty 我以前用例子做了一些答案;您可以在 StackOverflow 中搜索 user:1509264 [oracle] CREATE JAVA,这将给出从复杂示例 unzips archives 到简单 hello world 的一系列答案。
猜你喜欢
  • 2021-04-23
  • 2019-03-21
  • 2012-06-26
  • 2020-10-10
  • 2016-07-28
  • 2021-08-04
  • 1970-01-01
  • 2019-12-13
  • 2019-05-07
相关资源
最近更新 更多