Có vẻ như bạn muốn kết hợp chéo các giá trị mảng (được nhóm theo rownum
và name
). Đây không phải là cấu trúc JSON tiêu chuẩn, vì vậy bạn không nên mong đợi có thể thực hiện điều này với một ứng dụng duy nhất của json_table
.
Đây là một cách để thực hiện việc này với hai lệnh gọi tới json_table
. Trong lần gọi đầu tiên, bạn sử dụng một đường dẫn lồng nhau để chỉ lấy tên, nhưng bạn vẫn giữ các mảng địa chỉ. Trong cuộc gọi thứ hai, bạn giải nén các địa chỉ, riêng biệt cho từng hàng được tạo bởi cuộc gọi đầu tiên.
Lưu ý việc sử dụng gợi ý trình tối ưu hóa trong select
bên ngoài . Điều này là cần thiết, bởi vì nếu không có nó, trình tối ưu hóa sẽ thử "unnesting" bất hợp pháp của liên kết bên (outer apply
) và sau đó đưa ra một lỗi, thay vì để nguyên truy vấn. (Đây là một thói quen rất phổ biến và khó chịu của trình tối ưu hóa:nó thử một thứ gì đó không hợp lệ, và sau đó nó phàn nàn về điều đó.)
Ngoài ra, rownum
là một từ khóa dành riêng - bạn không thể sử dụng nó làm tên cột trong đầu ra. (Về mặt kỹ thuật, bạn có thể, với công việc bổ sung, nhưng tốt nhất là bạn nên tin rằng bạn không thể.)
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 '$')
)
;
Đầu ra:
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