Нецелое начальное_положение в регулярном выражении PL / SQL - PullRequest
0 голосов
/ 01 июня 2018

Я объединил строки из 3 разных столбцов, например:

salary total 8140 Walter Davis
salary absolute 975004 Nathan Johns
monthly total 11 Emily Grand

Я хочу записать только имена из каждой строки.Проблема в том, что начальная позиция имен не одинакова, поэтому я не могу записать простое число в параметр начальной позиции в regexp_replace.

Итак, я хочу увидеть следующее:

Walter Davis
Nathan Johns
Emily Grand

Мой код:

select 
regexp_substr(concat(concat(e.column1, e.column2), e.column3), '\w+',1,'\d+\w')
from exampletable e

'\w+': С этим я хочу выписать все слова '\d+\w': Это было бы исходной позицией, на мой взгляд, это означает первый символ слова после цифр, который является первым символом имен.

Но я получаю следующие сообщения об ошибках: ORA-12801: ORA-01722

Заранее спасибо!

Ответы [ 4 ]

0 голосов
/ 01 июня 2018

Всегда ли имена последние, после одной или нескольких цифр?Если это так, то вы можете сделать что-то вроде следующего:

WITH x ( concat_str ) AS (
    SELECT 'salary total 8140 Walter Davis' FROM dual
     UNION ALL
    SELECT 'salary absolute 975004 Nathan Johns' FROM dual
     UNION ALL
    SELECT 'monthly total 11 Emily Grand' FROM dual
)
SELECT TRIM(REGEXP_SUBSTR(concat_str, '\D+$'))
  FROM x;

Возвраты:

Walter Davis
Nathan Johns
Emily Grand

РЕДАКТИРОВАТЬ: Просто К вашему сведению, нет никаких причин использовать функцию CONCAT() в Oracle - простоиспользуйте оператор конкатенации ||:

concat(concat(e.column1, e.column2), e.column3

==>

e.column1 || e.column2 || e.column3

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

0 голосов
/ 01 июня 2018

Попробуйте

regexp_replace(name,'\D+\d+(\D+)','\1')

\d+ - одна или несколько цифр

\D+ - одна или несколько не цифр

\1 - первая захваченная группав пределах ()

Демо

0 голосов
/ 01 июня 2018

Просто используйте regexp_replace

(основная точка интереса - цифры должны быть включены для разделения строки):

 create table exampletable( column_common varchar2(500) );

insert all 
        into exampletable values('salary total 8140 Walter Davis')
        into exampletable values('salary absolute 975004 Nathan Johns')
        into exampletable values('monthly total 11 Emily Grand')
 select * from dual;       

 select regexp_replace(column_common,'^(\D*)(\d*)') "Name"
   from exampletable;

Демонстрация SQL Fiddle

0 голосов
/ 01 июня 2018

Предполагая, что вы хотите получить часть строки, начинающуюся после уникального номера в строке, это может быть способ:

select regexp_substr(str, '([0-9])( +)(.*)', 1, 1, 'i', 3)
from (
    select 'salary total 8140 Walter Davis' str from dual union 
    select 'salary absolute 975004 Nathan Johns' from dual union 
    select 'monthly total 11 Emily Grand' from dual union 
    select 'monthly total XXX 11 John Smith' from dual 
)  

, который дает:

Emily Grand                                  
John Smith                                   
Nathan Johns                                 
Walter Davis 

Как это работает: разбивает строку на 3 части, определяемые следующим образом:

  • ([0-9]): цифра
  • ( +): один или несколько пробелов
  • (.*): что угодно

Параметр 3 используется для получения подстроки, которая соответствует третьему регулярному выражению.Это можно переписать по-разному, я считаю, что это достаточно ясно.

...