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

Posted

技术标签:

【中文标题】如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?【英文标题】:How can I use the oracle REGEXP_SUBSTR to extract specific json values? 【发布时间】: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 【参考方案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 我以前用例子做了一些答案;您可以在 *** 中搜索 user:1509264 [oracle] CREATE JAVA,这将给出从复杂示例 unzips archives 到简单 hello world 的一系列答案。

以上是关于如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中REGEXP_SUBSTR函数

在 Oracle 中使用 regexp_substr 按顺序拆分字符串

在 Oracle 中使用 REGEXP_SUBSTR 作为拆分

Oracle使用REGEXP_SUBSTR返回括号内的值

Oracle中REGEXP_SUBSTR及其它支持正则表达式的内置函数小结

Oracle SQL 正则表达式 (regexp_substr)