我有以下 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 | 卡车 | 闪避 | 蓝色 |
如何优化查询以返回预期结果?
您必须返回与产品相同级别的(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