Можете да използвате регулярния израз (([^(]*?(\(.*?\))?)*)(,|$)
за съвпадение:
[^(]*?
Нула или повече (но възможно най-малко) знаци в неотварящи скоби(\(.*?\))?
След това, по избор, отваряща скоба и възможно най-малко знаци до затварящата скоба.( )*
Обвити в група за улавяне, повторени нула или повече пъти( )
Обвити в група за улавяне, за да можете да препращате към целия съответстващ елемент(,|$)
Следва или запетая, или края на низа.
Като това:
Настройка на схема на Oracle 11g R2 :
CREATE TABLE table_name (ID, Category) ASSELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(орално, CNS , кръв),STO-SE 2 (орални, респираторни ефекти)' ОТ DUAL;
Заявка 1 :
SELECT ID, l.COLUMN_VALUE AS елемент, REGEXP_SUBSTR( Категория, '(([^(]*?(\(.*?\))?)*)(,|$)', 1, l.COLUMN_VALUE, NULL, 1 ) AS valueFROM table_name t CROSS JOIN TABLE( CAST( MULTISET( SELECT LEVEL FROM DUAL CONNECT BY LEVEL
<предварителен код>| ID | АРТИКУЛ | СТОЙНОСТ ||----|------|---------------------------------- --|| 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 (орално, ЦНС, кръв) || 1 | 8 | STO-SE 2 (орални, респираторни ефекти) |