Как извлечь текст из строки между 2 словами в Oracle - PullRequest
0 голосов
/ 02 ноября 2018

Я хотел бы получить текст между двумя словами из строки. GROUP TITLE находится между GROUP TITLE и DURATION Group Title: Goal Setting Duration: 60 minute Я хотел бы, чтобы результаты были в отдельном столбце и DURATION в другом столбце.

Я использую следующее, но это не соответствует позиции в строке, и я получаю часть дополнительного текста, когда я использую следующее

CASE WHEN A.NOTE_TEXT like 'Group Title:%' 
then SUBSTR(A.NOTE_TEXT,INSTR(A.NOTE_TEXT,'Group Title:',1),55) END AS GROUP_TITLE,*

Мои результаты будут выглядеть как

GROUP TITLE                   |  DURATION
Group Title: Goal Setting     |  Duration: 60 minutes      
Group Title: Mood Management  |  Duration: 90 minutes

Как я могу получить только текст для GROUP TITLE столбца от GROUP TITLE: TITLE OF GROUP REPORT до DURATION?

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

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018

Я считаю, что это то, что вы ищете. Регулярное выражение использует группу захвата, чтобы «запомнить», что находится между текстом привязки, и вернуть его.

SQL> with tbl(str) as (
     select 'Group Title: Goal Setting Duration: 60 minutes'    from dual union all
     select 'Group Title: Mood Management Duration: 90 minutes' from dual
   )
   select regexp_substr(str, 'Group Title:\s(.*?)\sDuration.*', 1, 1, NULL, 1) "GROUP TITLE",
          regexp_substr(str, '.*Duration:\s(.*?)( |$)', 1, 1, NULL, 1) "DURATION"
   from tbl;

GROUP TITLE        DURATION
-----------------  -----------------
Goal Setting       60 minutes
Mood Management    90 minutes

SQL>

РЕДАКТИРОВАТЬ Эти регулярные выражения ограничивают двоеточие только в случае изменения заголовков:

select regexp_substr(str, '.*:\s(.*?)\s.*:.*', 1, 1, NULL, 1) "GROUP TITLE",
       regexp_substr(str, '.*:\s(.*?)( |$)', 1, 1, NULL, 1) "DURATION"
from tbl;

ВНОВЬ РЕДАКТИРОВАТЬ Переходя к следующему шагу, если вы считаете, что это действительно просто строка с разделителями, а разделитель - пробел-слово-двоеточие-пробел, захватывайте и возвращайте 2-ю и 3-ю группы символов, за которыми следует пробел-слово-двоеточие или конец строки.

select regexp_substr(str, '(.*?)( \w+: |$)', 1, 2, NULL, 1) "GROUP TITLE",
       regexp_substr(str, '(.*?)( \w+: |$)', 1, 3, NULL, 1) "DURATION"
from tbl;
0 голосов
/ 02 ноября 2018

отлично сработало !!

SQL> with tbl(str) as (
     select 'Group Title: Goal Setting Duration: 60 minutes'    from dual union all
     select 'Group Title: Mood Management Duration: 90 minutes' from dual
   )
   select regexp_substr(str, 'Group Title:\s(.*?)\sDuration.*', 1, 1, NULL, 1) "GROUP TITLE",
          regexp_substr(str, '.*Duration:\s(.*?)( |$)', 1, 1, NULL, 1) "DURATION"
   from tbl;

GROUP TITLE        DURATION
-----------------  -----------------
Goal Setting       60 minutes
Mood Management    90 minutes

SQL>
0 голосов
/ 02 ноября 2018

Ниже запросов, чтобы получить заголовок группы и продолжительность отдельно:

 select regexp_substr(regexp_substr(regexp_replace ('Group Title: Goal Setting ------------ Duration: 60 minutes','\-+','-'),'[^-]+',1,1),'[^:]+',1,2)  "Group Title" from dual;

 select regexp_substr(regexp_substr(regexp_replace ('Group Title: Goal Setting ------------ Duration: 60 minutes','\-+','-'),'[^-]+',1,2),'[^:]+',1,2) "Duration" from dual;

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

select regexp_substr('Group Title: Discharge and Reintegration Duration: 60 minute','[^:]+',1,2) "Group Title" from dual

  select regexp_substr('Group Title: Discharge and Reintegration Duration: 60 minute','[^:]+',1,3)  "Group Title" from dual
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...