【问题标题】:how to delete words using REGEXP_REPLACE in Oracle如何在 Oracle 中使用 REGEXP_REPLACE 删除单词
【发布时间】:2021-10-05 10:33:47
【问题描述】:

我需要有关 Oracle 数据库上 REGEXP_REPLACE 的帮助。 我想从以下字符串中剪切到短语 [Teradata Database] 中的所有内容并保留其余部分,如果 [Teradata Database] 不在字符串中,则保持不变。

我试过用这种方法解决这个问题,可惜没用。

select TRIM(REGEXP_REPLACE('2021.07.29 13:45:36  ERR   GEOSPATIAL_LOCATOR_CBS.sql /mup/projects/IDM IDM   IdmLoadDetailLayer.sql  226   3706 42000 [Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER:Syntax error: expected something between '','' and '',''.', '.*(\[Teradata Database\] : .* [^.]+)')) AS ERROR_MESSAGE from dual;

正确结果:

[Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER: 语法错误:预期在 ',' 和 ',' 之间。

提前感谢您的帮助

【问题讨论】:

    标签: sql oracle regexp-replace


    【解决方案1】:

    你不需要正则表达式; substr + instr 做得很好。样本数据直到第 4 行,查询从第 5 行开始。

    SQL> with test (col) as
      2    (select q'{2021.07.29 13:45:36  ERR   GEOSPATIAL_LOCATOR_CBS.sql /mup/projects/IDM IDM   IdmLoadDetailLayer.sql  226   3706 4200
    0 [Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER:Syntax error: expected something between '
    ','' and '',''.'}'
      3     from dual
      4    )
      5  select substr(col, instr(col, '[Teradata Database]')) result
      6  from test;
    
    RESULT
    ----------------------------------------------------------------------------------------------------
    [Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER:Syntax er
    ror: expected something between '','' and '',''.'
    
    
    SQL>
    

    【讨论】:

      【解决方案2】:

      使用 Regexp_Replace,您需要扫描整个字符串作为匹配项,并仅对您希望保留的部分使用捕获组,如下所示:^.*?(mysequence.*)$ 使用您的 [Teradata Database] 序列,

      Regexp_Replace(biglongstring, '^.*?(\[Teradata Database\].*)$', '$1')
      

      指定捕获组的能力使 Regexp_Replace 成为一个特别强大的文本转换工具。

      【讨论】:

        【解决方案3】:

        但是你可以使用REGEXP_REPLACE()函数比如

        WITH t(error_message,ptr) AS
        (
          SELECT '2021.07.29 13:45:36  ERR   GEOSPATIAL_LOCATOR_CBS.sql /mup/projects/IDM IDM   IdmLoadDetailLayer.sql  226   3706 42000 [Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER:Syntax error: expected something between '','' and '',''.',
                 '[Teradata Database]' 
            FROM dual
        )  
        SELECT ptr||REGEXP_REPLACE(error_message,'(.*\'||ptr||')(.*)$','\2') AS extracted_str
          FROM t;
        
        EXTRACTED_STR
        ------------------------------------------------------------------------------------------------------------------------------------------------
        [Teradata Database] [TeraJDBC 17.10.00.14] [Error 3706] [SQLState 42000] IDM_UPSERT_FORMER:Syntax error: expected something between ',' and ','.
        

        Demo

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-05
          • 1970-01-01
          • 2020-04-25
          • 2016-08-31
          • 2019-04-05
          • 2016-02-11
          • 2021-03-22
          • 2019-01-18
          相关资源
          最近更新 更多