English 中文(简体)
Oracle REPLACE function - unsure how to use for my scenario
原标题:

I have a column called THE_VALUE in a table TABLE_A, that holds data similar to the following, i.e a few sample rows might be:

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

What I need to do to update this column using Oracle 10g sql and replace all commas, except the ones within the brackets with a colon, so basically, end result would be:

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

I also want to ensure that there are no spaces after the colons, after the update.

I ve tried using the replace function but I am unsure as to how not to include the commas within the brackets, as I don t want these changed to colons.

Thanks.

最佳回答

Here s a PL/SQL function I did on the quick:

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;

It outputs:

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

Try writing something similar using Oracle RegEx. I know I gave up.

问题回答

You can not do what you want with the REPLACE function. However you can try REGEXP_REPLACE function.

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

As a programmer joke says - now you have two problems :)





相关问题
Simple JAVA: Password Verifier problem

I have a simple problem that says: A password for xyz corporation is supposed to be 6 characters long and made up of a combination of letters and digits. Write a program fragment to read in a string ...

Case insensitive comparison of strings in shell script

The == operator is used to compare two strings in shell script. However, I want to compare two strings ignoring case, how can it be done? Is there any standard command for this?

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

String initialization with pair of iterators

I m trying to initialize string with iterators and something like this works: ifstream fin("tmp.txt"); istream_iterator<char> in_i(fin), eos; //here eos is 1 over the end string s(in_i, ...

break a string in parts

I have a string "pc1|pc2|pc3|" I want to get each word on different line like: pc1 pc2 pc3 I need to do this in C#... any suggestions??

Quick padding of a string in Delphi

I was trying to speed up a certain routine in an application, and my profiler, AQTime, identified one method in particular as a bottleneck. The method has been with us for years, and is part of a "...

热门标签