Domyślam się, że ponieważ dane były w stanie zaimportować, że pole jest w rzeczywistości polem varchar lub jakimś polem znakowym, ponieważ importowanie do pola liczbowego mogło się nie powieść. Oto przypadek testowy, w którym uruchomiłem wyłącznie rozwiązanie MySQL i SQL.
-
Tabela to tylko pojedyncza kolumna (alfa), która jest warcharem.
mysql> desc t; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | alpha | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
-
Dodaj rekord
mysql> insert into t values('"1,000,000"'); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +-------------+ | alpha | +-------------+ | "1,000,000" | +-------------+
-
Zaktualizuj oświadczenie.
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 | +---------+
Więc w końcu użyłem stwierdzenia:
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
Zajrzałem do Dokumentacji MySQL i nie wyglądało na to, że mogę wykonać wyrażenia regularne znajdź i zamień . Chociaż możesz, jak Eldila , użyj wyrażenia regularnego do znalezienia, a następnie alternatywnego rozwiązania do zamiany.
Uważaj także na s/"(\d+),(\d+)"/$1$2/
bo co, jeśli liczba ma więcej niż tylko jeden przecinek, na przykład "1.000.000" będziesz chciał dokonać globalnego zastąpienia (w perlu to jest s///g
). Ale nawet w przypadku globalnego zastąpienia zastąpienie zaczyna się w miejscu, w którym ostatnio przerwałeś (chyba że perl jest inny) i pominie każdą inną grupę oddzieloną przecinkami. Możliwym rozwiązaniem byłoby uczynienie pierwszego (\d+) opcjonalnym, tak jak s/(\d+)?,(\d+)/$1$2/g
w tym przypadku potrzebowałbym drugiego znaleźć i zastąpić, aby usunąć cudzysłowy.
Oto kilka przykładów rubinowych wyrażeń regularnych działających tylko na łańcuchu "1.000.000", zauważ, że wewnątrz łańcucha NIE ma podwójnego cudzysłowu, jest to tylko łańcuch zawierający samą liczbę.
>> "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"