Oracle: remplacer les caractères non numériques dans une chaîne de caractères

j'ai un champ dans ma base de données où les utilisateurs ont enregistré des numéros de téléphone gratuits. En conséquence, les données ont toutes sortes de formatage différent:

  • (région de) nnn-nnnn
  • zone-nnn-nnnn
  • zone.nnn.nnnn
  • etc

j'aimerais supprimer tous les caractères non numériques et simplement stocker les chiffres, mais je ne peux pas trouver un moyen simple de le faire. Est-ce possible sans utiliser un remplacement pour chaque char?

26
demandé sur Mark 2010-10-19 16:15:51

2 réponses

Vous pouvez utiliser REGEXP_REPLACE depuis Oracle 10:

SELECT REGEXP_REPLACE('+34 (947) 123 456 ext. 2013', '[^0-9]+', '')
FROM DUAL

renvoie 349471234562013.

les syntaxes alternatives comprennent:

  • classes de caractères POSIX:

    '[^[:digit:]]+'
    
  • extensions influencées par Perl (depuis Oracle 11):

    '\D+'
    
52
répondu Álvaro González 2014-01-16 16:00:47

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;

L'intérieur translate obtient tous les chiffres du numéro de téléphone, et l'extérieur translate puis supprime le numéro de téléphone.

11
répondu Tony Andrews 2010-10-19 12:49:30