如何在oracle中将json数组转换为关系数据

问题描述 投票:0回答:1

我有以下 json 数组,它是 json 文件的一部分,我尝试使用

json_table
函数将其转换为 Oracle 中的关系数据:

{ "Id" : "XXX000", 
        "elements":[
      {
         "product":{
            "prodName":"Car",
            "prodCode":"CR"
         },
         "components":[
            {
               "compName":"Toyota",
               "compCode":"BRND" 
            },
            {
               "compName":"Red",
               "compCode":"CLR"
            }
         ]
      },
      {
         "product":{
            "prodName":"Truck",
            "prodCode":"TRCK"
         },
         "components":[
            {
               "compName":"Dodge",
               "compCode":"BRND"
            },
            {
               "compName":"Blue",
               "compCode":"CLR" 
            }
         ]
      }
   ]}

这是我用来执行转换部分的查询:

select id, 
       prdct,
       case when code = 'BRND' then val
       else '' 
       end as brnd,
       case when code = 'CLR' then val
       else '' 
       end as clr
from ary,
     json_table(car, '$'
                columns (
                          id path  '$.Id',
                          nested path '$.elements.product[*]' columns (
                                                                          prdct path  '$.prodName'
                                                                        ),
                          nested path '$.elements.components[*]' columns (
                                                                        val  path  '$.compName',
                                                                        code  path  '$.compCode'
                                                                       )
                        )
               );

我得到的结果:

但是,预期的结果应该是:

身份证 PRDCT BRND CLR
XXX000 汽车 丰田 红色
XXX000 卡车 闪避 蓝色

如何优化查询以返回预期结果?

sql arrays oracle data-conversion json-table
1个回答
0
投票

您必须返回与产品相同级别的(val,code),然后PIVOT。

select * from (
    select id, 
           prdct,
           val, code
    from ary,
         json_table(car, '$'
            columns (
              id path  '$.Id',
              nested path '$.elements[*]' columns (
                prdct path  '$.product.prodName',
                nested path '$.components[*]' columns (
                    val  path  '$.compName',
                    code  path  '$.compCode'
                )
            )
        )
    )
)
pivot(
    max(val) for code in ('BRND' as brnd, 'CLR' as clr)
);

XXX000  Truck   Dodge   Blue
XXX000  Car     Toyota  Red

    
© www.soinside.com 2019 - 2024. All rights reserved.