Oracle
 sql >> Base de données >  >> RDS >> Oracle

Analyser Json à l'aide d'Oracle SQL - JSON_TABLE

Vous semblez vouloir une jointure croisée des valeurs du tableau (regroupées par rownum et name ). Ce n'est pas une structure JSON standard, vous ne devriez donc pas vous attendre à pouvoir le faire avec une seule application de json_table .

Voici une façon de le faire avec deux appels à json_table . Lors du premier appel, vous utilisez un chemin imbriqué pour obtenir uniquement les noms, mais vous conservez toujours les tableaux d'adresses. Lors d'un deuxième appel, vous décompressez les adresses, séparément pour chaque ligne produite par le premier appel.

Notez l'utilisation d'un indice d'optimisation dans le select externe . Ceci est nécessaire, car sans cela, l'optimiseur tentera un "désimbrication" illégal de la jointure latérale (outer apply ) puis génère une erreur, au lieu de laisser la requête telle quelle. (C'est une habitude très courante et ennuyeuse de l'optimiseur :il essaie quelque chose qui n'est pas valide, puis il s'en plaint.)

Aussi, rownum est un mot-clé réservé - vous ne pouvez pas l'utiliser comme nom de colonne dans la sortie. (Techniquement, vous pouvez, avec du travail supplémentaire, mais il vaut mieux croire que vous ne pouvez pas.)

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 '$')
     )
;

Sortie :

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