regexp_substr PL / SQL中的非整数starting_position

时间:2018-06-01 13:36:47

标签: sql regex oracle regexp-substr

我连接了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 :(得分:0)

假设您希望在字符串中的唯一编号之后开始字符串的一部分,这可能是一种方式:

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用于获取与第三个正则表达式匹配的子字符串。 这可以用不同的方式重写,我相信这个很清楚。

答案 1 :(得分:0)

尝试

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

\d+ - 一个或多个数字

\D+ - 一个或多个非数字

\1 - ()

中首先捕获的群组

Demo

答案 2 :(得分:0)

只需使用 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 Demo

答案 3 :(得分:0)

姓名是否总是持续一个或多个数字?如果是这样,那么您可以执行以下操作:

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

编辑:仅供参考,没有理由在Oracle中使用CONCAT()函数 - 只需使用连接运算符||

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

==>

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

希望这有帮助。