2010-05-26 3 views
2

Est-il possible de supprimer un caractère d'une position donnée? Disons que mon mot est: PANCAKES Et je veux enlever la 2ème lettre (dans ce cas, 'A'), donc je veux PNCAKES comme mon retour.Supprimer un caractère d'une position donnée sur Oracle

Traduire ne fonctionne pas pour cela. Remplacer ne fonctionne pas pour cela. Regex est sacrément compliqué ...

Des idées?

Répondre

4

Exemple:

SUBSTR('PANCAKES', 0, INSTR('PANCAKES', 'A', 1, 1)-1) || SUBSTR('PANCAKES', INSTR('PANCAKES', 'A', 1, 1)+1) 

Je n'ai pas une instance Oracle pour tester avec, pourrait avoir à modifier le -1/+ 1 pour obtenir la position correcte.

Références:

+0

REGEXP_REPLACE est une option pour Oracle 10g +: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/functions130.htm#SQLRF06302 –

+0

Works. Merci! Je pensais à regex mais ils sont plutôt compliqués. – alex

+0

@alex: Je recommande fortement http://www.regular-expressions.info/ - c'est une excellente ressource pour être plus à l'aise avec les regex. –

0

oui REPLACE et SUBSTR dans le bon ordre feront l'affaire. Le résultat final devrait être une concaténation du SUBSTR avant le caractère retiré au SUBSTR après le caractère char. Si la colonne entière est seulement un mot, alors vous pouvez simplement faire une mise à jour, si le mot est dans une autre chaîne, alors vous pouvez utiliser REPLACE comme un wrapper.

+0

Un exemple est très apprécié. – alex

3

Vous devriez fortement envisager d'utiliser regexp_replace. Il est plus court et pas si compliqué qu'il n'y paraît au premier coup d'œil:

SELECT REGEXP_REPLACE(S, '^(.{1}).', '\1') 
FROM (
    SELECT 'PANCAKES' 
    FROM DUAL 
) 

Le modèle ^(.{1}). recherches depuis le début de la chaîne (notée ^) pour exactement un (.{1}) de caractères imprimables ou uprintable suivi encore un de ces caractères (.). La partie "exacte" est fermée entre parenthèses, de sorte qu'elle peut être référencée comme groupe de correspondance par son numéro dans l'argument de la troisième fonction (\1). Donc toute la sous-chaîne correspondant à regexp est 'PA', mais nous ne faisons référence qu'à 'P'. Le reste de la chaîne reste intact. Donc le résultat est 'PNCAKES'.

Si vous souhaitez supprimer le caractère n-ième de la chaîne, remplacez simplement le nombre «un» dans le modèle (utilisé pour supprimer le deuxième caractère) par la valeur N-1.

Il est bon pour le programmeur ou tout autre informaticien de se familiariser avec les expressions régulières, car cela lui donne beaucoup de pouvoir pour travailler avec des entrées de texte.

1

Ou utilisez une fonction SplitAtPos personnalisée en utilisant SUBSTR. L'avantage est qu'il fonctionne toujours sur Oracle v9.

set serveroutput on 
declare 

s1 varchar2(1000); 
s2 varchar2(1000); 

function SplitAtPos(s in out varchar2, idx pls_integer) 
    return varchar2 
is 
    s2 varchar2(1000); 
begin 
    s2:=substr(s,1,idx-1); 
    s:=substr(s,idx,length(s)-idx+1); 
    return s2; 
end; 

begin 
s1:='Test123'; 
s2:=SplitAtPos(s1,1); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,5); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,7); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,8); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

s1:='Test123'; 
s2:=SplitAtPos(s1,0); 
dbms_output.put_line('s1='||s1||' s2='||s2); 

end; 
0

Vous pouvez utiliser quelque chose comme ça dans pl/SQL

DECLARE 
    v_open NUMBER; 
    v_string1 VARCHAR2(10); 
    v_string2 VARCHAR2(10); 
    v_word VARCHAR2(10); 
BEGIN 
    v_open := INSTR('PANCAKES' ,'A',1); 
    v_string1 := SUBSTR('PANCAKES' ,1, 1); 
    v_string2 := SUBSTR('PANCAKES' ,v_open+1); 
    v_word := v_string1||v_string2; 
END; 
+0

Veuillez expliquer votre code un peu. –

Questions connexes