識別子の要件

引用符で囲まれていないオブジェクトの識別子:

  • 文字(A~Z、a~z)またはアンダースコア("_")で始めます。

  • 文字、アンダースコア、10進数(0~9)、およびドル記号("$")のみが含まれます。

  • 大文字と小文字は区別しません

識別子を二重引用符で囲む場合(例:"空白と句読点を含む識別子")、次のルールが適用されます。

  • 識別子は大文字と小文字が区別されます。

  • 識別子には、二重引用符を除く、空白文字(32)からチルダ(126)までの任意の ASCII 文字を含めることができます。

注釈

  • 識別子が引用符で囲まれていない場合、あるいは二重引用符で囲まれている場合にかかわらず、許可される最大文字数は255文字(空白を含む)です。

  • 識別子は、文字列リテラル、セッション変数、またはバインド変数を使用して指定することもできます。詳細については、 SQL 変数 をご参照ください。

このトピックの内容:

引用符で囲まれていない識別子

識別子が二重引用符で囲まれていない場合、文字またはアンダースコア(_)で始まる必要があり、拡張文字または空白を含めることはできません。

以下は、有効な識別子のすべての例です。ただし、これらの識別子の文字の大文字と小文字は保持されません。

myidentifier
MyIdentifier1
My$identifier
_my_identifier

二重引用符で囲まれた識別子

区切り識別子(つまり、二重引用符で囲まれた識別子)は大文字と小文字が区別され、次の有効な文字で始めることや含むことができます。

  • 数字

  • 特殊文字(.'!@#$%^&* など)

  • 拡張 ASCII および非 ASCII 文字

  • 空白スペース

例:

"MyIdentifier"
"my.identifier"
"my identifier"
"My 'Identifier'"
"3rd_identifier"
"$Identifier"
"идентификатор"

重要

二重引用符で囲まれた識別子を使用してオブジェクトを作成する場合、クエリまたはその他の SQL ステートメントで参照するときは、二重引用符を含めて作成したとおりに識別子を 正確に 指定する必要があります。引用符を含めないと、 Object does not exist エラー(または同様のタイプのエラー)が発生する可能性があります。

また、クエリ/SQL ステートメントで参照する場合は、識別子全体を引用符で囲む必要があることに注意してください。これは、ピリオド(.)が識別子で使用される場合に特に重要です。ピリオドは、各オブジェクトを区切るために完全修飾オブジェクト名でも使用されるためです。

例:

"My.DB"."My.Schema"."Table.1"

識別子の解決

デフォルトでは、Snowflakeは識別子の保存(作成/定義時)およびそれらの解決(クエリおよびその他の SQL ステートメント)に次のルールを適用します。

  • 識別子が引用符で囲まれていない場合、大文字で保存および解決されます。

  • 識別子が二重引用符で囲まれている場合、大文字と小文字を含めて、入力されたとおりに正確に保存および解決されます。

例えば、次の4つの名前は同等であり、すべて TABLENAME に解決されます。

TABLENAME
tablename
tableName
TableName

対照的に、次の4つの名前は、異なる一意の値と見なされます。

"TABLENAME"
"tablename"
"tableName"
"TableName"

これらの識別子を使用して同じ型のオブジェクト(テーブルなど)を作成すると、4つの異なるオブジェクトが作成されます。

サードパーティのツールと大文字と小文字を区別しない識別子の解決

一部のサードパーティアプリケーションは、生成する SQL クエリの識別子に常に二重引用符を使用します。これにより、大文字と小文字の違いによりSnowflakeで見つからない識別子を含むクエリが発生する場合があります。

QUOTED_IDENTIFIERS_IGNORE_CASE パラメーターを使用したケースの制御

この状況の発生を防ぐために、Snowflakeはセッションパラメーター QUOTED_IDENTIFIERS_IGNORE_CASE を提供します。これにより、セッション内で作成された識別子のすべてのアルファベット文字が、二重引用符に関係なく大文字で保存されます。パラメーターのデフォルトは FALSEです。

二重引用符で囲まれた識別子の大文字と小文字を区別する動作を変更するには、セッションのパラメーターを TRUE に設定します。そうすると、識別子のアルファベット文字はすべて大文字で保存されます。

つまり、次はすべて同等になります。

TABLENAME
tablename
tableName
TableName
"TABLENAME"
"tablename"
"tableName"
"TableName"

このパラメーターは、数字、拡張文字、空白に関して、引用符で囲まれていない識別子の制限に影響を与えません。

パラメーター変更の影響

QUOTED_IDENTIFIERS_IGNORE_CASE セッションパラメーターの変更は、 新規 オブジェクトとクエリのみに影響します。

  • デフォルト設定の FALSEでは、大文字と小文字が混在する二重引用符で囲まれた識別子を使用してオブジェクトが作成された場合、Snowflakeは大文字と小文字が混在した識別子を保存します。

  • その後、パラメーターが TRUEに変更された場合、新しく作成されたオブジェクトの識別子は取得/解決 できません

ちなみに

パラメーターを変更すると識別子の解決に影響する可能性があるため、Snowflakeの実装の早い段階で識別子解決方法を選択し、それに応じてアカウントレベルでパラメーターを設定してデフォルトの動作を決定することを 強く 推奨します。これは、アカウントのアカウント管理者が実行できます。パラメーターはセッションレベルでいつでも上書きできますが、明示的に変更する必要がない限り、デフォルトからパラメーターを変更することは推奨しません。

以下の例は、パラメーターを FALSE から TRUE に変更後の動作を示しています。

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "One" (i int);  -- stored as "One"

-- Create a table with an unquoted identifier
CREATE TABLE TWO(j int);     -- stored as "TWO"

-- These queries work
SELECT * FROM "One";         -- searches for "One"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"

-- These queries do not work
SELECT * FROM One;           -- searches for "ONE"
SELECT * FROM "Two";         -- searches for "Two"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- Create another table with a double-quoted identifier
CREATE TABLE "Three"(k int); -- stored as "THREE"

-- These queries work
SELECT * FROM "Two";         -- searches for "TWO"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"
SELECT * FROM "Three";       -- searches for "THREE"
SELECT * FROM three;         -- searches for "THREE"

-- This query does not work now - "One" is not retrievable
SELECT * FROM "One";         -- searches for "ONE"

さらに、2つのテーブルの識別子が大文字と小文字のみで異なる場合、パラメーターの変更後、1つの識別子が別のテーブルに解決される場合があります。

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "Tab" (i int);  -- stored as "Tab"

-- Create a table with an unquoted identifier
CREATE TABLE TAB(j int);     -- stored as "TAB"

-- This query retrieves "Tab"
SELECT * FROM "Tab"          -- searches for "Tab"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- This query retrieves "TAB"
SELECT * FROM "Tab"          -- searches for "TAB"