Dugaan saya di sini adalah karena data dapat mengimpor bahwa bidang tersebut sebenarnya adalah varchar atau bidang karakter tertentu, karena mengimpor ke bidang numerik mungkin gagal. Ini adalah kasus uji yang saya jalankan murni solusi MySQL, SQL.
-
Tabel hanyalah satu kolom (alpha) yang merupakan varchar.
mysql> desc t; +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | alpha | varchar(15) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+
-
Tambahkan catatan
mysql> insert into t values('"1,000,000"'); Query OK, 1 row affected (0.00 sec) mysql> select * from t; +-------------+ | alpha | +-------------+ | "1,000,000" | +-------------+
-
Perbarui pernyataan.
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 | +---------+
Jadi pada akhirnya pernyataan yang saya gunakan adalah:
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
Saya melihat Dokumentasi MySQL dan sepertinya saya tidak bisa melakukan ekspresi reguler menemukan dan mengganti . Meskipun Anda bisa, seperti Eldila , gunakan ekspresi reguler untuk menemukan dan kemudian solusi alternatif untuk penggantian.
Hati-hati juga dengan s/"(\d+),(\d+)"/$1$2/
karena bagaimana jika nomor tersebut memiliki lebih dari satu koma, misalnya "1.000.000" Anda akan ingin melakukan penggantian global (dalam perl yaitu s///g
). Tetapi bahkan dengan penggantian global, penggantian dimulai di tempat terakhir Anda tinggalkan (kecuali Perl berbeda), dan akan kehilangan setiap grup yang dipisahkan koma lainnya. Solusi yang mungkin adalah menjadikan yang pertama (\d+) opsional seperti s/(\d+)?,(\d+)/$1$2/g
dan dalam hal ini saya perlu menemukan dan mengganti kedua untuk menghapus tanda kutip.
Berikut adalah beberapa contoh ruby dari ekspresi reguler yang bekerja hanya pada string "1.000.000", perhatikan TIDAK ada tanda kutip ganda di dalam string, ini hanya string dari angka itu sendiri.
>> "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"