Извлечение строковой части с использованием регулярных выражений в Oracle - PullRequest
0 голосов
/ 18 сентября 2018

enter image description here

enter image description here

У меня есть требование, когда мне нужно извлечь определенную часть из значения столбца.

Обзор: проект BAN27: содержание BAN27S001: отклонение

Теперь в приведенном выше тексте мне нужна только часть BAN27S001 в новом столбце.Единственный общий фактор, который у меня есть - это часть строки (например, BAN27), доступная в другом столбце.Теперь я пытаюсь извлечь BAN27S001, используя столбец с BAN27 в качестве значения.Можем ли мы реализовать это в Oracle с помощью регулярных выражений ... Пожалуйста, предложите, если есть какой-либо другой способ добиться этого.

Не могли бы вы помочь мне в извлечении строки.

Спасибо Сан

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

этот запрос идентифицирует данные colb, которые похожи на ColA + 'S'

SELECT 
      REGEXP_SUBSTR (colb, '[^ ]+', 1,
      (case  
       when REGEXP_SUBSTR(colb, '[^ ]+', 1, 1) like '%'|| cola||'S%' then 1 
       when REGEXP_SUBSTR(colb, '[^ ]+', 1, 2) like '%'|| cola||'S%' then 2 
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 3) like '%'|| cola||'S%' then 3
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 4) like '%'|| cola||'S%' then 4  
      when REGEXP_SUBSTR(colb, '[^ ]+', 1, 5) like '%'|| cola||'S%' then 5 
     when REGEXP_SUBSTR(colb, '[^ ]+', 1, 6) like '%'|| cola||'S%' then 6
     end) )
FROM tname ;
0 голосов
/ 18 сентября 2018

Вы можете использовать [:alnum:] для обнаружения буквенно-цифровой части , как в следующем примере:

with t(colA,colB) as
(
 select 'BAN27', 'Review: Project BAN27: Content BAN27S001: Deviation' from dual union all
 select 'BAN28', 'Review: Project BAN28: Content BAN28S002: Bio' from dual 
)
select colA,
       regexp_substr(colB,colA||'([[:alnum:]]+\.?)') as "Substring"
  from t;

COLA    Substring
-----   ---------
BAN27   BAN27S001
BAN28   BAN28S002

Rextester Demo 1

Редактировать: Что касается вашего последнего комментария, то если рассматривать последние три строки, вы можете использовать следующую выдержку:

with t(colA,colB) as
(
 select '177', '177-130/ data continue to be collected' from dual union all
 select '177', '177-131 /log accordingly' from dual union all
 select '524', '524 - 23 & get these resolved' from dual    
)
select colA, nvl( regexp_substr(colB,colA||'(\-[[:digit:]]+)'),
                  regexp_substr(colB,colA||'([[:space:]]\-[[:space:]][[:digit:]]+)')) "Substring"
  from t;

COLA    Substring
-----   ---------
177     177-130
177     177-131
524     524 - 23

Rextester Demo 2

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