繁体   English   中英

Oracle 提取 json 字段

[英]Oracle extract json fields

我有以下 json。 是否有任何 Oracle 方法可以提取 deviceNumber 下的所有值,而不考虑前面的字段?

{
   "session":{
      "sessionStartDate":"2021-03-21T10:25:51+0000",
      "interactionDate":"2021-03-21T10:36:03+0000",
      "sapGuid":"XXXXXXXXXXXXXXXXXXXXXXX",
      "agentId":"XXXXXXXX",
      "channel":"UI5",
      "bpNumber":"XXXXXXXXX",
      "contractAccountNumber":"XXXXXXXXXX",
      "contactDirection":"",
      "contactMethod":"Z08",
      "interactionId":"XXXXXXXXXX",
      "isResponsibleForPayingBill":"Yes"
   },
   "payload":{
      "agentId":"XXXXXXX",
      "contractAccountNumber":"XXXXXXXXX",
      "readings":{
         "XXXXXXX":{
            "registers":{
               "001":{
                  "isPlausible":true,
                  "deviceNumber":"DEVICE_NUMBER",
                  "register":"001",
                  "readingValue":"08300",
                  "readingDate":"2021-03-21T00:00:00.000Z"
               }
            },
            "errors":[
               
            ],
            "bpNumber":"XXXXXXXX"
         },
         "XXXXXXX":{
            "registers":{
               "001":{
                  "isPlausible":true,
                  "deviceNumber":"DEVICENUMBER",
                  "register":"001",
                  "readingValue":"02635",
                  "readingDate":"2021-03-21T00:00:00.000Z"
               }
            },
            "errors":[
               
            ],
            "bpNumber":"XXXXX"
         }
      }
   }
}

我已经尝试过以下方法,但都不起作用:

JSON_QUERY(data, '$.payload.*.deviceNumber' WITH WRAPPER)
JSON_QUERY(data, '$.*.deviceNumber' WITH WRAPPER)

我的预期结果是

["DEVICE_NUMBER", "DEVICE_NUMBER"]

json 格式是可变的,因此以下解决方案无效:

JSON_QUERY(data, '$.payload.readings.*.registers.*.deviceNumber' WITH WRAPPER)

幸运的是,对于 19c Oracle 大幅扩展了他们的JSON 路径表达式语法 以前,不可能像这样进行递归 JSON 查询。

你非常接近 - 这应该适合你:

JSON_QUERY(data, '$..deviceNumber' with array wrapper)

...虽然我不得不编辑您的示例数据,因为它是无效的 JSON - 两个readings子对象具有相同的名称XXXXXXX ,所以第二个是覆盖第一个。 我将您的第二个重命名为XXXXXXX2 ,您的示例运行良好。

-- example data
with mytable as (select '{
   "session":{
      "sessionStartDate":"2021-03-21T10:25:51+0000",
      "interactionDate":"2021-03-21T10:36:03+0000",
      "sapGuid":"XXXXXXXXXXXXXXXXXXXXXXX",
      "agentId":"XXXXXXXX",
      "channel":"UI5",
      "bpNumber":"XXXXXXXXX",
      "contractAccountNumber":"XXXXXXXXXX",
      "contactDirection":"",
      "contactMethod":"Z08",
      "interactionId":"XXXXXXXXXX",
      "isResponsibleForPayingBill":"Yes"
   },
   "payload":{
      "agentId":"XXXXXXX",
      "contractAccountNumber":"XXXXXXXXX",
      "readings":{
         "XXXXXXX":{
            "registers":{
               "001":{
                  "isPlausible":true,
                  "deviceNumber":"DEVICE_NUMBER",
                  "register":"001",
                  "readingValue":"08300",
                  "readingDate":"2021-03-21T00:00:00.000Z"
               }
            },
            "errors":[
               
            ],
            "bpNumber":"XXXXXXXX"
         },
         "XXXXXXX2":{
            "registers":{
               "001":{
                  "isPlausible":true,
                  "deviceNumber":"DEVICENUMBER",
                  "register":"001",
                  "readingValue":"02635",
                  "readingDate":"2021-03-21T00:00:00.000Z"
               }
            },
            "errors":[
               
            ],
            "bpNumber":"XXXXX"
         }
      }
   }
}' as data from dual)
-- actual query
select JSON_QUERY(data, '$..deviceNumber' with array wrapper) as v
from mytable;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM