Это далеко не элегантно, но вернет желаемые результаты:
WITH t1
AS (SELECT RTRIM(
REGEXP_REPLACE('NZ(abc_mode) / (NZ(bch_mode) + NZ(cdh_mode)) ',
'([^[:alpha:]]{0,})(\({0,}NZ\()(([[:alpha:]]|\_){1,})(\){1,} {0,})',
'\3,'),
',') AS str
FROM dual)
SELECT val
FROM t1,
XMLTABLE( '/root/e/text()'
PASSING xmltype( '<root><e>' ||
REPLACE( t1.str, ',', '</e><e>' ) ||
'</e></root>' )
COLUMNS val VARCHAR2( 10 ) PATH '/'
)
Обратите внимание, что я использовал 'NZ (abc_mode) / (NZ (bch_mode) + NZ (cdh_mode))' каклитерал, вам нужно заменить его именем столбца, содержащим строку, и заменить «двойным» на таблицу, содержащую столбец и т. д.
Поскольку это беспорядок, я выделю его для вас:Предложение WITH устанавливает данные для SELECT
WITH t1
AS (<SQL STATEMENT>)
. REGEXP_REPLACE:
REGEXP_REPLACE('NZ(abc_mode) / (NZ(bch_mode) + NZ(cdh_mode)) ',
'([^[:alpha:]]{0,})(\({0,}NZ\()(([[:alpha:]]|\_){1,})(\){1,} {0,})',
'\3,')
Принимает строку и выполняет поиск (разделы шаблона в скобках):
(Раздел 1) ни один или несколько не альфа-символов
(Раздел 2) ни один или несколько скобок в строке "NZ ("
(Раздел 3) один или несколько символов алфавита или подчеркивания
(Раздел 4) одна или несколько заключительных скобок, за которыми не должно быть ни одного или нескольких пробелов
Затем он заменяет сопоставленный шаблон тем, что был идентифицирован в разделе 3, и к нему добавляется запятая.
Все еще со мной? Хорошо ...
Результат REGEXru TRIMMED для удаления запятой.
RTRIM(<regex_result>, ',')
Результатом всего этого является псевдоним "str" (хотя, возможно, вы захотите дать ему более описательное имя).
The str"значение затем разделяется на столбцы, разделяя запятую основным оператором SELECT.
Надеюсь, это поможет ...