我连接了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
提前谢谢!
答案 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)
答案 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;
答案 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
希望这有帮助。