问题描述
我的 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"
},[...]
我的问题是某些 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 函数中并使用它.