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;
Copy

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;
Copy

セッションパラメーターが 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`;
Copy

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;
Copy

既知の問題

デフォルトでは、 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
);
Copy

ただし、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
);
Copy