sql >> Database teknologi >  >> RDS >> Oracle

Parse Json ved hjælp af Oracle SQL - JSON_TABLE

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

  1. Hvordan implementerer man pessimistisk låsning i en php/mysql-webapplikation?

  2. Hvordan konverteres datetime-streng uden skilletegn i SQL Server som datetime?

  3. Hvordan antyder man indekset, der skal bruges i en MySQL-valgsforespørgsel?

  4. SQLAlchemy DateTime tidszone