Oracle
 sql >> база данни >  >> RDS >> Oracle

Анализирайте Json с помощта на Oracle SQL - JSON_TABLE

Изглежда искате кръстосано свързване на стойностите на масива (групирани по 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 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle сравнява две различни дати

  2. Пример за състояние на Oracle IF

  3. Правилно използване на COALESCE в клаузата WHERE

  4. datanucleus + jpa + оракул. Странна грешка с несъществуващи таблици

  5. къде са DMS клас файловете на Oracle?