Mysql
 sql >> Base de données >  >> RDS >> Mysql

Supprimer les guillemets et les virgules d'une chaîne dans MySQL

Je suppose ici que parce que les données ont pu être importées, le champ est en fait un varchar ou un champ de caractères, car l'importation dans un champ numérique a peut-être échoué. Voici un cas de test que j'ai exécuté purement une solution MySQL, SQL.

  1. Le tableau est juste une seule colonne (alpha) qui est un varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Ajouter un enregistrement

    mysql> insert into t values('"1,000,000"');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t;
    
    +-------------+
    | alpha       |
    +-------------+
    | "1,000,000" | 
    +-------------+
    
  3. Mettre à jour la déclaration.

    mysql> update t set alpha = replace( replace(alpha, ',', ''), '"', '' );
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> select * from t;
    
    +---------+
    | alpha   |
    +---------+
    | 1000000 | 
    +---------+
    

Donc, à la fin, la déclaration que j'ai utilisée était :

UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

J'ai regardé la Documentation MySQL et il ne semblait pas que je pouvais faire les expressions régulières trouver et remplacer . Bien que vous puissiez, comme Eldila , utilisez une expression régulière pour une recherche, puis une solution alternative pour remplacer.

Soyez également prudent avec s/"(\d+),(\d+)"/$1$2/ parce que si le nombre a plus qu'une seule virgule, par exemple "1 000 000", vous allez vouloir faire un remplacement global (en perl c'est s///g ). Mais même avec un remplacement global, le remplacement commence là où vous vous étiez arrêté (sauf si perl est différent) et manquerait tous les autres groupes séparés par des virgules. Une solution possible serait de rendre le premier (\d+) optionnel comme donc s/(\d+)?,(\d+)/$1$2/g et dans ce cas, j'aurais besoin d'une seconde recherche et remplacement pour supprimer les guillemets.

Voici quelques exemples ruby ​​d'expressions régulières agissant uniquement sur la chaîne "1 000 000", notez qu'il n'y a PAS de guillemets doubles à l'intérieur de la chaîne, c'est juste une chaîne du nombre lui-même.

>> "1,000,000".sub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+),(\d+)/, '\1\2' )
# => "1000,000"  
>> "1,000,000".gsub( /(\d+)?,(\d+)/, '\1\2' )
# => "1000000"  
>> "1,000,000".gsub( /[,"]/, '' )
# => "1000000"  
>> "1,000,000".gsub( /[^0-9]/, '' )
# => "1000000"