如何从 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 数组中选择特定元素的主要内容,如果未能解决你的问题,请参考以下文章

oracle修改字段类型由varchar2修改为clob类型

oracle如何导出具有clob字段类型的sql?

Oracle中如何查询CLOB字段类型的内容

oracle如何操作clob数据类型

DB2中如何将一个clob类型的字段改为varchar类型

oracle中LOBSEGMENT类型存储的clob的内容过大,如何清除clob字段内容。释放表空间!