[英]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.