sql >> Base de Datos >  >> RDS >> Mysql

Eliminar comillas y comas de una cadena en MySQL

Mi conjetura aquí es que debido a que los datos pudieron importarse, el campo es en realidad un varchar o algún campo de caracteres, porque la importación a un campo numérico podría haber fallado. Aquí había un caso de prueba en el que ejecuté puramente una solución MySQL, SQL.

  1. La tabla es solo una sola columna (alfa) que es un varchar.

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

    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. Actualizar declaración.

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

Entonces, al final, la declaración que usé fue:

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

Miré la Documentación de MySQL y no parecía que pudiera hacer las expresiones regulares buscar y reemplazar . Aunque podría, como Eldila , use una expresión regular para buscar y luego una solución alternativa para reemplazar.

También tenga cuidado con s/"(\d+),(\d+)"/$1$2/ porque si el número tiene más de una sola coma, por ejemplo "1,000,000" querrás hacer un reemplazo global (en perl eso es s///g ). Pero incluso con un reemplazo global, el reemplazo comienza donde lo dejó por última vez (a menos que Perl sea diferente), y perdería todos los demás grupos separados por comas. Una posible solución sería hacer que el primer (\d+) sea opcional, así s/(\d+)?,(\d+)/$1$2/g y en este caso necesitaría una segunda búsqueda y reemplazo para eliminar las comillas.

Aquí hay algunos ejemplos de Ruby de las expresiones regulares que actúan solo en la cadena "1,000,000", observe que NO hay comillas dobles dentro de la cadena, esta es solo una cadena del número en sí.

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