我目前面临以下问题:
在我的数据库中,我有不同的描述需要调整。因此,这些字符串可以有不同的形式:
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"
,它就不再有用了。
所以,问题如下:
我怎样才能确保,在任何情况下,我只会获得带有SQL reg表达式的字符串的这一部分?
- > Part 1 (ehem. 123)
如何编写PL / SQL语句以便更新所有相关记录(id,descn)。我开始使用for循环,循环遍历所有相关的descn并更新它们。
答案 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-.*')
因此,只会更新需要更改的行;