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

Fjern citater og kommaer fra en streng i MySQL

Mit gæt her er, at fordi dataene var i stand til at importere, at feltet faktisk er et varchar- eller et tegnfelt, fordi importen til et numerisk felt måske er mislykket. Her var en testcase, jeg kørte udelukkende en MySQL, SQL-løsning.

  1. Tabellen er kun en enkelt kolonne (alfa), der er en varchar.

    mysql> desc t;
    
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | alpha | varchar(15) | YES  |     | NULL    |       | 
    +-------+-------------+------+-----+---------+-------+
    
  2. Tilføj 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. Opdater erklæring.

    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å til sidst var erklæringen, jeg brugte:

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

Jeg kiggede på MySQL-dokumentationen og det så ikke ud til, at jeg kunne finde og erstatte med regulære udtryk . Selvom du kunne f.eks. Eldila , brug et regulært udtryk for et find og derefter en alternativ løsning til erstatning.

Vær også forsigtig med s/"(\d+),(\d+)"/$1$2/ For hvad nu hvis tallet har mere end blot et enkelt komma, for eksempel "1.000.000", vil du gerne lave en global erstatning (i perl er det s///g ). Men selv med en global erstatning starter udskiftningen, hvor du sidst slap (medmindre perl er anderledes), og ville gå glip af hver anden kommasepareret gruppe. En mulig løsning ville være at gøre den første (\d+) valgfri som f.eks. s/(\d+)?,(\d+)/$1$2/g og i dette tilfælde ville jeg have brug for en anden find og erstatning for at fjerne citaterne.

Her er nogle rubineksempler på regulære udtryk, der kun virker på strengen "1.000.000", bemærk, at der IKKE er dobbelte anførselstegn inde i strengen, dette er kun en streng af selve tallet.

>> "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. VALG af data fra lagrede procedurer

  2. fejl ved indsættelse af android.database.sqlite.sqliteconstraintexception fejlkode 19 begrænsning mislykkedes

  3. hvordan man undslipper skilletegnet fra kolonneindholdet ved eksport af csv

  4. mysql:grupper efter ID, få højeste prioritet for hvert ID