如何从 Oracle JSON CLOB 类型的 JSON 数组中选择特定元素
Posted
技术标签:
【中文标题】如何从 Oracle JSON CLOB 类型的 JSON 数组中选择特定元素【英文标题】:How to select specific element from a JSON array in Oracles JSON CLOB type 【发布时间】:2016-09-02 02:15:17 【问题描述】:我有一个包含以下数据的 CLOB 列(为本问题的目的进行了简化)
"notUsed": [],
"stock": [
"name": "eggs",
"value": "in stock"
,
"name": "milk",
"value": "out of stock"
]
我想避免必须选择整个对象并以编程方式解析来获取我想要的数据。理想情况下,我想利用Oracle JSON path 功能来做到这一点。
我想得到"value"
,其中"name" = "eggs"
我尝试了以下方法,但得到了[99999][40442] ORA-40442: JSON path expression syntax error
。我已经通过evaluator 运行了上面的示例 JSON 和 JSON 路径,它返回了所需的结果,这让我认为 Oracle 有它自己的 JSONPath 解释
SELECT
json_query(
'"notUsed":[],"stock":["name":"eggs","value":"in stock", "name":"milk","value":"out of stock"]',
'$.stock[?(@.name=="eggs")]' )
FROM dual;
我也尝试过使用Dot Notation,但找不到一个示例,可以将 where 子句添加到数组的属性中。
select
myTable.id,
myTable.JSON_COLUMN.stock -- how to get array element here?
from MY_TABLE myTable
where j.id = 46
版本:
SELECT * FROM V$VERSION
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
"CORE 12.1.0.2.0 Production"
【问题讨论】:
【参考方案1】:JSON_path_expression 只支持一些基本语法,根据the manual:
JSON_path_expression::=
object_step::=
array_step::=
另一种方法是使用 JSON_TABLE 将 JSON 转换为关系表,然后投影和过滤列。
select value
from json_table(
'
"notUsed": [],
"stock": [
"name": "eggs",
"value": "in stock"
,
"name": "milk",
"value": "out of stock"
]
',
'$.stock[*]'
columns
(
name varchar2(100 char) path '$.name',
value varchar2(100 char) path '$.value'
)
)
where name = 'eggs'
结果:
VALUE
-----
in stock
【讨论】:
以上是关于如何从 Oracle JSON CLOB 类型的 JSON 数组中选择特定元素的主要内容,如果未能解决你的问题,请参考以下文章