JSON_VALUE可以返回多个值

时间:2016-10-03 10:40:41

标签: json oracle

我需要解析传入的数据&获取与特定键对应的值。我假设我的数据是clob类型,我正在使用JSON_VALUE

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

如果我需要获得多个区域,例如" AMR"和" EUR" (Ex: User selects 2 regions in the UI but selects only one country),我可以使用JSON_VALUE从clob中获取值吗?如果是,那么clob的格式应该如何。

1 个答案:

答案 0 :(得分: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子句开始执行以下操作:它读取表customers,它将我们的JSON文档保存为doc列作为CLOB。接下来它应用了JSON_TABLE运算符,它为我们做了几个技巧。首先,我们需要将包含JSON文档的列传递给它,在我们的例子中是doc列。然后我们可以给它一个路径前缀,即一种机制,这样我们就不必一遍又一遍地重复整个路径。我们告诉JSON_TABLE我们只想查看#34; REGIONS"数组中的所有元素,通过[*]标记。作为最后一步,我们必须告诉JSON_TABLE我们想要的那些元素在关系世界中是什么样的,即我们想要使用哪些列名和数据类型。这是通过COLUMNS关键字完成的。我们指定我们希望列regioncntry,类型为VARCHAR2和JSON文档中的路径。正如我们已经告诉JSON_TABLE我们只想通过'$.REGIONS[*]'查看REGIONS的数组元素,现在我们可以选择数组的元素,在这种情况下$.REGION和{ {1}}。接下来的步骤很简单。首先,我们为$.CNTRY定义一个表别名,在本例中为JSON_TABLE。现在回到SELECT部分​​,我们可以选择刚刚从JSON文档jt生成的那两列。

您可以查看LiveSQL.oracle.com

中的上述示例