我的猜测是,因为数据能够导入,所以该字段实际上是 varchar 或某些字符字段,因为导入到数字字段可能会失败。这是我纯粹运行 MySQL、SQL 解决方案的测试用例。
-
该表只是一个 varchar 列 (alpha)。
mysql> desc t;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| alpha | varchar(15) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
-
添加一条记录
mysql> insert into t values('"1,000,000"');
Query OK, 1 row affected (0.00 sec)
mysql> select * from t;
+-------------+
| alpha |
+-------------+
| "1,000,000" |
+-------------+
-
更新声明。
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 |
+---------+
所以最后我使用的语句是:
UPDATE table
SET field_name = replace( replace(field_name, ',', ''), '"', '' );
我看了看MySQL 文档 http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_replace看起来我无法找到正则表达式并替换。虽然你可以,比如Eldila https://stackoverflow.com/questions/7917/remove-quotes-and-commas-from-a-string-in-mysql#8135,使用正则表达式进行查找,然后使用替代解决方案进行替换。
还要小心s/"(\d+),(\d+)"/$1$2/
因为如果数字不止一个逗号怎么办,例如“1,000,000”,您将需要进行全局替换(在 perl 中是s///g
)。但即使使用全局替换,替换也会从上次停止的地方开始(除非 perl 不同),并且会错过所有其他逗号分隔的组。一个可能的解决方案是使第一个 (\d+) 可选,如下所示s/(\d+)?,(\d+)/$1$2/g
在这种情况下,我需要第二次查找和替换来删除引号。
下面是一些仅作用于字符串“1,000,000”的正则表达式的 ruby 示例,请注意字符串内没有双引号,这只是数字本身的字符串。
>> "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"