【问题标题】:SQL Regexp and PL/SQL Update StatementSQL Regexp 和 PL/SQL 更新语句
【发布时间】:2023-04-01 02:59:01
【问题描述】:

我目前面临以下问题:

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

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 循环开始,遍历所有相关的 decn 并更新这些。

【问题讨论】:

    标签: sql regex oracle plsql sql-update


    【解决方案1】:

    (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-.*')
    

    所以只有需要更改的行才会被更新;

    【讨论】:

      猜你喜欢
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多