SQL для извлечения строки между фигурными скобками (может быть несколько фигурных скобок) - PullRequest
0 голосов
/ 13 сентября 2011

У меня есть следующие данные столбца

NZ(abc_mode) / (NZ(bch_mode) + NZ(cdh_mode))

Теперь мне нужен запрос для извлечения строки внутри фигурных скобок NZ () с использованием или без использования регулярных выражений в SQL.

Выход должен быть

abc_mode
bch_mode
cdh_mode

1 Ответ

2 голосов
/ 13 сентября 2011

Это далеко не элегантно, но вернет желаемые результаты:

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.

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...