0

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

'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'

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

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

4

3 回答 3

0

这可能对您有用:

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 的其他部分,它可能会失败。

于 2013-06-07T20:40:04.920 回答
0

当您要求 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
于 2013-06-07T20:41:21.157 回答
-1
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
于 2013-06-07T21:04:39.293 回答