sql >> Database >  >> RDS >> Mysql

Verwijder aanhalingstekens en komma's uit een tekenreeks in MySQL

Mijn gok hier is dat omdat de gegevens konden importeren dat het veld eigenlijk een varchar of een tekenveld is, omdat het importeren naar een numeriek veld mogelijk is mislukt. Hier was een testcase waarin ik puur een MySQL-, SQL-oplossing draaide.

  1. De tabel is slechts een enkele kolom (alfa) die een varchar is.

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

    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. Verklaring bijwerken.

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

Dus uiteindelijk was de verklaring die ik gebruikte:

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

Ik heb gekeken naar de MySQL-documentatie en het zag er niet naar uit dat ik de reguliere expressies kon vinden en vervangen . Hoewel je zou kunnen, zoals Eldila , gebruik een reguliere expressie voor een zoekopdracht en vervolgens een alternatieve oplossing voor vervangen.

Wees ook voorzichtig met s/"(\d+),(\d+)"/$1$2/ want wat als het getal meer heeft dan een enkele komma, bijvoorbeeld "1.000.000", dan wil je een globale vervanging doen (in perl is dat s///g ). Maar zelfs met een globale vervanging begint de vervanging waar u het laatst was gebleven (tenzij perl anders is), en zou u de andere door komma's gescheiden groep missen. Een mogelijke oplossing zou zijn om de eerste (\d+) optioneel te maken, zoals s/(\d+)?,(\d+)/$1$2/g en in dit geval zou ik een tweede zoek-en-vervanging nodig hebben om de aanhalingstekens te verwijderen.

Hier zijn enkele robijnrode voorbeelden van reguliere expressies die alleen op de tekenreeks "1.000.000" werken. Merk op dat er GEEN dubbele aanhalingstekens in de tekenreeks staan, dit is slechts een reeks van het nummer zelf.

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


  1. Dezelfde selectiequery meerdere keren uitvoeren met verschillende parameters

  2. Ondersteuning voor MariaDB 10.4 in geüpgradede dbForge Studio voor MySQL, v.8.1

  3. mysql/orakel opgeslagen wiskundige formule

  4. Waarom wordt de auto_increment-id niet één voor één verhoogd, hoe stel je deze in?