在最后的“_”之后解析文本

Parsing out text after final "_"

我是一个 SQL 新手,正在尝试解决问题。我需要从一个字段中解析出一个名称,但该字段不是静态的,长度可能会有所不同。 我总是需要最后一个文本字段在最后一个 _

例如:

aaa_bbb_ccc_ddd   I need to return ddd
aaa_bbb_ccc       I need to return ccc

我一直在努力使用 regexpsubstr。有没有人对我如何完成这项工作有任何建议?提前致谢!

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