在最后的“_”之后解析文本
Parsing out text after final "_"
我是一个 SQL 新手,正在尝试解决问题。我需要从一个字段中解析出一个名称,但该字段不是静态的,长度可能会有所不同。 我总是需要最后一个文本字段在最后一个 _
例如:
aaa_bbb_ccc_ddd I need to return ddd
aaa_bbb_ccc I need to return ccc
我一直在努力使用 regexp
和 substr
。有没有人对我如何完成这项工作有任何建议?提前致谢!
DB 是 Oracle,以防有我不知道的特定功能。
在 Oracle 中,REGEXP_SUBSTR 函数应该提供您所需要的
正则表达式类似于 [^_]+$
(字符串末尾有 1 个或多个 none 下划线字符)
您可以同时使用 INSTR 和 SUBSTR 来获得您想要的结果:
strLast_name := SUBSTR(SOME_FIELD, INSTR(SOME_FIELD, '_', -1)+1);
如果 SOME_FIELD
包含“aaa_bbb_ccc_ddd”, 将 return 'ddd'。
祝你好运。
您可以通过两种方式解决这个问题:
输入测试table:
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
select * from PERSONS;
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (1,'a_rbit_aaa',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (2,'t_obt_bbb',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (3,'t_co_mp_ccc',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (4,'t_d_or_ddd',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (5,'cramp_123',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (6,'p_o_d_abc',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (7,'123_abc_uvw_xyz',null,null,null);
commit;
1)子串方式:
这对你的情况更好,因为我们不需要提取模式 and/or 使用反向引用和操作字符串。正则表达式方法会减慢您的查询速度并消耗更多 memory/cpu.
select substr(lastname, Instr(lastname, '_',-1) +1)from PERSONS;
结果:
aaa
bbb
ccc
ddd
123
abc
xyz
2) 正则表达式方法:
只是为了学习目的和乐趣,让我介绍一下正则表达式方法(对于您的特定情况不是必需的),您可以选择使用 regex_substr
从字符串中提取您需要的部分,或者这样做另一种方法:删除字符串中不需要的所有内容。
select regexp_substr(lastname, '[^_]+$')from PERSONS; --the regex will fetch only the non underscore characters at the end of the string
或
select regexp_replace(lastname, '^(:?[^_]*_)*', '')from PERSONS; --remove every block of non underscore char followed by one underscore, till will keep only the last non underscore part as is
对于两者,结果:
aaa
bbb
ccc
ddd
123
abc
xyz
我是一个 SQL 新手,正在尝试解决问题。我需要从一个字段中解析出一个名称,但该字段不是静态的,长度可能会有所不同。 我总是需要最后一个文本字段在最后一个 _
例如:
aaa_bbb_ccc_ddd I need to return ddd
aaa_bbb_ccc I need to return ccc
我一直在努力使用 regexp
和 substr
。有没有人对我如何完成这项工作有任何建议?提前致谢!
DB 是 Oracle,以防有我不知道的特定功能。
在 Oracle 中,REGEXP_SUBSTR 函数应该提供您所需要的
正则表达式类似于 [^_]+$
(字符串末尾有 1 个或多个 none 下划线字符)
您可以同时使用 INSTR 和 SUBSTR 来获得您想要的结果:
strLast_name := SUBSTR(SOME_FIELD, INSTR(SOME_FIELD, '_', -1)+1);
如果 SOME_FIELD
包含“aaa_bbb_ccc_ddd”,将 return 'ddd'。
祝你好运。
您可以通过两种方式解决这个问题:
输入测试table:
CREATE TABLE Persons (
PersonID int,
LastName varchar(255),
FirstName varchar(255),
Address varchar(255),
City varchar(255)
);
select * from PERSONS;
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (1,'a_rbit_aaa',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (2,'t_obt_bbb',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (3,'t_co_mp_ccc',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (4,'t_d_or_ddd',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (5,'cramp_123',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (6,'p_o_d_abc',null,null,null);
insert into PERSONS(PersonID,LastName,FirstName,Address,City) values (7,'123_abc_uvw_xyz',null,null,null);
commit;
1)子串方式:
这对你的情况更好,因为我们不需要提取模式 and/or 使用反向引用和操作字符串。正则表达式方法会减慢您的查询速度并消耗更多 memory/cpu.
select substr(lastname, Instr(lastname, '_',-1) +1)from PERSONS;
结果:
aaa
bbb
ccc
ddd
123
abc
xyz
2) 正则表达式方法:
只是为了学习目的和乐趣,让我介绍一下正则表达式方法(对于您的特定情况不是必需的),您可以选择使用 regex_substr
从字符串中提取您需要的部分,或者这样做另一种方法:删除字符串中不需要的所有内容。
select regexp_substr(lastname, '[^_]+$')from PERSONS; --the regex will fetch only the non underscore characters at the end of the string
或
select regexp_replace(lastname, '^(:?[^_]*_)*', '')from PERSONS; --remove every block of non underscore char followed by one underscore, till will keep only the last non underscore part as is
对于两者,结果:
aaa
bbb
ccc
ddd
123
abc
xyz