Snowflake「Numeric value is not recognized」エラーを解決!数値変換の正しい使い方

Snowflakeの「Numeric value is not recognized」エラー解決法の解説アイキャッチ。TO_NUMBERおよびTRY_TO_NUMBER関数を用いた安全な数値変換の正しい使い方を初心者向けにやさしく紹介する主題を示す視覚要素 Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:そのエラー、文字列を数値に変えようとして起きていませんか?

こんにちは!Snowflakeを触り始めると、ある日突然こんなエラーに出会うことがあります。

Numeric value 'abc' is not recognized

直訳すると「数値として認識できないよ!」という意味です。多くの場合、文字列(VARCHAR)として保存されていたデータを、数値(NUMBER や FLOAT)に変換しようとしたタイミングで発生します。CSVを取り込んだ直後や、外部システムから連携されたテーブルを集計するときによく遭遇する、初心者あるあるのエラーです。

この記事では、エラーの正体と、TO_NUMBER / TRY_TO_NUMBER を使った安全な対処法を解説していきます。

Snowflakeで文字列を数値に変換する際に発生する「Numeric value is not recognized」エラーの概要図。TO_NUMBERやTRY_TO_NUMBERを用いたVARCHARから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
SnowflakeのTRY_TO_NUMBER関数の実行例を示すコード画面で、'123'は123、'abc'はNULL、'1,234'はフォーマット指定で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;

これで「変換できない行」だけを一覧化できます。データ品質チェックの常套手段なので覚えておくと便利です。

SnowsightでTRY_TO_NUMBERがNULLになる行を抽出するクエリを実行した画面のスクリーンショットで、price_strカラムに含まれる数値変換できない不正データを一覧表示し、Numeric value is not recognizedエラーの原因行を特定する手順を示した例

注意点:CASTや暗黙変換にも要注意

明示的に TO_NUMBER を呼ばなくても、CAST(price_str AS NUMBER) や、文字列と数値の比較(WHERE price_str = 100)などの暗黙の型変換でも同じエラーが起きます。比較するときは、どちらの型に揃えるかを意識しましょう。

まとめ

「Numeric value is not recognized」エラーの対処は、次の3ステップで覚えておけばOKです。

  1. まず TRY_TO_NUMBER で安全に変換
  2. カンマや記号は フォーマットモデル または REPLACE で対応
  3. NULLになった行を抽出してデータ品質をチェック

エラーメッセージは怖く見えますが、要するに「この文字、数値にできないよ」と教えてくれているだけ。落ち着いて対処していきましょう!似た系統のエラーとしてDate is not recognizedString is too longもあるので、合わせて押さえておくと安心です。

参考リンク

関連記事

この記事をシェアする𝕏B!FacebookLINEPocket