SnowConvert: Redshiftの基本要素¶
名前と識別子¶
説明¶
名前は、テーブルや列、ユーザーやパスワードなどのデータベースオブジェクトを識別します。名前 と 識別子 は同じ意味で使うことができます。識別子には、標準識別子と、引用符で囲まれたまたは区切られた識別子の2種類があります。識別子は、 UTF-8の印刷可能な文字のみで構成されなければなりません。標準および区切り識別子の ASCII 文字は大文字と小文字が区別されず、データベースでは小文字に折りたたまれます。(Redshift SQL 言語リファレンス名前と識別子)。
標準識別子¶
標準の SQL 識別子は一連のルールに準拠しており、次の条件を満たす必要があります。
ASCII 1バイトのアルファベット文字またはアンダースコア文字、または UTF-8の2~4バイトのマルチバイト文字で始まります。
それ以降の文字は、 ASCII 1バイトの英数字、アンダースコア、ドル記号、または UTF-8の2~4バイトのマルチバイト文字を使用できます。
長さは1~127バイトで、区切り識別子の場合は引用符を含みません。
引用符とスペースは使用しないでください。
予約済み SQL キーワードではありません。(Redshift SQL 言語リファレンス標準識別子)
この構文はSnowflakeで完全にサポートされています。
特殊文字識別子
Redshiftでは、識別子の名前の一部としていくつかの特殊文字の使用がサポートされています。これらは識別子のどの部分でも使用できます。このため、この動作をエミュレートするには、これらのサポートされていない特殊文字をSnowflakeで有効な新しい値に置き換えてください。
# の文字が _H_୧ に置き換えられます。
注釈
Redshiftでは、 「# 」 で始まるテーブル名を指定すると、そのテーブルは仮テーブルとして作成されます。
サンプルソースパターン¶
入力コード:¶
CREATE TABLE #TABLE_NAME
(
COL#1 int,
"col2#" int
);
INSERT INTO #TABLE_NAME(COL#1, "col2#") VALUES (1,20),(2,21),(3,22);
SELECT col#1, "col2#" as col# FROM #TABLE_NAME;
出力コード:¶
CREATE TEMP TABLE _H_TABLE_NAME
(
COL_H_1 int,
"col2#" int
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "03/04/2025", "domain": "test" }}';
INSERT INTO _H_TABLE_NAME (COL_H_1, "col2#") VALUES (1,20),(2,21),(3,22);
SELECT
col_H_1,
"col2#" as col_H_
FROM
_H_TABLE_NAME;
区切り識別子¶
区切り識別子(引用符で囲まれた識別子とも呼ばれます)は、二重引用符(")で始まり、終わります。区切り識別子を使用する場合、そのオブジェクトへの参照には必ず二重引用符を使用しなければなりません。識別子には、二重引用符自体を除く、標準の UTF-8の印刷可能な文字を含めることができます。したがって、スペースやパーセント記号など、通常は不正な文字を含む列名またはテーブル名を作成できます。(Redshift SQL 言語リファレンス区切り識別子)。
Redshiftでは、識別子は引用符で囲むことができ、 デフォルトでは大文字と小文字は区別されません。しかし、Snowflakeでは デフォルトで大文字と小文字が区別されます。このため、この動作をエミュレートするために、 引用符で囲まれ、Snowflakeの予約キーワードではなく、英数字を含む すべての識別子から引用符を削除します。Snowflakeの予約済み キーワードは常に二重引用符で囲まれ、小文字で定義されます。
警告
この変更は、構成でenable_case_sensitive_identifier
フラグがtrueにセットされている場合、望ましい動作に影響する可能性があります。将来のアップデートでは、ユーザーがこれらの識別子に対して必要な変換を定義できるようになる予定です。
サンプルソースパターン¶
このシナリオでは、「LATERAL」と「INCREMENT」はSnowflakeの予約済みワードであり、「LOCAL」は予約済みワードではないことに留意してください。
入力コード:¶
CREATE TABLE lateral
(
INCREMENT int,
"local" int
);
INSERT INTO lateral(INCREMENT, "local") VALUES (1,20),(2,21),(3,22);
SELECT lateral.INCREMENT, "local" FROM LATERAL;
increment |
local |
---|---|
1 |
20 |
2 |
21 |
3 |
22 |
出力コード:¶
CREATE TABLE "lateral"
(
"increment" int,
local int
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "12/10/2024", "domain": "test" }}';
INSERT INTO "lateral" ("increment", local) VALUES (1,20),(2,21),(3,22);
SELECT
"lateral"."increment",
local
FROM
"lateral";
increment |
LOCAL |
---|---|
1 |
20 |
2 |
21 |
3 |
22 |
関数内の引用符で囲まれている識別子¶
Redshiftでは、関数名は引用符で囲むことができ、 デフォルトでは大文字と小文字は区別されません。しかし、Snowflakeでは、関数が引用符で囲まれ、小文字で書かれている場合、問題が発生する可能性があります。このため、Snowflakeでは、引用符で囲まれた関数名は常に大文字に変換され、引用符は削除されます。
サンプルソースパターン¶
入力コード:¶
SELECT "getdate"();
"GETDATE"() |
---|
2024-11-21 22:08:53.000000 |
出力コード:¶
SELECT GETDATE();
"GETDATE"() |
---|
2024-11-21 22:08:53.000 +0000 |
推奨事項¶
この制限を回避するために、Snowflakeは QUOTED_IDENTIFIERS_IGNORE_CASE セッションパラメーターを提供します。これにより、Snowflakeは、オブジェクトを作成および検索するときに、二重引用符で囲まれた識別子の小文字を大文字として扱います。
予約済みキーワード¶
説明¶
Redshiftでは、 Snowflakeの予約済みキーワード の一部を列名やテーブル名などとして使用することができます。このため、これらの単語を使用するには、二重引用符で囲む必要があります。
注釈
Snowflakeでは、これらの名前が二重引用符で囲まれている場合、 大文字と小文字が区別される ことに注意してください。このため、Snowflakeで予約済みキーワードを使用する場合は、常に二重引用符で囲み、小文字で変換することが重要です。詳細情報については、 Snowflake識別子ドキュメントを参照してください。
サンプルソースパターン¶
入力コード:¶
CREATE TABLE alter
(
alter INT
);
CREATE TABLE CONNECT
(
CONNECT INT
);
DROP TABLE alter;
DROP TABLE CONNECT;
出力コード:¶
CREATE TABLE "alter"
(
"alter" INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}';
CREATE TABLE "connect"
(
"connect" INT
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": { "major": 0, "minor": 0, "patch": "0" }, "attributes": { "component": "redshift", "convertedOn": "09/17/2024" }}';
DROP TABLE "alter";
DROP TABLE "connect";
既知の問題¶
問題は見つかりませんでした。