2009-11-10 5 views
3

J'ai une colonne appelée THE_VALUE dans une table TABLE_A, qui contient des données similaires à celui-ci, soit quelques lignes d'échantillon peut être:Oracle fonction Replace - savez pas comment utiliser pour mon scénario

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

Ce que je besoin de faire pour mettre à jour cette colonne en utilisant SQL Oracle 10g et de remplacer toutes les virgules, sauf ceux dans les tranches avec deux points, donc en gros, résultat final serait:

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

Je veux aussi faire en sorte qu'il n'y ait pas espaces après les deux-points, après la mise à jour.

J'ai essayé d'utiliser la fonction replace mais je ne suis pas sûr de savoir comment ne pas inclure les virgules entre parenthèses, car je ne veux pas qu'elles soient remplacées par des deux-points.

Merci.

Répondre

3

est ici un PL/Fonction SQL que j'ai fait sur le rapide:

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; 

Il produit:

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

Essayez d'écrire quelque chose de similaire en utilisant Oracle RegEx. Je sais que j'ai abandonné.

+0

Merci Marius - excellent travail. Juste ce que j'étais après. – tonyf

5

Vous ne pouvez pas faire ce que vous voulez avec la fonction REPLACE. Cependant, vous pouvez essayer la fonction REGEXP_REPLACE.

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

Comme une blague de programmeur dit - vous avez maintenant deux problèmes :)

+1

+1 pour deux problèmes :-) –

+0

J'ai toujours aimé l'humour entre les codes :) +1 –

+0

merci pour les réponses - toute aide sur l'utilisation de REGEXP serait appréciée. – tonyf

Questions connexes