Oracle SQL JSON_查询忽略键字段
我有一个json,其中几个键是一个数字,而不是一个固定的字符串。是否有任何方法可以绕过它们来访问嵌套值Oracle SQL JSON_查询忽略键字段,sql,json,oracle,Sql,Json,Oracle,我有一个json,其中几个键是一个数字,而不是一个固定的字符串。是否有任何方法可以绕过它们来访问嵌套值 { "55568509":{ "registers":{ "001":{ "isPlausible":false, "deviceNumber":"55501223",
{
"55568509":{
"registers":{
"001":{
"isPlausible":false,
"deviceNumber":"55501223",
"register":"001",
"readingValue":"5295",
"readingDate":"2021-02-25T00:00:00.000Z"
}
}
}
}
我在这里的预期输出是5295,但由于59668509可能因json而异,因此json_查询(数据“$.”59668509.registers.001.readingValue)将不是一个选项。我不能在这里使用regexp,因为这只是原始json的一部分,其中包含的内容不止这些
更新:多次出现的完整json:
这就是我的整个json的样子。我希望所有的readingValue都放在括号中,在下面的例子中,我的预期输出是[3264100964]
WITH test_table ( data ) AS (
SELECT
'{
"session":{
"sessionStartDate":"2021-02-26T12:03:34+0000",
"interactionDate":"2021-02-26T12:04:19+0000",
"sapGuid":"369F01DFXXXXXXXXXX8553F40CE282B3",
"agentId":"USER001",
"channel":"XXX",
"bpNumber":"5551231234",
"contractAccountNumber":"55512312345",
"contactDirection":"",
"contactMethod":"Z08",
"interactionId":"5550848784",
"isResponsibleForPayingBill":"Yes"
},
"payload":{
"agentId":"USER001",
"contractAccountNumber":"55512312345",
"error":{
"55549271":{
"registers":{
"001":{
"isPlausible":false,
"deviceNumber":"55501223",
"register":"001",
"readingValue":"32641",
"readingDate":"2021-02-26T00:00:00.000Z"
}
},
"errors":[
{
"contractNumber":"55501231",
"language":"EN",
"errorCode":"62",
"errorText":"Error Text1",
"isHardError":false
},
{
"contractNumber":"55501232",
"language":"EN",
"errorCode":"62",
"errorText":"Error Text2",
"isHardError":false
}
],
"bpNumber":"5557273667"
},
"55583693":{
"registers":{
"001":{
"isPlausible":false,
"deviceNumber":"555121212",
"register":"001",
"readingValue":"00964",
"readingDate":"2021-02-26T00:00:00.000Z"
}
},
"errors":[
],
"bpNumber":"555123123"
}
}
}
}'
FROM
dual
)
SELECT
JSON_QUERY(data, '$.payload.error.*.registers.*[*].readingValue') AS reading_value
FROM
test_table;
更新2:
解决了这个问题,这将起到关键作用,对第一条评论进行投票
JSON_QUERY(data, '$.payload.error.*.registers.*.readingValue' WITH WRAPPER) AS read_value
正如我在对您的问题的评论中所解释的,如果您是从您发布的JSON中获得该结果,那么您没有使用
JSON_QUERY()
;您必须使用JSON\u VALUE()
。要么是这样,要么你还有别的东西没有和我们分享
在任何情况下,假设您使用的参数是JSON\u VALUE()
。您会问,如何修改路径,使顶级属性名不被硬编码。这很简单:使用星号(*
)而不是硬编码的名称。(这与JSON\u QUERY()
的工作原理相同-这是关于JSON路径的,而不是使用它们的特定函数。)
顺便说一句,这与您的问题没有任何关系:在JSON中,您有一个名为
“registers”
的具有单个属性的对象,其值是另一个具有单个属性“001”
的对象,反过来,这个对象有一个名为“register”
的属性,其值为“001”
。这对你有意义吗?这与我无关。对不起,我不相信你。值5295是JSON中的单个标量值JSON\u QUERY()
不返回此类值-它返回JSON片段。唯一的解决方法(除了使用不同的函数)是使用带有数组包装器的子句,但是输出将是'[“5295”]'
,而不是您报告的内容。事实上,您使用的是JSON\u VALUE()
,而不是JSON\u QUERY()
?是的,对不起,我指的是包装器。这对我最初发布的JSON区块来说很有吸引力,但是,我应该发布一个完整的区块,其中包含最初所需的多个值。我同意“001”没有任何意义,因为它已经在下面了。但是,我无法更改json,因为它来自一个实时系统。
with test_table (data) as (
select
'{
"59668509":{
"registers":{
"001":{
"isPlausible":false,
"deviceNumber":"40157471",
"register":"001",
"readingValue":"5295",
"readingDate":"2021-02-25T00:00:00.000Z"
}
}
}
}' from dual
)
select json_value (data, '$.*."registers"."001"."readingValue"'
returning number) as reading_value
from test_table
;
READING_VALUE
-------------
5295