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

时间:2016-09-02 02:15:18

标签: json oracle oracle12c jsonpath

我有一个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 个答案:

答案 0 :(得分:5)

根据the manual,JSON_path_expression仅支持一些基本语法:

<强> JSON_path_expression :: =

enter image description here

<强> object_step :: =

enter image description here

<强> array_step :: =

enter image description here

另一种方法是使用JSON_TABLE将JSON转换为关系表,然后对列进行投影和过滤。

ul li {
    margin: 25px 0;
    padding-left: 45px;
}
ul li.odd {
    float:right;
}
    ul li.even {
        position:relative;
    }



 <ul>
   <li class="odd">
      Item1  
    </li>

     <li class="even">
        Item2
    </li>

结果:

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'