Mysql
 sql >> Database >  >> RDS >> Mysql

Rimuovere le virgolette e le virgole da una stringa in MySQL

La mia ipotesi qui è che, poiché i dati sono stati in grado di importare, il campo è in realtà un varchar o un campo di caratteri, perché l'importazione in un campo numerico potrebbe non essere riuscita. Ecco un caso di prova in cui ho eseguito esclusivamente una soluzione MySQL, SQL.

  1. La tabella è solo una singola colonna (alfa) che è un varchar.

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

    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. Aggiorna dichiarazione.

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

Quindi alla fine l'affermazione che ho usato è stata:

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

Ho esaminato la Documentazione MySQL e non sembrava che potessi trovare e sostituire con le espressioni regolari . Anche se potresti, come Eldila , usa un'espressione regolare per trovare e quindi una soluzione alternativa per sostituire.

Fai attenzione anche con s/"(\d+),(\d+)"/$1$2/ perché se il numero ha più di una singola virgola, ad esempio "1.000.000" vorrai eseguire una sostituzione globale (in perl che è s///g ). Ma anche con una sostituzione globale, la sostituzione inizia da dove avevi interrotto l'ultima volta (a meno che perl non sia diverso) e mancherebbe ogni altro gruppo separato da virgole. Una possibile soluzione sarebbe rendere il primo (\d+) opzionale in questo modo s/(\d+)?,(\d+)/$1$2/g e in questo caso avrei bisogno di una seconda ricerca e sostituzione per rimuovere le virgolette.

Ecco alcuni esempi in rubino delle espressioni regolari che agiscono solo sulla stringa "1.000.000", nota che NON ci sono virgolette doppie all'interno della stringa, questa è solo una stringa del numero stesso.

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