如何使用Oracle 12c查询索引JSON内的数组?

时间:2016-02-22 20:00:43

标签: sql oracle oracle12c

我有一张桌子"移动"一列" move_doc"这是一个CLOB。存储在里面的json具有结构:

{
moveid : "123",
movedate : "xyz",
submoves: [
{
submoveid: "1",
...
 },
{
submoveid : "2",
...
}
]
}

我知道我可以运行Oracle 12c查询来访问submoves列表:

select move.move_doc.submoves from move move

如何访问阵列的特定子移动?和特定子移动中的属性?

3 个答案:

答案 0 :(得分:2)

您必须使用Oracle函数json_query和/或json_value,如下所示:

SELECT json_value(move_doc, '$.submoves[0].submoveid' RETURNING NUMBER) FROM move;

返回1

SELECT json_query(move_doc, '$.submoves[1]') FROM move;

会返回第二个JSON元素,例如

{
submoveid : "2",
...
}

json_value用于检索标量值,json_query用于检索JSON值。您可能还想查看json_table,它返回一个SQL结果表,因此可以在连接中使用。

有关更多示例,请参阅this Oracle Doc

答案 1 :(得分:1)

Oracle JSON团队的Beda在这里。

我们在版本21c中添加了新的多值索引,使您可以索引JSON数组中的值。显然,21c是全新的,您想知道如何在较早的版本中执行此操作:功能索引(使用JSON_Value函数)仅限于每个JSON文档的单个值,因此无法索引数组值。但是:有一个“ JSON搜索索引”可以索引整个JSON文档,因此也可以索引数组中的值。另一个解决方案是使用实例化视图usign JSON_Table。这样会将数组值扩展为单独的行。然后,您可以在该列上添加常规B树索引。

此处的示例代码: 具有功能索引和JSON搜索索引的JSON索引 https://livesql.oracle.com/apex/livesql/file/content_HN507PELCEEJGVNW4Q61L34DS.html

JSON和物化视图 https://livesql.oracle.com/apex/livesql/file/content_HYMB1YBP4CPMG6T6MXY5G9X5L.html

答案 2 :(得分:0)

根据我的观察,在Oracle中,您可以将“整个数组”作为单个索引条目进行索引,但不能对数组的单个元素进行索引。

诸如MongoDB,Couchbase,Cassandra之类的NoSQL数据库具有“数组/集合”索引,这些索引可以索引数组中单个元素或对象字段并对其进行查询。