Du ser ud til at ønske en krydssammenføjning af matrixværdierne (grupperet efter rownum
og name
). Dette er ikke en standard JSON-struktur, så du skal ikke forvente at kunne gøre dette med en enkelt applikation af json_table
.
Her er en måde at gøre dette på med to kald til json_table
. I det første opkald bruger du en indlejret sti til kun at få navnene, men du beholder stadig adresseopstillingerne. I et andet opkald pakker du adresserne ud, separat for hver række, der er produceret af det første opkald.
Bemærk brugen af et optimeringstip i den ydre select
. Dette er nødvendigt, for uden det vil optimeringsværktøjet forsøge en ulovlig "unnesting" af sideforbindelsen (outer apply
) og smid derefter en fejl i stedet for at forlade forespørgslen som den er. (Dette er en meget almindelig og irriterende vane hos optimizeren:den prøver noget, der er ugyldigt, og så klager den over det.)
Også rownum
er et reserveret søgeord - du kan ikke bruge det som kolonnenavn i outputtet. (Teknisk kan du, med ekstra arbejde, men det er bedst at tro, at du ikke kan.)
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 '$')
)
;
Output:
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