SnowConvert AI -BigQuery -BigQuery とSnowflakeの識別子の違い¶
引用符で囲まれている識別子¶
BigQuery では引用符で囲まれた識別子はバッククォート(`)で囲まれますが、Snowflakeでは二重引用符(“)で囲まれます。
BigQuery では、引用符で囲まれた識別子は大文字と小文字の区別のルール に従います。つまり、たとえば列名は引用符で囲まれていても大文字と小文字は区別されません。
BigQuery¶
CREATE TABLE test.quotedIdentTable
(
`col#1` INTEGER
);
SELECT `col#1` FROM test.quotedIdentTable;
SELECT `COL#1` FROM test.quotedIdentTable;
Snowflakeでは、引用符で囲まれた識別子の大文字と小文字の区別はセッションパラメーター[QUOTED_IDENTIFIERS_IGNORE_CASE](https://docs.snowflake.com/en/sql-reference/parameters#quoted-identifiers-ignore-case)に依存します。デフォルトでは、引用符で囲まれた識別子の比較で大文字と小文字が区別されます。つまり、上記の例を移行した場合の結果コードは次のようになります。
Snowflake¶
CREATE TABLE test.quotedIdentTable
(
"col#1" INTEGER
);
SELECT
"col#1"
FROM
test.quotedIdentTable;
SELECT
"COL#1"
FROM
test.quotedIdentTable;
セッションパラメーターが TRUE に設定されていない限り、2番目の選択を実行すると失敗します。
SnowConvert AI が引用符付き識別子を移行する方法¶
SnowConvert AI は引用符で囲まれた識別子を分析し、英数字以外の文字が含まれているか、Snowflakeの予約語であるかどうかを判断します。含まれている場合は、Snowflakeの引用符で囲まれた識別子に変換します。英数字の識別子は引用符で囲まれません。
BigQuery¶
CREATE TABLE `test.identsTable1`
(
`col#1` INTEGER,
`col2` INTEGER
);
-- Group is a reserved word
SELECT
`col#1` AS `group`,
`col2`AS `hello`
FROM
`test.identsTable1`;
Snowflake¶
CREATE TABLE test.identsTable1
(
"col#1" INTEGER,
col2 INTEGER
);
-- Group is a reserved word
SELECT
"col#1" AS "group",
col2 AS hello
FROM
test.identsTable1;
既知の問題¶
デフォルトでは、 BigQuery はテーブル名とデータセット名の大文字と小文字を区別します。ただし、データセットに対して[is_case_insensitive](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#schema_option_list)オプションが有効になっている場合は、以下のテーブルが問題なく共存できます。
BigQuery¶
CREATE TABLE test.myTable
(
col1 INTEGER
);
CREATE TABLE test.MyTable
(
col1 INTEGER
);
ただし、Snowflakeでは引用符で囲まれていない識別子は[常に大文字で保存および比較されます](https://docs.snowflake.com/en/sql-reference/identifiers-syntax)。そのため、 test.MyTable を作成しようとすると、重複オブジェクトエラーが発生します。 SnowConvert AI も識別子の大文字と小文字を区別しないという前提で動作するため、変換中にこれらのシナリオのいずれかが発生した場合、ユーザーに警告するために SSC-FDM-0019 が生成されます。
Snowflake¶
CREATE TABLE test.myTable
(
col1 INTEGER
);
--** SSC-FDM-0019 - SEMANTIC INFORMATION COULD NOT BE LOADED FOR test.MyTable. CHECK IF THE NAME IS INVALID OR DUPLICATED. **
CREATE TABLE test.MyTable
(
col1 INTEGER
);