如何使用 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 作为拆分