Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle SQL का उपयोग करके पार्स Json - JSON_TABLE

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL में स्तंभ जानकारी (समग्र कुंजी) प्राप्त करना

  2. प्रारंभिक संग्रह पीएल/एसक्यूएल का संदर्भ

  3. पंक्ति में त्रुटि:PL/SQL:SQL कथन पर ध्यान नहीं दिया गया। पैकेज बॉडी बनाते/बदलते समय

  4. जावा में कनेक्शन स्ट्रिंग पैरामीटर रखने के लिए कॉन्फ़िग फ़ाइल

  5. लारवेल और ओरेकल कनेक्शन