Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Analysieren Sie Json mit Oracle SQL - JSON_TABLE

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