2016-10-03 84 views
0

我有一个要求来解析传入的数据&获取对应于特定键的值。我使用JSON_VALUE与假设我的数据是clob类型相同。JSON_VALUE可以返回多个值

{"REGION": "AMR", "CNTRY": "US"} 

如果我需要得到多个地区像“AMR”和“欧元” (Ex: User selects 2 regions in the UI but selects only one country),我可以用JSON_VALUE从CLOB获取值?如果是的话,clob的格式应该如何。

回答

0

问题的答案取决于JSON文档的结构。但首先,是的,您可以从数据类型VARCHAR2BLOBCLOB获取任何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关键词完成的。我们指定我们想要列出regioncntry,它们都是VARCHAR2类型和JSON文档中的路径。正如我们已经告诉JSON_TABLE我们只想通过'$.REGIONS[*]'查看REGIONS的数组元素,现在我们可以选择数组的元素,在这种情况下,$.REGION$.CNTRY。接下来的步骤很简单。首先我们为JSON_TABLE定义一个表别名,在这种情况下为jt。现在回到SELECT部分​​,我们可以选择刚刚生成的JSON文档SELECT jt.region, jt.cntry中的那两列。

你可以看看并尝试上面的例子LiveSQL.oracle.com