識別子の要件

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

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

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

  • 大文字として保存および解決されます(例: idID として保存および解決)。

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

  • 識別子の大文字と小文字は、識別子を保存および解決するときに保持されます(例: "id"id として保存および解決)。

  • 識別子には、 ASCII、拡張 ASCII、および非 ASCII 文字を含めることができます。

    引用符で囲まれた識別子内で二重引用符を使用するには、引用符を2つ使用します。例:

    create table "quote""andunquote""" ...
    
    Copy

    次の名前のテーブルを作成します。

    quote"andunquote"
    
    Copy

    ここで、引用符は名前の一部です。

注釈

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

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

このトピックの内容:

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

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

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

myidentifier
MyIdentifier1
My$identifier
_my_identifier
Copy

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

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

  • 数字

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

  • 拡張 ASCII および非 ASCII 文字

  • 空白スペース

例:

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

重要

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

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

例:

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

例外

  • ハンドラー言語がJava、 JavaScript、Snowflakeスクリプト、または SQL である ユーザー定義関数(UDFs)とプロシージャの名前 では、二重引用符で囲まれた識別子はサポートされません。

  • ハンドラー言語がJavaであるユーザー定義関数(UDFs)とプロシージャの名前には ASCII 文字のみを使用できます。

識別子の解決

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

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

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

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

TABLENAME
tablename
tableName
TableName
Copy

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

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

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

二重引用符で囲まれた識別子を大文字と小文字の区別がないものとして扱うデータベースからの移行

SQL の ANSI/ISO 標準では、二重引用符で囲まれた識別子(区切られた識別子)は大文字と小文字が区別されるものとして扱われます。ただし、一部の企業は、二重引用符で囲まれた識別子を大文字と小文字の区別がないものとして扱うデータベースを提供しています。

データとアプリケーションをこれらのデータベースの1つからSnowflakeに移行する場合、これらのアプリケーションでは、大文字と小文字を区別しないように、識別子を二重引用符で囲むことがあります。これにより、Snowflakeが識別子を正しく解決できなくなる可能性があります。たとえば、アプリケーションが小文字の識別子を二重引用符で囲み、Snowflakeデータベースの識別子が大文字である場合があります。

この制限を回避するために、Snowflakeは QUOTED_IDENTIFIERS_IGNORE_CASE セッションパラメーターを提供します。これにより、Snowflakeは、オブジェクトを作成および検索するときに、二重引用符で囲まれた識別子の小文字を大文字として扱います。

詳細については、次のセクションをご参照ください。

注釈

パラメーターの値を変更すると、既存のオブジェクトを見つける能力に影響を与える可能性があります。詳細については パラメーター変更の影響 をご参照ください。

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

二重引用符で囲まれた識別子の英字をセッションの大文字として扱うようにSnowflakeを構成するには、セッションのパラメーターを TRUE に設定します。この設定では、識別子のすべてのアルファベット文字が大文字として保存および解決されます。

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

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

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

パラメーター変更の影響

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

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

  • パラメーターが後で TRUE に変更された場合、Snowflakeは、二重引用符で囲まれた大文字と小文字が混在する識別子を解決できず、そのオブジェクトを取得できません。

ちなみに

パラメーターの変更は識別子の解決に影響を与える可能性があるため、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"
Copy

さらに、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"
Copy