json - 如何使用 oracle REGEXP_SUBSTR 提取特定的 json 值?
问题描述
我的 Oracle 数据库中有一些包含 json 的列,为了在查询中提取它的数据,我使用REGEXP_SUBSTR
.
在以下示例中,value
是表DOSSIER
中包含 json 的列。正则表达式提取该client.reference
json中的属性值
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 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;
哪个输出:
参考 A B C D
db<>在这里摆弄
如果您使用的是 Oracle 11 或更早版本,则可以使用第三方 PLJSON 包来解析 PL/SQL 中的 JSON。比如这个问题。
或者在数据库中启用 Java,然后使用CREATE JAVA
(或loadjava
实用程序)添加一个可以将 JSON 解析到数据库的 Java 类,然后将其包装在 Oracle 函数中并使用它。
推荐阅读
- c# - Unity Android 应用程序在设置为默认主页时严重崩溃(按下主页按钮时)
- java - 在 Spring Security 过滤器链中添加嵌套的自定义过滤器
- xgboost - XGboost + GridSearch:有线警告
- aws-lambda - 使用请求验证模型的无服务器 Lambda 代理集成 - 如何获取详细的验证错误响应
- python - 用实验数据训练模型
- c# - ASP 网络。- 执行 Ajax 调用时产生响应代码 500
- nvd3.js - 使用 NVd3 创建半圆形仪表
- if-statement - 在 Google 表格中记录单元格文本更改的日期
- javascript - 如何在 React JS 中配置 Ckeditor 工具栏?
- excel - 组合框上的宏和枢轴过滤需要很长时间才能完成