Anda sepertinya menginginkan gabungan silang dari nilai array (dikelompokkan berdasarkan rownum
dan name
). Ini bukan struktur JSON standar, jadi Anda seharusnya tidak berharap dapat melakukan ini dengan satu aplikasi json_table
.
Berikut adalah salah satu cara untuk melakukan ini dengan dua panggilan ke json_table
. Pada panggilan pertama, Anda menggunakan jalur bersarang untuk mendapatkan nama saja, tetapi Anda masih menyimpan larik alamat. Dalam panggilan kedua, Anda membongkar alamat, secara terpisah untuk setiap baris yang dihasilkan oleh panggilan pertama.
Perhatikan penggunaan petunjuk pengoptimal di select
luar . Ini diperlukan, karena tanpanya pengoptimal akan mencoba "unnesting" ilegal dari gabungan lateral (outer apply
) dan kemudian melontarkan kesalahan, alih-alih membiarkan kueri apa adanya. (Ini adalah kebiasaan pengoptimal yang sangat umum dan menjengkelkan:ia mencoba sesuatu yang tidak valid, lalu mengeluhkannya.)
Juga, rownum
adalah kata kunci yang dicadangkan - Anda tidak dapat menggunakannya sebagai nama kolom di output. (Secara teknis Anda bisa, dengan pekerjaan tambahan, tetapi yang terbaik adalah percaya bahwa Anda tidak bisa.)
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 '$')
)
;
Keluaran:
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