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