Snowflake「Invalid identifier」エラーの原因と解決方法|大文字小文字・ダブルクォートの落とし穴

Snowflakeで発生するInvalid identifierエラーの原因と解決方法を示す解説図、大文字小文字変換とダブルクォートの落とし穴 Snowflake
この記事をシェアする𝕏B!FacebookLINEPocket

はじめに:なぜ「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 カラムとして保存されているのです。

Snowflakeにおける識別子の大文字小文字変換ルールを示した図解で、ダブルクォートなしでCREATE TABLE users (user_name STRING)と記述すると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';

解決策は、サブクエリでラップするか、QUALIFYHAVING を使うか、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();
SnowflakeでCURRENT_DATABASE・CURRENT_SCHEMA・CURRENT_ROLEを実行し、現在のコンテキストを確認するクエリ結果画面。Invalid identifierエラーの原因となるロールやスキーマ違いを切り分けるための確認手順を示す図

Snowsightで素早く確認する手順

  1. 左メニューのDataから該当データベース・スキーマを開く
  2. テーブルをクリックし、Columnsタブで実際のカラム名(大文字/小文字)を確認
  3. カラム名の右側にある「Copy」ボタンで、正しい表記をそのままコピーする

まとめ

  • Snowflakeはクォートなしの識別子を自動で大文字化する
  • クォート付きで作ったカラムは、参照時もクォートが必要
  • まずは DESCRIBE TABLE で実体を確認するのが近道
  • エイリアス参照位置、ロール・スキーマのコンテキストも忘れずチェック

「Invalid identifier」は怖く見えますが、原因はほぼこの4パターンに収まります。

参考リンク

関連記事

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