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