Sie scheinen eine Kreuzverbindung der Array-Werte zu wünschen (gruppiert nach rownum
und name
). Dies ist keine standardmäßige JSON-Struktur, daher sollten Sie nicht erwarten, dass Sie dies mit einer einzigen Anwendung von json_table
tun können .
Hier ist eine Möglichkeit, dies mit zwei Aufrufen von json_table
zu tun . Beim ersten Aufruf verwenden Sie einen verschachtelten Pfad, um nur die Namen zu erhalten, behalten aber weiterhin die Adressarrays. Bei einem zweiten Aufruf entpacken Sie die Adressen separat für jede Zeile, die der erste Aufruf erzeugt hat.
Beachten Sie die Verwendung eines Optimierungshinweises im äußeren select
. Dies ist notwendig, da der Optimierer sonst ein illegales "Entschachteln" des lateralen Joins versuchen wird (outer apply
) und dann einen Fehler ausgeben, anstatt die Abfrage unverändert zu lassen. (Dies ist eine sehr häufige und lästige Angewohnheit des Optimierers:Er versucht etwas Ungültiges und beschwert sich dann darüber.)
Auch rownum
ist ein reserviertes Schlüsselwort – Sie können es nicht als Spaltennamen in der Ausgabe verwenden. (Technisch gesehen können Sie das mit zusätzlicher Arbeit, aber es ist am besten zu glauben, dass Sie es nicht können.)
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 '$')
)
;
Ausgabe:
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