问题的答案取决于JSON文档的结构。但首先,是的,您可以从数据类型VARCHAR2
,BLOB
和CLOB
获取任何JSON值。
我假设,根据您对需求的解释方式,JSON的结构将带有一系列区域,本身就是您在上面指出的对象。因此,让我们假设你有一个JSON这样的:
{
"REGIONS": [
{"REGION": "AMR", "CNTRY": "US"},
{"REGION": "EUR", "CNTRY": "AT"}
]
}
在这种情况下JSON_VALUE
不再是不够的,因为JSON_VALUE
设计获得从JSON文件给定标值(注意,在这方面Oracle 12.2 will have significant enhancements)。但是在上面的例子中,您实际上需要将该对象数组建模为关系行,即(您有一个JSON文档,但是应该成为一行的条目数组)。在这种情况下,您必须使用JSON_TABLE
来生成行。因此,对于上面的例子,你可以编写一个查询,如:
CREATE TABLE customers (doc CLOB CONSTRAINT doc_valid_json CHECK (doc IS JSON));
INSERT INTO customers (doc) VALUES ('
{
"REGIONS": [
{"REGION": "AMR", "CNTRY": "US"},
{"REGION": "EUR", "CNTRY": "AT"}
]
}');
COMMIT;
SELECT jt.region, jt.cntry
FROM customers c, JSON_TABLE(c.doc, '$.REGIONS[*]'
COLUMNS (region VARCHAR2(3) PATH '$.REGION',
cntry VARCHAR2(2) PATH '$.CNTRY')) jt;
的SQL上面会做以下,开始在FROM子句:它读取持有我们的JSON文档列doc
为CLOB表customers
。接下来它应用JSON_TABLE
运算符,它为我们提供了一些技巧。首先我们需要将它传递给包含JSON文档的列,在我们的例子中是doc
列。然后我们可以给它一个路径前缀,即一个机制,这样我们就不必一遍又一遍地重复整个路径。我们告诉JSON_TABLE
我们只想查看数组中出现的“REGIONS”的所有元素,通过[*]
标记。作为最后一步,我们必须告诉JSON_TABLE
我们希望这些元素在关系世界中看起来像什么,即我们想要使用哪些列名称和数据类型。这是通过COLUMNS
关键词完成的。我们指定我们想要列出region
和cntry
,它们都是VARCHAR2类型和JSON文档中的路径。正如我们已经告诉JSON_TABLE
我们只想通过'$.REGIONS[*]'
查看REGIONS的数组元素,现在我们可以选择数组的元素,在这种情况下,$.REGION
和$.CNTRY
。接下来的步骤很简单。首先我们为JSON_TABLE
定义一个表别名,在这种情况下为jt
。现在回到SELECT部分,我们可以选择刚刚生成的JSON文档SELECT jt.region, jt.cntry
中的那两列。
你可以看看并尝试上面的例子LiveSQL.oracle.com