ここでの私の推測では、数値フィールドへのインポートが失敗した可能性があるため、データはフィールドが実際にはvarcharまたは何らかの文字フィールドであるとインポートできたためです。これは、純粋にMySQL、SQLソリューションを実行したテストケースです。
-
テーブルは、varcharである単一の列(アルファ)です。
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ドキュメント を見ました 正規表現で検索して置換できるようには見えませんでした 。できますが、エルディラ 、検索には正規表現を使用し、次に置換には代替ソリューションを使用します。
s/"(\d+),(\d+)"/$1$2/
にも注意してください なぜなら、数字にコンマが1つ以上ある場合、たとえば「1,000,000」の場合は、グローバル置換(perlではs///g
)を実行する必要があるためです。 )。しかし、グローバル置換を使用しても、置換は最後に中断したところから始まり(perlが異なる場合を除く)、他のすべてのコンマ区切りグループを見逃します。考えられる解決策は、最初の(\ d +)をオプションにすることです。たとえば、s/(\d+)?,(\d+)/$1$2/g
この場合、引用符を取り除くために2回目の検索と置換が必要になります。
文字列「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"