Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/09/2011, 11h36   #1
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
Par défaut Remplacer les caractères spéciaux dans un string

Bonjour à tous,

J'aimerais savoir comment il serait possible de créer un cursor qui parcour une table en remplaçant tous les caractères spéciaux par un espace afin de faire un trim et de garder uniquement les lettres de l'alphabet ?

Est-ce que qqun aurait une idée ? Merci ;-)

Code :
1
2
3
4
CURSOR c_ascii(p_char VARCHAR) IS
  SELECT  ASCII(p_char) result 
  FROM DUAL
  ;
pour le moment je parcours le string (en upper) et je la passe au cursor ci-dessus puis si la valeur est entre 65 et 90 c'est donc entre A et B. Alors là je conquatène une variable afin de créer un mot entier.

Mais n'y a-t-il pas une solution plus simple ?
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 11h41   #2
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
Enfin je voulais dire que entre 65 et 90, cela signifie que ça comprends entre A et Z et non A et B, pardon
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 11h56   #3
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Avec un double translate : le premier pour enlever les caractères que tu souhaites garder, et le second pour enlever le résultat du premier
Code :
1
2
3
4
5
SELECT chaine, TRANSLATE(chaine, 'A'|| TRANSLATE(chaine, ' ABCDEFGHIJKLMNOPQRSTUVWXYZ', ' '), 'A') Asci
FROM (SELECT 'a045rarhjiuot(A_çuHZTYZEàalmé&ù*&"ù²"m^²$"' AS chaine FROM dual)
 
CHAINE						ASCI
a045rarhjiuot(A_çuHZTYZEàalmé&ù*&"ù²"m^²$"	AHZTYZE
Edit : Attention, les 'A' (caractère à garder) sur le premier translate et l'espace (caractère à enlever) dans le second translate sont importants, car translate nécessite au moins une valeur de remplacement.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 12h04   #4
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
Super bonne idée !! ;-)
Merci beaucoup

est-ce qu'il est possible de mettre dans la 2ème chaîne : NOT IN 1ère chaîne ?
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 12h26   #5
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Je ne comprends pas la question.. avec un exemple ce serait mieux
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h22   #6
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
Un example :


1ère chaine ; 2ème chaine ; Résultat souhaité

O<% !XY?K( T S<4_,6* ; OXYKTS ; O XY K T S

Ce que je voulais dire dans la remarque d'avant était de soustraire à la 1ère chaîne les caractères spéciaux ce qui donnerait exactement le résultat souhaité (d'une point de vue visuel).

Je voudrais savoir s'il est possible de replacer les caractères qui ne sont pas dans la liste ' ABCDEFGHIJKLMNOPQRSTUVWXYZ' par des espace ?

un grand merci d'avance.
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h51   #7
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
finalement je me suis débrouillé de cette façon :

j'ai remplacé les blank space par des underscore et j'ai accepté les underscore comme caractère normaux.

Code :
 TRANSLATE(lookup_loc_desc, 'A'|| TRANSLATE(REPLACE(Upper(lookup_loc_desc), ' ', '_'), ' _ABCDEFGHIJKLMNOPQRSTUVWXYZ.', ' '), 'A') lookup_loc_desc1,
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 16h52   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
Tu peux, mais tu auras plusieurs espaces (1 par caractère)

Code :
1
2
3
4
5
6
7
WITH t AS (SELECT 'O<% !XY?K( T S<4_,6*' AS chaine1, 'OXYKTS' AS chaine2 FROM dual)
SELECT chaine1, chaine2, TRIM(TRANSLATE(chaine1, TRANSLATE(chaine1, ' '||chaine2, ' '), LPAD(' ', LENGTH(TRANSLATE(chaine1, ' '||chaine2, ' '))))) result3
FROM t
 
 
CHAINE1			CHAINE2	RESULT3
O<% !XY?K( T S<4_,6*	OXYKTS	O    XY K  T S
A toi ensuite de dédoublonner les espaces en trop
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/09/2011, 18h24   #9
Membre à l'essai
 
Inscription : février 2008
Messages : 73
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : février 2008
Messages : 73
Points : 23
Points : 23
Super !!!!!!
Un grand merci
MartinezGarcia est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h37.


 
 
 
 
Partenaires

Hébergement Web