【问题标题】:PLSQL: delete patterns in a stringPLSQL:删除字符串中的模式
【发布时间】:2013-06-07 16:38:11
【问题描述】:

我得到一个像这样的动态字符串(其中一种情况):

'DISTINCT type,NULL,DECODE(java_api_name,NULL,initlower(process(object_name)))
,NULL,field_description,NULL,NULL'

我想删除字符串中的“,NULL”,除了 DECODE 函数中的那个。这是我想要的结果:

'DISTINCT type,DECODE(java_api_name,NULL,initlower(process(object_name)))
,field_description'

更新:这只是一个例子,规则应该是这样的:删除不在任何大括号中的 NULLs

我怎么能得到这个?越简单越好。

【问题讨论】:

  • 您想更改文件中的代码或触发器中的代码?你在什么操作系统上?
  • @jimmcnamara 在 PLSQL 过程中。 Oralce 10g,我认为它与操作系统无关。谢谢
  • 如果您正在运行 bash 脚本以使用 sed 更正 .sql 脚本。您想更改代码。代码现在在哪里?在文件/程序或数据库中。由于给出的答案都没有涉及实际更改的代码,这就是您所展示的,因此很高兴知道您真正想要什么。
  • @jimmcnamara 不在 bash 脚本中,它在 PL/SQL 包中,想起来简单,只要给你这个字符串作为输入,请实现一个函数返回我想要的字符串。谢谢。

标签: regex string oracle plsql


【解决方案1】:

这可能对你有用:

SELECT 
    REGEXP_SUBSTR(line,
              '(.*\){3})')||
    REPLACE(SUBSTR(line,
            LENGTH(
            REGEXP_SUBSTR(line,
              '(.*\){3})'))),',NULL','')
FROM mystring;

你可以在这里看到它的实际效果:http://sqlfiddle.com/#!4/288a4/13/0

这首先提取以 3 )s 结尾的部分。然后在字符串的另一部分替换每次出现的,NULL

注意: 这可能不是最完美的解决方案,它可能会使用更好的正则表达式(如前瞻和/或后瞻)来完成。如果您的字符串包含出现 3 ) 的其他部分,它可能会失败。

【讨论】:

    【解决方案2】:

    当您要求 pl/sql-stuff 时,这可能会对您有所帮助:

    declare
      s varchar(100);
      dec varchar(100);
      rem varchar(100);
    begin
      s:='DISTINCT DECODE(java_api_name,NULL,initlower(process(object_name))),NULL,field_description,NULL,NULL';
      dec:=regexp_replace (s, '(DISTINCT DECODE\(.*\)).*', '\1');
      rem:=regexp_replace (s, '.*(DECODE\(.*\))(.*)', '\2');
      rem:=regexp_replace (rem, ',NULL', '');
      dbms_output.put_line('whatYouWant='||dec||rem);
    end;
    

    结果如下:

    whatYouWant=DISTINCT DECODE(java_api_name,NULL,initlower(process(object_name))),field_description
    

    【讨论】:

    • 谢谢你的回答,我刚刚更新了我的问题,你能再检查一下吗?谢谢。
    【解决方案3】:
    SELECT  REGEXP_REPLACE(str, ',NULL', NULL, INSTR(str, 'NULL', 1) + 5) AS new_string
    FROM
    (
            SELECT  'DISTINCT DECODE(java_api_name,NULL,initlower(process(object_name))),NULL,field_description,NULL,NULL' AS str
            FROM    DUAL
    )
    

    结果:

    DISTINCT DECODE(java_api_name,NULL,initlower(process(object_name))),field_description
    

    【讨论】:

    • 大括号内不需要第一个NULL,'DECODE'之前可能有一个NULL
    • 不要更改要求。我从您的示例中复制了字符串。下次决定你想要什么。
    猜你喜欢
    • 2016-05-31
    • 1970-01-01
    • 2014-10-31
    • 2014-03-15
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    相关资源
    最近更新 更多