如何从 Oracle JSON CLOB 类型的 JSON 数组中 select 特定元素
How to select specific element from a JSON array in Oracles JSON CLOB type
我有一个包含以下数据的 CLOB 列(针对此问题进行了简化)
{
"notUsed": [],
"stock": [
{
"name": "eggs",
"value": "in stock"
},
{
"name": "milk",
"value": "out of stock"
}
]
}
我想避免必须 select 整个对象并以编程方式解析以获得我想要的数据。理想情况下,我想利用 Oracle JSON path 功能来执行此操作。
我想得到"value"
,其中"name" = "eggs"
我尝试了以下方法,但得到了 [99999][40442] ORA-40442: JSON path expression syntax error
。我有 运行 上面的例子 JSON 和 JSON 通过 evaluator 的路径并且它 returns 想要的结果,这让我觉得 Oracle 有它自己的 JSON路径解释
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"
JSON_path_expression只支持一些基本语法,根据the manual:
JSON_path_expression::=
object_step::=
array_step::=
另一种方法是使用 JSON_TABLE 将 JSON 转换为关系 table,然后投影和筛选列。
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
我有一个包含以下数据的 CLOB 列(针对此问题进行了简化)
{
"notUsed": [],
"stock": [
{
"name": "eggs",
"value": "in stock"
},
{
"name": "milk",
"value": "out of stock"
}
]
}
我想避免必须 select 整个对象并以编程方式解析以获得我想要的数据。理想情况下,我想利用 Oracle JSON path 功能来执行此操作。
我想得到"value"
,其中"name" = "eggs"
我尝试了以下方法,但得到了 [99999][40442] ORA-40442: JSON path expression syntax error
。我有 运行 上面的例子 JSON 和 JSON 通过 evaluator 的路径并且它 returns 想要的结果,这让我觉得 Oracle 有它自己的 JSON路径解释
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"
JSON_path_expression只支持一些基本语法,根据the manual:
JSON_path_expression::=
object_step::=
array_step::=
另一种方法是使用 JSON_TABLE 将 JSON 转换为关系 table,然后投影和筛选列。
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