Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Remover aspas e vírgulas de uma string no MySQL


Meu palpite aqui é que, como os dados foram capazes de importar, o campo é na verdade um varchar ou algum campo de caractere, porque a importação para um campo numérico pode ter falhado. Aqui estava um caso de teste que executei puramente uma solução MySQL e SQL.

  1. A tabela é apenas uma única coluna (alfa) que é um varchar.
    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    

  2. Adicionar um 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. Declaração de atualização.
    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 | 
    +---------+
    

Então, no final, a declaração que usei foi:
UPDATE table
   SET field_name = replace( replace(field_name, ',', ''), '"', '' );

Examinei a Documentação do MySQL e não parecia que eu poderia fazer as expressões regulares localizar e substituir . Embora você possa, como Eldila , use uma expressão regular para localizar e, em seguida, uma solução alternativa para substituir.

Tenha também cuidado com s/"(\d+),(\d+)"/$1$2/ porque e se o número tiver mais do que apenas uma vírgula, por exemplo "1.000.000" você vai querer fazer uma substituição global (em perl que é s///g ). Mas mesmo com uma substituição global, a substituição começa de onde você parou (a menos que o perl seja diferente) e perderia todos os outros grupos separados por vírgula. Uma solução possível seria tornar o primeiro (\d+) opcional assim s/(\d+)?,(\d+)/$1$2/g e, neste caso, eu precisaria de uma segunda localização e substituição para remover as aspas.

Aqui estão alguns exemplos ruby ​​das expressões regulares atuando apenas na string "1.000.000", observe que NÃO há aspas duplas dentro da string, esta é apenas uma string do próprio número.
>> "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"