如何使用 Oracle 12c 查询为 JSON 中的数组编制索引?
How do you index an array inside a JSON with an Oracle 12c query?
我有一个 table "move",其中有一列 "move_doc",这是一个 CLOB。里面存储的 json 结构为:
{
moveid : "123",
movedate : "xyz",
submoves: [
{
submoveid: "1",
...
},
{
submoveid : "2",
...
}
]
}
我知道我可以 运行 Oracle 12c 查询来访问子移动列表:
select move.move_doc.submoves from move move
如何访问数组的特定子移动?以及特定子动作中的属性?
你必须像这样使用 Oracle 函数 json_query
and/or json_value
:
SELECT json_value(move_doc, '$.submoves[0].submoveid' RETURNING NUMBER) FROM move;
returns 1
.
SELECT json_query(move_doc, '$.submoves[1]') FROM move;
会 return 第二个 JSON 元素,即
{
submoveid : "2",
...
}
json_value
用于检索标量值,json_query
用于检索 JSON 值。您可能还想看看 json_table
,其中 return 是一个 SQL 结果 table,因此可以在联接中使用。
有关更多示例,请参阅 this Oracle Doc
据我所知,在 Oracle 中,您可以将 "whole array" 索引为单个索引条目,而不是数组的单个元素。
像 MongoDB、Couchbase、Cassandra 这样的 NoSQL 数据库有 "array/collection" 索引,可以索引数组中的单个元素或对象字段并查询它们。
来自 Oracle JSON 团队的 Beda。
我们在版本 21c 中添加了一个新的多值索引,允许您从 JSON 数组中索引值。显然,21c 是全新的,您想知道如何在旧版本中执行此操作:功能索引(使用 JSON_Value 函数)限于每个 JSON 文档的单个值,因此无法索引数组值。但是:有一个 'JSON search index' 索引整个 JSON 文档,因此也索引数组中的值。另一种解决方案是使用实体化视图 usign JSON_Table。这会将数组值扩展为单独的 rows.Then 您可以在该列上添加常规 B-Tree 索引。
示例代码在这里:
JSON 使用功能索引和 JSON 搜索索引进行索引
https://livesql.oracle.com/apex/livesql/file/content_HN507PELCEEJGVNW4Q61L34DS.html
JSON 和物化视图
https://livesql.oracle.com/apex/livesql/file/content_HYMB1YBP4CPMG6T6MXY5G9X5L.html
我有一个 table "move",其中有一列 "move_doc",这是一个 CLOB。里面存储的 json 结构为:
{
moveid : "123",
movedate : "xyz",
submoves: [
{
submoveid: "1",
...
},
{
submoveid : "2",
...
}
]
}
我知道我可以 运行 Oracle 12c 查询来访问子移动列表:
select move.move_doc.submoves from move move
如何访问数组的特定子移动?以及特定子动作中的属性?
你必须像这样使用 Oracle 函数 json_query
and/or json_value
:
SELECT json_value(move_doc, '$.submoves[0].submoveid' RETURNING NUMBER) FROM move;
returns 1
.
SELECT json_query(move_doc, '$.submoves[1]') FROM move;
会 return 第二个 JSON 元素,即
{
submoveid : "2",
...
}
json_value
用于检索标量值,json_query
用于检索 JSON 值。您可能还想看看 json_table
,其中 return 是一个 SQL 结果 table,因此可以在联接中使用。
有关更多示例,请参阅 this Oracle Doc
据我所知,在 Oracle 中,您可以将 "whole array" 索引为单个索引条目,而不是数组的单个元素。
像 MongoDB、Couchbase、Cassandra 这样的 NoSQL 数据库有 "array/collection" 索引,可以索引数组中的单个元素或对象字段并查询它们。
来自 Oracle JSON 团队的 Beda。
我们在版本 21c 中添加了一个新的多值索引,允许您从 JSON 数组中索引值。显然,21c 是全新的,您想知道如何在旧版本中执行此操作:功能索引(使用 JSON_Value 函数)限于每个 JSON 文档的单个值,因此无法索引数组值。但是:有一个 'JSON search index' 索引整个 JSON 文档,因此也索引数组中的值。另一种解决方案是使用实体化视图 usign JSON_Table。这会将数组值扩展为单独的 rows.Then 您可以在该列上添加常规 B-Tree 索引。
示例代码在这里: JSON 使用功能索引和 JSON 搜索索引进行索引 https://livesql.oracle.com/apex/livesql/file/content_HN507PELCEEJGVNW4Q61L34DS.html
JSON 和物化视图 https://livesql.oracle.com/apex/livesql/file/content_HYMB1YBP4CPMG6T6MXY5G9X5L.html