Oracle REPLACE函数 - 不确定如何使用我的场景

时间:2009-11-10 13:11:06

标签: sql oracle string oracle10g

我在表THE_VALUE中有一个名为TABLE_A的列,它包含类似于以下内容的数据,即一些示例行可能是:

tom:harry, sally, jeff
state(vic,nsw), england, qwerty(aaa,bbb, cccc):qaz

我需要做的是使用Oracle 10g sql更新此列并替换所有逗号,但括号内的逗号除了冒号,所以基本上,最终结果将是:

tom:harry:sally:jeff
state(vic,nsw):england:qwerty(aaa,bbb, cccc):qaz

我还想确保更新后冒号后面没有空格。

我已尝试使用replace函数,但我不确定如何不在括号中包含逗号,因为我不希望这些更改为冒号。

感谢。

3 个答案:

答案 0 :(得分:5)

使用REPLACE功能无法做到你想要的。但是,您可以尝试REGEXP_REPLACE函数。

http://www.regular-expressions.info/oracle.html

正如程序员的笑话所说 - 现在你有两个问题:)

答案 1 :(得分:3)

这是我在快速做的PL / SQL函数:

create or replace function fix_comma(str varchar2) return varchar2
is
   strLen smallint := length(str);
   cntPar smallint := 0;
   c char;
   strOut varchar2(4000) := '';
   lastWasComma boolean := false;
begin
   for i in 1..strLen loop
      c := substr(str, i, 1);
      if c = '(' then
         cntPar := cntPar + 1;
         lastWasComma := false;
      elsif c = ')' then
         if cntPar > 0 then
            cntPar := cntPar - 1;
         end if;
         lastWasComma := false;
      elsif cntPar = 0 and c = ',' then
         c := ':';
         lastWasComma := true;
      elsif cntPar = 0 and c = ' ' and lastWasComma then
         c := null;
      else
         lastWasComma := false;
      end if;

      strOut := strOut || c;
   end loop;
   return strOut;
end;

select fix_comma('state(vic,nsw), england, qwerty(aaa,bbb, cccc):qaz') from dual
union
select fix_comma('state(tik (vic,nsw) tok))),   england,   qwerty(aaa,  bbb, cccc):qaz') from dual;

输出:

state(vic,nsw):england:qwerty(aaa,bbb, cccc):qaz
state(tik (vic,nsw) tok))):england:qwerty(aaa,  bbb, cccc):qaz

尝试使用Oracle RegEx编写类似的东西。我知道我放弃了。

答案 2 :(得分:0)