首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >嵌套JSON的Oracle查询(具有重复字段名和动态多嵌套级别)

嵌套JSON的Oracle查询(具有重复字段名和动态多嵌套级别)
EN

Stack Overflow用户
提问于 2018-05-24 04:38:13
回答 1查看 2.8K关注 0票数 1

我有如下示例JSON,请注意"listOfItems“标签出现的次数是动态的,它可以是一个或多个孩子的,等等。JSON存储在CLOB列中,这只是帮助理解其结构的一个示例JSON。嵌套的层次是动态的,不同的JSON会有所不同。该表将有许多具有不同嵌套级别的行。我应该能够在所有行中搜索字段及其值,以找出匹配的行或每个输入中包含该元素及其值的行。

代码语言:javascript
复制
{
"id": 1000,
"version": 1,  
"number": "123456",
"type": "Y",
"itemName": "some name1",
"listOfItems": [
{
  "id": 2000,
  "version": 2,

  "number": "234567",
  "type": "Y",
  "itemName": "some name2",

  "listOfItems": [
    {
      "id": 3000,
      "version": 3,

      "number": "345678",
      "type": "Y",
      "itemName": "some name3",

      "listOfItems": [
        {
          "id": 4000,
          "version": 4,

          "number": "456789",
          "type": "N",
          "itemName": "some name2",

          "listOfItems": [
            {
              "id": 5000,
              "version": 5,

              "number": "567890",
              "type": "N",
              "itemName": "some name3",

              "listOfItems": [                    
              ]                  
            },
            {
              "id": 6000,
              "version": 6,

              "number": "678901",
              "type": "N",
              "itemName": "some name3",

              "listOfItems": [

              ]

            }                
          ]
        }
      ]
    }
  ]
}
]
}

Oracle版本是- Oracle数据库12c (12.1.0.2.0)要求从所有嵌套级别创建一个包含所有可用子字段及其值的视图。因此,稍后我们可以查询此视图,以确定在给定的JSON中是否存在具有字段值或名称等的项。

EN

回答 1

Stack Overflow用户

发布于 2018-05-24 17:19:47

NESTED PATH与递归子查询因子句一起使用:

Oracle12安装

代码语言:javascript
复制
CREATE TABLE t (
  value CLOB
  CONSTRAINT ensure_json CHECK( value IS JSON )
);

INSERT INTO t VALUES ( '{"id":1000,"version":1,"number":"123456","type":"Y","itemName":"some name1","listOfItems":[{"id":2000,"version":2,"number":"234567","type":"Y","itemName":"some name2","listOfItems":[{"id":3000,"version":3,"number":"345678","type":"Y","itemName":"some name3","listOfItems":[{"id":4000,"version":4,"number":"456789","type":"N","itemName":"some name2","listOfItems":[{"id":5000,"version":5,"number":"567890","type":"N","itemName":"some name3","listOfItems":[]},{"id":6000,"version":6,"number":"678901","type":"N","itemName":"some name3","listOfItems":[]}]}]}]}]}' );

查询

代码语言:javascript
复制
WITH data ( parent, id, version, "number", "type", itemName, child ) AS (
  SELECT DISTINCT
         NULL,
         j.id,
         j.version,
         j."number",
         j."type",
         j.itemName,
         j.child
  FROM   t,
         JSON_TABLE(
           t.value,
           '$'
           COLUMNS (
             id       NUMBER       PATH '$.id',
             version  VARCHAR2(20) PATH '$.version',
             "number" VARCHAR2(20) PATH '$.number',
             "type"   VARCHAR2(20) PATH '$.type',
             itemName VARCHAR2(20) PATH '$.itemName',
             child    VARCHAR2(4000) FORMAT JSON PATH '$.listOfItems'
           )
         ) j
UNION ALL
  SELECT d.id,
         k.id,
         k.version,
         k."number",
         k."type",
         k.itemName,
         k.child
  FROM   data d,
         JSON_TABLE(
           d.child,
           '$'
           COLUMNS (
             NESTED PATH '$[*]'
               COLUMNS (
                 id       NUMBER       PATH '$.id',
                 version  VARCHAR2(20) PATH '$.version',
                 "number" VARCHAR2(20) PATH '$.number',
                 "type"   VARCHAR2(20) PATH '$.type',
                 itemName VARCHAR2(20) PATH '$.itemName',
                 child    VARCHAR2(4000) FORMAT JSON PATH '$.listOfItems'
               )
           )
         ) k
  WHERE d.child IS NOT NULL
  AND   d.child <> '[]'
)
SELECT parent,
       id,
       version,
       "number",
       "type",
       itemName
FROM   data;

结果

代码语言:javascript
复制
PARENT   ID VERSION number type ITEMNAME
------ ---- ------- ------ ---- ----------
(NULL) 1000       1 123456    Y some name1
  1000 2000       2 234567    Y some name2
  2000 3000       3 345678    Y some name3
  3000 4000       4 456789    N some name2
  4000 5000       5 567890    N some name3
  4000 6000       6 678901    N some name3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50497107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档