web-dev-qa-db-fra.com

Oracle: remplacement des caractères non numériques dans une chaîne

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:

  • (zone) nnn-nnnn
  • zone-nnn-nnnn
  • area.nnn.nnnn
  • etc

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?

26
chris

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+'
    
57
Álvaro González

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.

12
Tony Andrews