如何在Oracles JSON CLOB类型中从JSON数组中选择特定元素

如何在Oracles JSON CLOB类型中从JSON数组中选择特定元素,json,oracle,oracle12c,jsonpath,Json,Oracle,Oracle12c,Jsonpath,我有一个包含以下数据的CLOB列(为了这个问题的目的简化) 我希望避免必须选择整个对象并通过编程进行解析以获得所需的数据。理想情况下,我想利用这些特性来实现这一点 我想得到“value”,其中“name”=“eggs” 我尝试了以下操作,但得到一个[99999][40442]ORA-40442:JSON路径表达式语法错误。我已经通过运行了上面的示例JSON和JSON path,它返回了所需的结果,这使我认为Oracle有自己的JSONPath解释 SELECT json_query(

我有一个包含以下数据的CLOB列(为了这个问题的目的简化)

我希望避免必须选择整个对象并通过编程进行解析以获得所需的数据。理想情况下,我想利用这些特性来实现这一点

我想得到
“value”
,其中
“name”=“eggs”

我尝试了以下操作,但得到一个
[99999][40442]ORA-40442:JSON路径表达式语法错误
。我已经通过运行了上面的示例JSON和JSON path,它返回了所需的结果,这使我认为Oracle有自己的JSONPath解释

SELECT
  json_query(
                 '{"notUsed":[],"stock":[{"name":"eggs","value":"in stock"}, {"name":"milk","value":"out of stock"}]}',
                 '$.stock[?(@.name=="eggs")]' )
FROM dual;
我也尝试过使用,但还没有找到一个例子,说明如何将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_表达式仅支持一些基本语法,如下所示:

JSON\u路径\u表达式::=

对象\u步骤::=

数组\u步骤::=

另一种方法是使用JSON_表将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

JSON_path_表达式仅支持一些基本语法,如下所示:

JSON\u路径\u表达式::=

对象\u步骤::=

数组\u步骤::=

另一种方法是使用JSON_表将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