識別子の要件

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

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

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

  • Are stored and resolved as uppercase characters (e.g. id is stored and resolved as ID).

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

  • The case of the identifier is preserved when storing and resolving the identifier (e.g. "id" is stored and resolved as id).

  • The identifier can contain and can even start with any ASCII character from the blank character (32) to the tilde (126).

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

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

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

    quote"andunquote"
    

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

注釈

  • 識別子が引用符で囲まれていない場合、あるいは二重引用符で囲まれている場合にかかわらず、許可される最大文字数は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つの異なるオブジェクトが作成されます。

Migrating From Databases That Treat Double-Quoted Identifiers as Case-insensitive

In the ANSI/ISO standard for SQL, identifiers in double quotes (delimited identifiers) are treated as case-sensitive. However, some companies provide databases that treat double-quoted identifiers as case-insensitive.

If you are migrating your data and applications from one of these databases to Snowflake, those applications might use double quotes around identifiers that are intended to be case-insensitive. This can prevent Snowflake from resolving the identifiers correctly. For example, an application might use double quotes around an identifier in lowercase, and the Snowflake database has the identifier in uppercase.

To work around this limitation, Snowflake provides the QUOTED_IDENTIFIERS_IGNORE_CASE session parameter, which causes Snowflake to treat lowercase letters in double-quoted identifiers as uppercase when creating and finding objects.

See the next sections for details:

注釈

Changing the value of the parameter can affect your ability to find existing objects. See パラメーター変更の影響 for details.

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

To configure Snowflake to treat alphabetic characters in double-quoted identifiers as uppercase for the session, set the parameter to TRUE for the session. With this setting, all alphabetical characters in identifiers are stored and resolved as uppercase characters.

In other words, the following eight names are equivalent and all resolve to TABLENAME:

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

Note that the parameter has no effect on any of the limitations for unquoted identifiers with regards to numbers, extended characters, and blank spaces.

パラメーター変更の影響

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

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

  • If the parameter is later changed to TRUE, Snowflake will not be able to resolve that double-quoted mixed case identifier and will not be able retrieve that object.

ちなみに

Due to the impact that changing the parameter can have on resolving identifiers, we highly recommend choosing the identifier resolution method early in your implementation of Snowflake. Then, have your account administrator set the parameter at the account level to enforce this resolution method by default.

Although you can override this parameter at the session level, we don't encourage changing the parameter from the default, unless you have an explicit need to do so.

以下の例は、パラメーターを 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"