简体   繁体   English

Oracle 提取 json 字段

[英]Oracle extract json fields

I have the below json.我有以下 json。 Is there any Oracle way to extract all the values under deviceNumber regarless of the previous fields?是否有任何 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"
         }
      }
   }
}

I've already tried the below, but neither work:我已经尝试过以下方法,但都不起作用:

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

My expected result would be我的预期结果是

["DEVICE_NUMBER", "DEVICE_NUMBER"]

The json format is variable, so the below solution would not be valid: json 格式是可变的,因此以下解决方案无效:

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

Fortunately, for 19c Oracle drastically expanded their JSON path expression syntax ;幸运的是,对于 19c Oracle 大幅扩展了他们的JSON 路径表达式语法 previously, it wasn't possible to do recursive JSON queries like this.以前,不可能像这样进行递归 JSON 查询。

You were pretty close - this should work for you:你非常接近 - 这应该适合你:

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

...although I had to edit your example data, since it was invalid JSON - both readings child objects had the same name of XXXXXXX , so the second one was overwriting the first one. ...虽然我不得不编辑您的示例数据,因为它是无效的 JSON - 两个readings子对象具有相同的名称XXXXXXX ,所以第二个是覆盖第一个。 I renamed your second one to XXXXXXX2 and your example works fine.我将您的第二个重命名为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