Oracle SQL JSON_查询忽略键字段

Oracle SQL JSON_查询忽略键字段,sql,json,oracle,Sql,Json,Oracle,我有一个json,其中几个键是一个数字,而不是一个固定的字符串。是否有任何方法可以绕过它们来访问嵌套值 { "55568509":{ "registers":{ "001":{ "isPlausible":false, "deviceNumber":"55501223",

我有一个json,其中几个键是一个数字,而不是一个固定的字符串。是否有任何方法可以绕过它们来访问嵌套值

{
   "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