Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用Oracle 12c查询为JSON中的数组编制索引?_Sql_Json_Oracle_Indexing_Oracle12c - Fatal编程技术网

Sql 如何使用Oracle 12c查询为JSON中的数组编制索引?

Sql 如何使用Oracle 12c查询为JSON中的数组编制索引?,sql,json,oracle,indexing,oracle12c,Sql,Json,Oracle,Indexing,Oracle12c,我有一个表“move”,其中有一列“move\u doc”,它是CLOB。存储在其中的json具有以下结构: { moveid : "123", movedate : "xyz", submoves: [ { submoveid: "1", ... }, { submoveid : "2", ... } ] } 我知道我可以通过以下方式运行Oracle 12c查询以访问子移动列表: 从移动中选择move.move\u doc.submoves 如何访问阵列的特定子移动?以及特定子移动中的属性

我有一个表“move”,其中有一列“move\u doc”,它是CLOB。存储在其中的json具有以下结构:

{
moveid : "123",
movedate : "xyz",
submoves: [
{
submoveid: "1",
...
 },
{
submoveid : "2",
...
}
]
}
我知道我可以通过以下方式运行Oracle 12c查询以访问子移动列表:

从移动中选择move.move\u doc.submoves


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

您必须使用Oracle函数
json\u query
和/或
json\u 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\u value
用于检索标量值,
json\u query
用于检索json值。您可能还想看看
json\u table
,它返回一个SQL结果表,因此可以在联接中使用


有关更多示例,请参见

,在Oracle中,您可以将“整个数组”作为单个索引项进行索引,但不能对数组的单个元素进行索引


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

Beda来自Oracle JSON团队

我们在21c版中添加了一个新的多值索引,允许您对JSON数组中的值进行索引。显然,21c是全新的,您想知道如何在旧版本中做到这一点:函数索引(使用JSON_Value函数)仅限于每个JSON文档的一个值,因此无法索引数组值。但是:有一个“JSON搜索索引”,它对整个JSON文档以及数组中的值进行索引。另一种解决方案是使用物化视图usign JSON_表。这将把数组值扩展成单独的行,然后你可以在该列上添加一个常规的B树索引

此处的示例代码: 带有函数索引和JSON搜索索引的JSON索引

JSON和物化视图

该链接适用于Oracle数据库12cR1。12cR2对应的单据为。