Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Entfernen Sie Anführungszeichen und Kommas aus einer Zeichenfolge in MySQL

Ich vermute hier, dass das Feld tatsächlich ein varchar oder ein Zeichenfeld ist, da die Daten importiert werden konnten, da der Import in ein numerisches Feld möglicherweise fehlgeschlagen ist. Hier war ein Testfall, bei dem ich eine reine MySQL-SQL-Lösung ausgeführt habe.

  1. Die Tabelle ist nur eine einzelne Spalte (Alpha), die ein Varchar ist.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Datensatz hinzufügen

    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. Anweisung aktualisieren.

    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 | 
    +---------+
    

Am Ende habe ich also folgende Anweisung verwendet:

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

Ich habe mir die MySQL-Dokumentation angesehen und es sah nicht so aus, als könnte ich die regulären Ausdrücke Suchen und Ersetzen ausführen . Obwohl Sie könnten, wie Eldila , verwenden Sie einen regulären Ausdruck für eine Suche und dann eine alternative Lösung für eine Ersetzung.

Seien Sie auch vorsichtig mit s/"(\d+),(\d+)"/$1$2/ denn was ist, wenn die Zahl mehr als nur ein einzelnes Komma enthält, zum Beispiel "1.000.000", dann möchten Sie eine globale Ersetzung durchführen (in Perl ist das s///g ). Aber selbst bei einer globalen Ersetzung beginnt die Ersetzung dort, wo Sie zuletzt aufgehört haben (es sei denn, Perl ist anders) und würde die jeweils zweite kommagetrennte Gruppe verpassen. Eine mögliche Lösung wäre, das erste (\d+) optional zu machen, also s/(\d+)?,(\d+)/$1$2/g und in diesem Fall würde ich ein zweites Suchen und Ersetzen benötigen, um die Anführungszeichen zu entfernen.

Hier sind einige Ruby-Beispiele für reguläre Ausdrücke, die nur auf die Zeichenfolge "1.000.000" wirken. Beachten Sie, dass die Zeichenfolge KEINE doppelten Anführungszeichen enthält, dies ist nur eine Zeichenfolge der Zahl selbst.

>> "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"