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