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

PL/SQL का उपयोग करके CLOB फ़ील्ड से JSON डेटा को पार्स करना

CLOB आप जिस फ़ील्ड का उपयोग कर रहे हैं वह मान्य JSON नहीं है, इसलिए आप सीधे JSON फ़ंक्शन का उपयोग नहीं कर सकते। आपको JSON दस्तावेज़ से गुजरना होगा। और समझें कि कैसे एक जेसन को डेटाबेस तालिका में संग्रहीत किया जाना चाहिए ताकि उनका उपयोग करना आसान हो सके। आपके लिए एक समाधान यह होगा कि आप पहले अलग-अलग जोंस को पार्स करें और फिर JSON_OBJECT लागू करें। प्रत्येक जेसन पर। इसके अलावा, आपको एक PIVOT . की आवश्यकता होगी या एक MAX(CASE) पंक्तियों को कॉलम में बदलने के लिए ब्लॉक करें। यह क्वेरी Oracle 12c और इसके बाद के संस्करण में काम करती है।

नमूना डेटा

CREATE TABLE t AS 
  SELECT 1   AS id, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct" }, {   "key" : "PRODUCT_TYPE",   "value" : "Electronics" }, {   "key" : "PRODUCT_PRICE",   "value" : "123456789.1" }') AS j 
  FROM   dual 
  UNION ALL 
  SELECT 2, 
         To_clob('{   "key" : "PRODUCT_NAME",   "value" : "Myproduct2" }, {   "key" : "PRODUCT_TYPE",   "value" : "Chemical" }, {   "key" : "PRODUCT_PRICE",   "value" : "25637.1" }') 
  FROM   dual; 

क्वेरी

WITH jdt AS 
( 
       SELECT id, 
              JSON_VALUE(jsons,'$.key')   AS k,  -- gets the "key"
              JSON_VALUE(jsons,'$.value') AS v   -- gets the "value"
       FROM   ( 
                     SELECT id, 
                            REGEXP_SUBSTR(j,'(.*?)\}(,|$)',1,LEVEL,'n',1) 
                                   || '}' AS jsons --split the clob field into individual jsons
                     FROM   t 
                            CONNECT BY PRIOR id = id 
                     AND    PRIOR SYS_GUID() IS NOT NULL 
                     AND    LEVEL <= REGEXP_COUNT(j,'\}(,|$)') ) ) 
SELECT * 
FROM   jdt pivot ( max ( v ) FOR k IN ( 'PRODUCT_NAME', 
                                       'PRODUCT_TYPE', 
                                       'PRODUCT_PRICE' ) );

 ID PRODUCT_NAME PRODUCT_TYPE   PRODUCT_PRICE
 1  Myproduct    Electronics    123456789.1
 2  Myproduct2   Chemical       25637.1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. मैं ऐसे चरित्र का उपयोग करने में सक्षम क्यों हूं जो एक वर्णसेट (विंडोज़-1252) का हिस्सा नहीं है?

  2. कई Oracle ट्रिगर्स को समेकित करें। कोई प्रदर्शन प्रभाव?

  3. Oracle में एक महीने में दिनों की संख्या प्राप्त करने के 2 तरीके

  4. Oracle 12c में शर्तों के साथ अनुक्रमणिका कैसे बनाएं?

  5. नेटवर्क विफलता होने पर c3p0 getConnection पर हैंग हो जाता है