多个节点同名时使用 Oracle SQL 获取 JSON_VALUE

Posted

技术标签:

【中文标题】多个节点同名时使用 Oracle SQL 获取 JSON_VALUE【英文标题】:Get JSON_VALUE with Oracle SQL when multiple nodes share the same name 【发布时间】:2017-01-27 17:27:34 【问题描述】:

我有一个问题,我的 oracle 数据库中存储了一些 JSON,我需要从中提取值。

问题是,有些字段是重复的。

当我尝试这个时,它可以工作,因为选项数组中只有一个名字键:

    SELECT 
    JSON_VALUE('"increment_id":"2500000043","item_id":"845768","options":["firstname":"Kevin","lastname":"Test"]', '$.options.firstname') AS value
   FROM DUAL;

返回“Kevin”。

但是,当 firstname 字段有两个值时:

SELECT JSON_VALUE('"increment_id":"2500000043","item_id":"845768","options":["firstname":"Kevin","firstname":"Okay","lastname":"Test"]', '$.options.firstname') AS value
  FROM DUAL;

它只返回 NULL。

在这种情况下,有什么方法可以选择“名字”的第一次出现?

【问题讨论】:

【参考方案1】:

JSON_VALUE 从 JSON 数据中返回一个 SQL VALUE(如果键不存在,则返回 SQL NULL)。

如果您有一组值(JSON 数组)并且您想要数组的一个特定项,您可以使用数组下标(方括号),就像在 javascript 中一样,例如 [2] 来选择第三项。 [0] 选择第一项。 要获取示例中的第一个数组项,您必须将路径表达式从 '$.options.firstname' 更改为 '$.options[0].firstname'

【讨论】:

【参考方案2】:

您可以按照以下查询:-

SELECT JSON_VALUE('
  "increment_id": "2500000043",
  "item_id": "845768",
  "options": [
    
      "firstname": "Kevin"
    ,
    
      "firstname": "Okay"
    ,
    
      "lastname": "Test"
    
  ]
', '$.options[0].firstname') AS value
  FROM DUAL;

【讨论】:

以上是关于多个节点同名时使用 Oracle SQL 获取 JSON_VALUE的主要内容,如果未能解决你的问题,请参考以下文章

Oracle ---- 同一个SQL文在RAC环境多个节点的结果一定相同吗?

如何控制多个同名精灵套件节点?

Oracle SQL 查询从一行中的多个列中获取最新数据

如何使用 xPath (10g) 在 Oracle SQL extract() 中获取节点名称

基本 XML/XSLT - 存在多个同名元素时的值

如何使用 JPA 原生查询选择多个同名的列?