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