Функция Oracle REPLACE - не знаете, как использовать для моего сценария - PullRequest
3 голосов
/ 10 ноября 2009

У меня есть столбец с именем 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 ]

5 голосов
/ 10 ноября 2009

Вы не можете делать то, что хотите, с помощью функции ЗАМЕНА. Однако вы можете попробовать функцию REGEXP_REPLACE.

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

Как говорит шутка программиста - теперь у вас две проблемы :)

3 голосов
/ 11 ноября 2009

Вот функция 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. Я знаю, что сдался.

0 голосов
/ 10 ноября 2009

Похоже, вам может понадобиться регулярное выражение для ваших нужд:
http://www.oracle.com/technology/obe/obe10gdb/develop/regexp/regexp.htm
Регулярные выражения в хранимых процедурах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...