【问题标题】:How to select specific element from a JSON array in Oracles JSON CLOB type如何从 Oracle JSON CLOB 类型的 JSON 数组中选择特定元素
【发布时间】: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"

【问题讨论】:

    标签: json oracle oracle12c jsonpath


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-06
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2016-12-11
      • 1970-01-01
      • 2011-06-20
      • 2018-02-23
      相关资源
      最近更新 更多