2009-11-10 31 views
3

我有一個表中的TABLE_A稱爲THE_VALUE列,持有類似的數據如下,即幾樣行可能是:甲骨文REPLACE函數 - 不能確定如何使用我的方案

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

這裏有一個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

謝謝馬呂斯 - 出色的工作。就是我以後的樣子。 – tonyf 2009-11-10 23:25:37

5

你不能用REPLACE功能做你想做的。但是,您可以嘗試REGEXP_REPLACE函數。

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

作爲一個程序員的玩笑說 - 現在你有兩個問題:)

+1

對於兩個問題+1 :-) – 2009-11-10 13:26:08

+0

我總是喜歡代碼之間的一些幽默:) +1 – 2009-11-10 13:38:22

+0

感謝您的答覆 - 任何幫助使用REGEXP將不勝感激。 – tonyf 2009-11-10 13:52:08