Как бы я использовал регулярное выражение для извлечения слов вне скобок в Oracle? - PullRequest
0 голосов
/ 04 октября 2019

Я хочу извлечь значение из скобок из столбца.

Запрос:

select dwn_notes from down_time;

Результат запроса:

4 hour scheduled downtime (dball, 01/04/2019 09:14)
4 hour scheduled downtime (dball, 01/04/2019 09:14)
4 hour scheduled downtime (dball, 01/04/2019 09:14)
4 hour scheduled downtime (dball, 01/04/2019 09:14)

Ответы [ 4 ]

1 голос
/ 05 октября 2019

это будет работать:

select regexp_replace(down_notes,'[(]{1}(.)*[)]{1}','') from Table1;

проверить скрипку: http://sqlfiddle.com/#!4/b52fd/6

1 голос
/ 04 октября 2019

Исходя из ваших примеров данных, вы можете просто использовать instr, чтобы найти первое открытое объединение, и вывести из него подстроку:

select dwn_notes,
substr(dwn_notes,1,instr(dwn_notes,'(') -1)
from
down_time

Fiddle

1 голос
/ 04 октября 2019

Вы можете использовать REGEXP_REPLACE() для захвата части строки перед скобками в группе и части после группы, а затем вернуть только эти группы. Убедитесь, что вы используете хороший набор тестовых данных, включая значения, которые вы не ожидаете.

with down_time(id, down_notes) as (
  select 1, '1 hour scheduled downtime (dball, 01/04/2019 09:14)' from dual union all
  select 2, '2 hour scheduled downtime (dball, 01/05/2019 09:14) with more text after' from dual union all
  select 3, '' from dual union all
  select 4, '(dball, 01/04/2019 09:14)' from dual union all
  select 5, '5 hour scheduled downtime' from dual
)
select id, trim(regexp_replace(down_notes, '^(.*?)\s*\(.*\)\s*(.*?)$', '\1 \2')) down_notes
from down_time;

Имейте в виду, что если REGEXP_REPLACE() не найдет совпадения, будет возвращена переданная строка. Это отличается от REGEXP_SUBSTR(), где он возвращает NULL, если не может найти совпадение. Возможно, вам придется учесть это в возвращаемых значениях.

0 голосов
/ 04 октября 2019

Для вашего случая достаточно, чтобы часть строки до открывающих скобок была достаточно:

select regexp_substr(dwn_notes,'([^\()])+') as dwn_notes
  from dwn_time;

Если вам нужно все, кроме паретезов, то подумайте:

select concat(
               regexp_substr(dwn_notes,'([^\(.*\))])+'), 
               regexp_substr(dwn_notes,'([^\(.*\))])+$')
              ) as dwn_notes
  from dwn_time;

Демо

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