はじめに:なぜ「Invalid identifier」につまずくのか
Snowflakeを触り始めて間もない頃、こんなエラーに出会ったことはありませんか?
SQL compilation error: error line 1 at position 7
invalid identifier 'USER_NAME'
「いやいや、ちゃんと user_name ってカラムを作ったはずなのに……」と頭を抱える方はとても多いです。実はこのエラー、Snowflake特有の識別子(identifier)の扱いルールを知らないとハマりやすい落とし穴があるんですよ。
この記事では、初心者の方が「Invalid identifier」エラーを見たときに、すぐに原因を切り分けられるようになるためのコツを解説していきます。
そもそも「識別子」って何?
識別子(identifier)とは、テーブル名・カラム名・スキーマ名・エイリアス名など、SQLの中で「名前」として使う文字列のことです。Snowflakeはこの識別子を扱うとき、ちょっと面白いルールを持っています。
- ダブルクォートで囲まない場合:識別子は自動的に大文字に変換される
- ダブルクォートで囲む場合:書いた通り(大文字小文字・記号もそのまま)で扱われる
つまり、CREATE TABLE users (user_name STRING) と書いても、Snowflakeの内部では USERS テーブルの USER_NAME カラムとして保存されているのです。

原因パターン1:大文字小文字の食い違い
一番よくあるのが、テーブル作成時にダブルクォート付きで小文字のカラム名を作ってしまったケースです。
-- 作成時:わざわざクォートで小文字に固定してしまった
CREATE TABLE customers ("user_name" STRING);
-- 参照時:クォートなしなので大文字 USER_NAME として探しに行く → エラー!
SELECT user_name FROM customers;
-- → invalid identifier 'USER_NAME'
解決策はシンプルで、参照時もダブルクォートで囲って小文字のまま指定します。
SELECT "user_name" FROM customers;
あるいは、そもそも作成時にクォートを使わなければ、こうした問題は起きません。命名で迷う場合はSnowflake命名規則ベストプラクティスもあわせてチェックしてみてください。
原因パターン2:外部ツールからのロードでクォートが付く
BIツール、ETLツール、PandasのDataFrameなどから自動で CREATE TABLE されると、カラム名にダブルクォートが付与され、小文字や混在ケースのまま保存されることがあります。
確認するには DESCRIBE TABLE で実際に保存されているカラム名を見てみましょう。
DESCRIBE TABLE customers;
表示された名前が小文字なら、参照時もダブルクォート必須です。
原因パターン3:エイリアスを別の列で参照してしまう
SELECT句で作ったエイリアスを、同じレベルのWHERE句で使うとエラーになります。
-- NG:WHERE句では full_name はまだ存在しない
SELECT first_name || ' ' || last_name AS full_name
FROM users
WHERE full_name = 'Taro Yamada';
解決策は、サブクエリでラップするか、QUALIFY や HAVING を使うか、WHERE句に式をそのまま書くかです。
SELECT * FROM (
SELECT first_name || ' ' || last_name AS full_name FROM users
) WHERE full_name = 'Taro Yamada';
原因パターン4:スキーマやDBのコンテキスト違い
テーブル名そのものが「Invalid identifier」になる場合、現在のロール・データベース・スキーマからそのオブジェクトが見えていない可能性があります。これはObject does not exist or not authorized エラーと地続きの問題なので、あわせて読むと理解が深まります。
SELECT CURRENT_DATABASE(), CURRENT_SCHEMA(), CURRENT_ROLE();

Snowsightで素早く確認する手順
- 左メニューのDataから該当データベース・スキーマを開く
- テーブルをクリックし、Columnsタブで実際のカラム名(大文字/小文字)を確認
- カラム名の右側にある「Copy」ボタンで、正しい表記をそのままコピーする
まとめ
- Snowflakeはクォートなしの識別子を自動で大文字化する
- クォート付きで作ったカラムは、参照時もクォートが必要
- まずは
DESCRIBE TABLEで実体を確認するのが近道 - エイリアス参照位置、ロール・スキーマのコンテキストも忘れずチェック
「Invalid identifier」は怖く見えますが、原因はほぼこの4パターンに収まります。
参考リンク
- 識別子の構文 – Snowflake Documentation
- 識別子 – Snowflake Documentation
- DESCRIBE TABLE – Snowflake Documentation
関連記事
- Object does not exist or not authorized エラーの正体 – テーブルそのものが見えない時のデバッグ手順
- Snowflake「Warehouse does not exist」エラーの原因と解決法 – 識別子系エラーの兄弟分
- 「Numeric value is not recognized」エラーを解決 – 型変換まわりのエラー対処
- 「Date is not recognized」エラーの原因とTO_DATEの使い分け – 日付パース系のつまずき解消
- Snowflake命名規則ベストプラクティス – 識別子トラブルを未然に防ぐ命名のコツ


