regexp_substr PL / SQL 中的非整数 starting_position

Non-integer starting_position in regexp_substr PL / SQL

我连接了来自 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

提前致谢!

假设你想获取字符串中唯一编号之后开始的部分,这可能是一种方法:

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用于获取匹配第三个正则表达式的子串。 这个可以改写成不同的方式,我相信这个已经够清楚了。

尝试

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

\d+ - 一个或多个数字

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

</code> - <code>()

中的第一个捕获组

Demo

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

名字总是最后一位或多位数字吗?如果是这样,那么您可以执行以下操作:

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;

Returns:

Walter Davis
Nathan Johns
Emily Grand

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

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

==>

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

希望这对您有所帮助。