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