आप रेगुलर एक्सप्रेशन का उपयोग कर सकते हैं (([^(]*?(\(.*?\))?)*)(,|$)
मिलान करने के लिए:
[^(]*?
शून्य-या-अधिक (लेकिन जितना संभव हो उतना कम) गैर-उद्घाटन-कोष्ठक वर्ण(\(.*?\))?
फिर, वैकल्पिक रूप से, एक ओपनिंग ब्रैकेट और क्लोजिंग ब्रैकेट तक जितना संभव हो उतना कम वर्ण।( )*
कैप्चरिंग ग्रुप में लपेटा गया शून्य या अधिक बार दोहराया गया( )
संपूर्ण मिलान किए गए आइटम को संदर्भित करने में सक्षम होने के लिए एक कैप्चरिंग समूह में लपेटा गया(,|$)
इसके बाद कॉमा या एंड-ऑफ़-स्ट्रिंग।
इस तरह:
Oracle 11g R2 स्कीमा सेटअप :
CREATE TABLE table_name ( ID, Kategory ) AS
SELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)' FROM DUAL;
क्वेरी 1 :
SELECT ID,
l.COLUMN_VALUE AS item,
REGEXP_SUBSTR(
Kategory,
'(([^(]*?(\(.*?\))?)*)(,|$)',
1,
l.COLUMN_VALUE,
NULL,
1
) AS value
FROM table_name t
CROSS JOIN
TABLE(
CAST(
MULTISET(
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < REGEXP_COUNT( t.Kategory, '(([^(]*?(\(.*?\))?)*)(,|$)' )
)
AS SYS.ODCINUMBERLIST
)
) l
परिणाम :
| ID | ITEM | VALUE |
|----|------|-------------------------------------|
| 1 | 1 | ATD 5(2830) |
| 1 | 2 | ATO 4(510) |
| 1 | 3 | EDI 1 |
| 1 | 4 | EH A1 |
| 1 | 5 | SCI 2 |
| 1 | 6 | SS 1 |
| 1 | 7 | STO-SE 1(oral, CNS, blood) |
| 1 | 8 | STO-SE 2(oral, respiratory effects) |