ऐसा लगता है कि आप सरणी मानों का क्रॉस जॉइन करना चाहते हैं (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