はじめに:そのエラー、文字列を数値に変えようとして起きていませんか?
こんにちは!Snowflakeを触り始めると、ある日突然こんなエラーに出会うことがあります。
Numeric value 'abc' is not recognized
直訳すると「数値として認識できないよ!」という意味です。多くの場合、文字列(VARCHAR)として保存されていたデータを、数値(NUMBER や FLOAT)に変換しようとしたタイミングで発生します。CSVを取り込んだ直後や、外部システムから連携されたテーブルを集計するときによく遭遇する、初心者あるあるのエラーです。
この記事では、エラーの正体と、TO_NUMBER / TRY_TO_NUMBER を使った安全な対処法を解説していきます。

エラーが起きる典型パターン
エラーが起きるのは、ざっくり次のようなケースです。
- アルファベットや記号が混ざっている:
'abc'や'12a'を数値にしようとした - カンマ付き数字:
'1,234'のようなカンマ区切りの文字列 - 通貨記号付き:
'$500'や'¥1000' - 空白や全角文字:
' 123 '(前後にスペース)や全角の'123' - NULLの代わりに空文字:
''(空文字)を数値変換しようとした
たとえば次のSQLは確実にエラーになります。
SELECT TO_NUMBER('1,234');
-- Numeric value '1,234' is not recognized
対処法1:TO_NUMBERでフォーマット指定する
カンマや通貨記号付きの文字列は、TO_NUMBER の第2引数にフォーマットモデルを渡すことで変換できます。
-- カンマ区切りを認識させる
SELECT TO_NUMBER('1,234', '9,999'); -- 結果: 1234
-- 通貨記号付きにも対応
SELECT TO_NUMBER('$1,234.56', '$9,999.99'); -- 結果: 1234.56
フォーマットモデルの 9 は数字1桁、$ は通貨記号を意味します。詳しくは公式ドキュメントのTO_NUMBERを確認してください。
対処法2:TRY_TO_NUMBERで「失敗してもエラーにしない」
本番運用で一番頼りになるのが TRY_TO_NUMBER です。変換できないときにエラーを投げる代わりにNULLを返してくれる、とても親切な関数です。
SELECT
TRY_TO_NUMBER('123') AS ok, -- 123
TRY_TO_NUMBER('abc') AS ng, -- NULL
TRY_TO_NUMBER('1,234', '9,999') AS comma; -- 1234

ETL処理では、まず TRY_TO_NUMBER で変換し、NULLになったレコードを別途エラーログに退避する、という設計がオススメです。
対処法3:前処理でゴミを取り除く
そもそも値をキレイにしてから変換する方法もあります。
SELECT TO_NUMBER(
REPLACE(REPLACE(TRIM(price_str), ',', ''), '$', '')
) AS price
FROM raw_sales;
ポイントは以下の3つです。
TRIMで前後の空白を除去REPLACEでカンマや通貨記号を除去NULLIF(値, '')で空文字をNULLに変換しておくと、より安全
原因を特定するためのSnowsight確認手順
どの行が悪さをしているか分からないときは、Snowsightで以下のクエリを流してみましょう。
SELECT price_str
FROM raw_sales
WHERE TRY_TO_NUMBER(price_str) IS NULL
AND price_str IS NOT NULL;
これで「変換できない行」だけを一覧化できます。データ品質チェックの常套手段なので覚えておくと便利です。

注意点:CASTや暗黙変換にも要注意
明示的に TO_NUMBER を呼ばなくても、CAST(price_str AS NUMBER) や、文字列と数値の比較(WHERE price_str = 100)などの暗黙の型変換でも同じエラーが起きます。比較するときは、どちらの型に揃えるかを意識しましょう。
まとめ
「Numeric value is not recognized」エラーの対処は、次の3ステップで覚えておけばOKです。
- まず TRY_TO_NUMBER で安全に変換
- カンマや記号は フォーマットモデル または REPLACE で対応
- NULLになった行を抽出してデータ品質をチェック
エラーメッセージは怖く見えますが、要するに「この文字、数値にできないよ」と教えてくれているだけ。落ち着いて対処していきましょう!似た系統のエラーとしてDate is not recognizedやString is too longもあるので、合わせて押さえておくと安心です。
参考リンク
- Snowflake公式: TO_NUMBER / TO_DECIMAL / TO_NUMERIC
- Snowflake公式: TRY_TO_NUMBER
- Snowflake公式: SQLフォーマットモデル
関連記事
- Snowflake「Date is not recognized」エラーの原因とTO_DATE/TRY_TO_DATEの使い分け – 日付版の同系エラー、TRY_TO_DATEの使い方が学べます
- Snowflake「String is too long and would be truncated」エラーの原因と対処法 – VARCHARの桁あふれエラーの対処法
- Snowflake「Invalid identifier」エラーの原因と解決法 – カラム名の誤りで発生する定番エラー
- SnowflakeでCOPY INTOが失敗する原因と解決方法|エラー別チェックリスト – データロード時の型エラーの背景に役立ちます


