Изглежда искате кръстосано свързване на стойностите на масива (групирани по rownum
и name
). Това не е стандартна JSON структура, така че не трябва да очаквате да можете да направите това с едно приложение на json_table
.
Ето един начин да направите това с две извиквания към json_table
. При първото извикване използвате вложен път, за да получите само имената, но все пак запазвате адресните масиви. При второ извикване разопаковате адресите поотделно за всеки ред, получен от първото извикване.
Обърнете внимание на използването на съвет за оптимизатор във външния select
. Това е необходимо, тъй като без него оптимизаторът ще опита незаконно "отстраняване" на страничното съединение (outer apply
) и след това извежда грешка, вместо да остави заявката такава, каквато е. (Това е много често срещан и досаден навик на оптимизатора:той опитва нещо, което е невалидно, и след това се оплаква от него.)
Освен това rownum
е запазена ключова дума - не можете да я използвате като име на колона в изхода. (Технически можете, с допълнителна работа, но най-добре е да вярвате, че не можете.)
with
t as (
select *
from json_Table(
'{
"Rownum": "1",
"Name": "John",
"AddressArray":["Address1", "Address2"],
"TextObj":[{"mName" : "Carol","lName" : "Cena"},
{"mName" : "Mark","lName" : "Karlo"}
]
}',
'$' columns (
rownr number path '$.Rownum',
name varchar2(100) path '$.Name',
addressArray varchar2(4000) format json path '$.AddressArray',
nested path '$.TextObj[*]'
columns (mName varchar2(100) path '$.mName',
lName varchar2(100) path '$.lName'
)
)
)
)
select /*+ no_query_transformation */ rownr, name, mname, lname, address
from t
outer apply
json_table (t.addressArray, '$[*]'
columns (address varchar2(10) path '$')
)
;
Изход:
ROWNR NAME MNAME LNAME ADDRESS
----- ------ ------ ------ ----------
1 John Carol Cena Address1
1 John Carol Cena Address2
1 John Mark Karlo Address1
1 John Mark Karlo Address2