J'ai un champ dans ma base de données où les utilisateurs ont enregistré des numéros de téléphone sous forme libre. Par conséquent, les données ont toutes sortes de formats différents:
Je voudrais supprimer tous les caractères non numériques et simplement stocker les chiffres, mais je ne trouve pas de moyen simple de le faire. Est-ce possible sans utiliser un seul REMPLACEMENT pour chaque caractère?
Vous pouvez utiliser REGEXP_REPLACE depuis Oracle 10:
SELECT REGEXP_REPLACE('+34 (947) 123 456 ext. 2013', '[^0-9]+', '')
FROM DUAL
Cet exemple renvoie 349471234562013
.
Les syntaxes alternatives incluent:
Classes de caractères POSIX:
'[^[:digit:]]+'
Extensions influencées par Perl (depuis Oracle 11):
'\D+'
Pour les anciennes versions d'Oracle qui ne prennent pas en charge les expressions régulières:
select translate (phone_no,'0'||translate (phone_no,'x0123456789','x'),'0')
from mytable;
Le translate
interne récupère tous les caractères non numériques du numéro de téléphone, et le translate
externe les supprime ensuite du numéro de téléphone.