SQL Regexp和PL / SQL更新语句

时间:2018-04-24 09:35:02

标签: sql regex oracle plsql sql-update

我目前面临以下问题:

在我的数据库中,我有不同的描述需要调整。因此,这些字符串可以有不同的形式:

Part 1 (ehem. 123) - Part 2 - [Part 3]
Part 1 (ehem. 123) - [Part 3]
Part1-Part1 (ehem 123) 

- >第1部分可能在单词中包含-,例如电子银行

我的目标是编写一个PL / SQL更新语句,确保右侧的所有内容都被修剪为(ehem.123)。因此,(ehem. 123)应该仍然显示,其余的在右侧修剪。或者,我想修剪右侧的所有内容,首先出现一个空格,然后是字符'-' - > ' -'

我的第一种方法是以下方法,它对第二种形式(即Part 1 (ehem. 123) - [Part 3]

完全正常
substr(regexp_substr(oct.descn, '.*\-'),1,length(regexp_substr(oct.descn, '.*\-'))-2)

但是,一旦我面对表单1或3(在字符串中间有一个'-'"part 1",它就不再有用了。

所以,问题如下:

  1. 我怎样才能确保,在任何情况下,我只会获得带有SQL reg表达式的字符串的这一部分? - > Part 1 (ehem. 123)

  2. 如何编写PL / SQL语句以便更新所有相关记录(id,descn)。我开始使用for循环,循环遍历所有相关的descn并更新它们。

1 个答案:

答案 0 :(得分:0)

(1)使用此正则表达式:

create table yytest(id number, descn varchar2(100));

insert into yytest values(1,'Part 1 (ehem. 123) - Part 2 - [Part 3]');
insert into yytest values(1,'Part 1 (ehem. 123) - [Part 3]');
insert into yytest values(1,'Part1-Part1 (ehem 123)');

select regexp_replace(descn, '\s-.*') from yytest;

这将导致

Part 1 (ehem. 123)
Part 1 (ehem. 123)
Part1-Part1 (ehem 123)

基本上,在regexp_replace中,它替换了由\s填充的空格-,后跟任何没有任何内容的.*(没有第三个参数)。

(2)对于更新,只需更新所有行:

update yytest set descn=regexp_replace(descn, '\s-.*');

如果您想限制更新次数,可能需要添加:

where descn != regexp_replace(descn, '\s-.*')

因此,只会更新需要更改的行;