sql >> Databasteknik >  >> RDS >> Mysql

Ta bort citat och kommatecken från en sträng i MySQL

Min gissning här är att eftersom data kunde importera att fältet faktiskt är ett varchar- eller något teckenfält, eftersom importen till ett numeriskt fält kan ha misslyckats. Här var ett testfall jag körde enbart en MySQL, SQL-lösning.

  1. Tabellen är bara en enda kolumn (alfa) som är en varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Lägg till en post

    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. Uppdatera uttalande.

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

Så till slut var påståendet jag använde:

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

Jag tittade på MySQL-dokumentationen och det såg inte ut som att jag kunde hitta de reguljära uttrycken och ersätta . Även om du kan, som Eldila , använd ett reguljärt uttryck för ett sök och sedan en alternativ lösning för ersätt.

Var också försiktig med s/"(\d+),(\d+)"/$1$2/ för tänk om numret har mer än bara ett kommatecken, till exempel "1 000 000" du kommer att vilja göra en global ersättning (i perl är det s///g ). Men även med en global ersättning börjar ersättningen där du slutade senast (om inte perl är annorlunda), och skulle missa varannan kommaseparerad grupp. En möjlig lösning skulle vara att göra den första (\d+) valfri som så s/(\d+)?,(\d+)/$1$2/g och i det här fallet skulle jag behöva en andra hitta och ersätta för att ta bort citattecken.

Här är några rubinexempel på reguljära uttryck som bara verkar på strängen "1 000 000", lägg märke till att det INTE finns dubbla citattecken inuti strängen, detta är bara en sträng av själva numret.

>> "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. Räkna antalet rader i 30 dagars papperskorgar

  2. Är du sorterad? Tips angående T-SQL-fönsterbeställning

  3. Hur hanterar jag att öppna/stänga Db-anslutning i en Go-app?

  4. Hur undviker du konflikter med kolumnnamn?