SnowConvert AI - BigQuery - データ型

Snowflakeは、列、ローカル変数、式、プロバイダーを含むさまざまな SQL コンストラクトにわたって、基本的な SQL データ型の大部分を、特定の制限付きでサポートしています。

ブールデータ型

BigQuery

Snowflake

メモ

[BOOL/BOOLEAN](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#boolean_type)

[BOOLEAN](https://docs.snowflake.com/en/sql-reference/data-types-logical#boolean)

バイトデータ型

BigQuery

Snowflake

メモ

[BYTES](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type)

[BINARY](https://docs.snowflake.com/en/sql-reference/data-types-text#binary)

BYTES データ型はSnowflakeではサポートされていません。代わりに BINARY が使用されます。詳細については、[BYTES](#bytes)データ型のドキュメントをご参照ください。

日付データ型

BigQuery

Snowflake

メモ

[DATE](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#date_type)

[DATE](https://docs.snowflake.com/en/sql-reference/data-types-datetime#date)

[DATETIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#date_type)

[DATETIME](https://docs.snowflake.com/en/sql-reference/data-types-datetime#datetime)

DATETIME は、Snowflake の TIMESTAMP_NTZ のエイリアスです。

[TIMESTAMP](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#timestamp_type)

[TIMESTAMP_TZ](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-tz)

TIMESTAMP データ型は TIMESTAMP_TZ に変換されます。詳細については、 TIMESTAMP データ型のドキュメントをご参照ください。

[TIME](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#time_type)

[TIME](https://docs.snowflake.com/en/sql-reference/data-types-datetime#time)

地理データ型

BigQuery

Snowflake

メモ

[GEOGRAPHY](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#geography_type)

[GEOGRAPHY](https://docs.snowflake.com/en/sql-reference/data-types-geospatial#geography-data-type)

インターバルデータ型

BigQuery

Snowflake

メモ

[INTERVAL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#interval_type)

[VARCHAR(30)](https://docs.snowflake.com/en/sql-reference/data-types-text#varchar)

INTERVAL data type is not supported in Snowflake. VARCHAR is used instead. For more information, please refer to the INTERVAL data type documentation. With the --UseIntervalDatatype preview flag, maps to INTERVAL DAY TO SECOND. See Interval Data Types.

Jsonデータ型

BigQuery

Snowflake

メモ

[JSON](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#json_type)

[VARIANT](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#variant)

JSON データ型はSnowflakeではサポートされていません。代わりに VARIANT が使用されます。詳細については、[JSON](#json)データ型のドキュメントをご参照ください。

数値データ型

BigQuery

Snowflake

メモ

[INT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[INT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

INT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[INT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[INT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

INT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[SMALLINT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[SMALLINT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

SMALLINT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[INTEGER](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[INTEGER](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

INTEGER は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[BIGINT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[BIGINT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

BIGINT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[TINYINT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[TINYINT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

TINYINT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[BYTEINT](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[BYTEINT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#int-integer-bigint-smallint-tinyint-byteint)

BYTEINT は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[NUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[NUMERIC](https://docs.snowflake.com/en/sql-reference/data-types-numeric#decimal-dec-numeric)

NUMERIC は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[DECIMAL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[DECIMAL](https://docs.snowflake.com/en/sql-reference/data-types-numeric#decimal-dec-numeric)

DECIMAL は、Snowflakeの NUMBER データ型のエイリアスです。最大精度とスケールは NUMBER (38,37)です。

[BIGNUMERIC](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[NUMERIC](https://docs.snowflake.com/en/sql-reference/data-types-numeric#decimal-dec-numeric)​

Snowflakeは、 BIGNUMERIC データ型をサポートしていません。代わりに NUMERIC を使用してください。 BIGNUMERIC の精度76,76はSnowflakeの制限(38)を超えているため、切り捨てや丸めが行われ、重大な不正確さが生じる可能性があります。

[BIGDECIMAL](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#numeric_types)

[DECIMAL](https://docs.snowflake.com/en/sql-reference/data-types-numeric#decimal-dec-numeric)

Snowflakeは、 BIGDECIMAL データ型をサポートしていません。代わりに NUMERIC を使用してください。 BIGDECIMAL の精度76,76はSnowflakeの制限(38)を超えているため、切り捨てや丸めが行われ、重大な不正確さが生じる可能性があります。

[FLOAT64](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#floating_point_types)

[FLOAT](https://docs.snowflake.com/en/sql-reference/data-types-numeric#data-types-for-floating-point-numbers)

文字列データ型

BigQuery

Snowflake

メモ

[STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#string_type)

[STRING](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#string_type)

STRING は、Snowflakeの VARCHAR データ型のエイリアスです。VARCHAR にはUnicode UTF-8文字が含まれます。

ANY に TYPE

BigQuery の ANY TYPE データ型の変換仕様

説明

以下は、 CREATE FUNCTION ステートメント内での ANY TYPE の使い方に関する情報の抜粋です。

ANY TYPE と等しい型を持つパラメーターは、関数の呼び出し時に複数の引数の型と一致する可能性があります。

  • 複数のパラメーターの型が ANY TYPE である場合、 BigQuery はこれらの引数間の型の関係を強制しません。

  • 関数の戻り値の型を ANY TYPE にすることはできません。これは省略するか、 sql_expression に基づいて自動的に決定されるか、明示的な型を指定する必要があります。

  • 関数の定義と互換性のない型の引数を渡すと、呼び出し時にエラーになります。

サンプルソースパターン

UDFs の型定義

ANY TYPE は関数のパラメーターの型としてのみ見つけることができます。SnowConvert AI は、 ANY TYPEVARIANT に自動的に変換します。

BigQuery
CREATE FUNCTION addFourAndDivideAny(x ANY TYPE, y ANY TYPE)
AS (
  (x + 4) / y
);
Snowflake
CREATE FUNCTION addFourAndDivideAny (x VARIANT, y VARIANT)
RETURNS VARIANT
AS
$$
  ((x + 4) / y) :: VARIANT
$$;

ARRAY<T>

ARRAY データ型の BigQuery からSnowflakeへの変換仕様

説明

BigQuery において、配列は、配列以外の値の0個以上の要素の順序付きリストです。配列内の要素は同じ型を共有する必要があります。([配列タイプ。 BigQuery](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#array_type))

サンプルソースパターン

BigQuery

CREATE TABLE test.arrayTable
(
  col1 ARRAY<INT64>
);

CREATE TABLE test.anotherArrayTable
(
  col2 ARRAY<INT64>
);

INSERT INTO test.arrayTable VALUES ([4, 10, 55]);
INSERT INTO test.arrayTable VALUES ([6, 7, 33]);
INSERT INTO test.arrayTable VALUES ([50, 12, 22]);

INSERT INTO test.anotherArrayTable VALUES ([9, 11, 52]);
INSERT INTO test.anotherArrayTable VALUES ([3, 18, 11]);
INSERT INTO test.anotherArrayTable VALUES ([33, 27, 43]);

Snowflake

CREATE TABLE test.arrayTable
(
  col1 ARRAY DEFAULT []
);

CREATE TABLE test.anotherArrayTable
(
  col2 ARRAY DEFAULT []
);

INSERT INTO test.arrayTable SELECT [4, 10, 55];
INSERT INTO test.arrayTable SELECT [6, 7, 33];
INSERT INTO test.arrayTable SELECT [50, 12, 22];

INSERT INTO test.anotherArrayTable SELECT [9, 11, 52];
INSERT INTO test.anotherArrayTable SELECT [3, 18, 11];
INSERT INTO test.anotherArrayTable SELECT [33, 27, 43];

インデックスによる ARRAY アクセス

BigQuery
SELECT
col1[0] + 4 AS byIndex,
col1[OFFSET(0)] + 4 AS byOffset,
col1[ORDINAL(1)] + 4 AS byOrdinal
FROM test.arrayTable ORDER BY col1[0];
Snowflake
SELECT
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0] + 4 AS byIndex,
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0] + 4 AS byOffset,
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[1 - 1] + 4 AS byOrdinal
FROM
test.arrayTable
ORDER BY
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0];

インデックスによる安全な ARRAY アクセス

BigQuery
SELECT
col1[SAFE_OFFSET(0)] AS byOffsset,
col1[SAFE_OFFSET(-4)] AS byOffsetUnderflow,
col1[SAFE_OFFSET(500)] AS byOffsetOverflow,
col1[SAFE_ORDINAL(1)] AS byOrdinal,
col1[SAFE_ORDINAL(-4)] AS byOrdinalUnderflow,
col1[SAFE_ORDINAL(500)] AS byOrdinalOverflow
FROM test.arrayTable ORDER BY col1[0];
Snowflake
SELECT
PUBLIC.SAFE_OFFSET_UDF(col1, 0) AS byOffsset,
PUBLIC.SAFE_OFFSET_UDF(col1, -4) AS byOffsetUnderflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 500) AS byOffsetOverflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 1 - 1) AS byOrdinal,
PUBLIC.SAFE_OFFSET_UDF(col1, -4 - 1) AS byOrdinalUnderflow,
PUBLIC.SAFE_OFFSET_UDF(col1, 500 - 1) AS byOrdinalOverflow
FROM test.arrayTable ORDER BY 
--** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
col1[0];

VALUES 句に ARRAY を含む INSERT

BigQuery
INSERT INTO test.arrayTable VALUES ([4, 10]);

INSERT INTO test.arrayTable (COL1)
VALUES ([1, 2, 3]), ([4, 5, 6]);

SELECT col1 FROM test.arrayTable ORDER BY col1[0], col1[1];
Snowflake
INSERT INTO test.arrayTable SELECT [4, 10];

INSERT INTO test.arrayTable (COL1)
SELECT [1, 2, 3] 
UNION ALL
SELECT [4, 5, 6];

SELECT col1 FROM
  test.arrayTable
ORDER BY
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col1[0],
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col1[1];

MERGE ステートメント

BigQuery
MERGE INTO test.anotherArrayTable
USING test.arrayTable
ON col1[0] = col2[0]
WHEN MATCHED THEN UPDATE SET col2 = col1
WHEN NOT MATCHED THEN INSERT VALUES ([100, 100, 100]);

SELECT col2 FROM test.anotherArrayTable ORDER BY col2[0];
Snowflake
MERGE INTO test.anotherArrayTable
USING test.arrayTable
ON col1[0] = col2[0]
WHEN MATCHED THEN UPDATE SET col2 = col1
WHEN NOT MATCHED THEN INSERT VALUES ([100, 100, 100]) !!!RESOLVE EWI!!! /*** SSC-EWI-0073 - PENDING FUNCTIONAL EQUIVALENCE REVIEW FOR 'MergeStatement' NODE ***/!!!;

SELECT col2 FROM
  test.anotherArrayTable
ORDER BY
  --** SSC-FDM-BQ0001 - ACCESSING ARRAYS PRODUCES NULL INSTEAD OF AN ERROR FOR POSITIVE OUT OF BOUNDS INDEXES IN SNOWFLAKE **
  col2[0];

ARRAY DEFAULT 列値の挿入/更新

BigQuery
 INSERT INTO test.arrayTable VALUES (DEFAULT);

UPDATE test.arrayTable
SET col1 = DEFAULT
WHERE TRUE;

SELECT col1 FROM test.arrayTable;
Snowflake
 INSERT INTO test.arrayTable SELECT [];

UPDATE test.arrayTable
SET col1 = DEFAULT
WHERE TRUE;

SELECT col1 FROM test.arrayTable;

INSERT/UPDATE、NULL 値

BigQuery
 INSERT INTO test.arrayTable
  SELECT
    numbers
  FROM
    (SELECT [6] AS numbers
    UNION ALL
    SELECT CAST(NULL AS ARRAY<INT64>));

UPDATE test.arrayTable
SET col1 = NULL
WHERE ARRAY_LENGTH(col1) > 1;

SELECT col1 FROM test.arrayTable ORDER BY ARRAY_LENGTH(col1);
Snowflake
INSERT INTO test.arrayTable
SELECT
  numbers
FROM
  (SELECT [6] AS numbers
  UNION ALL
  SELECT IFNULL(CAST(NULL AS ARRAY), []));

UPDATE test.arrayTable
SET col1 = IFNULL(NULL, [])
WHERE ARRAY_SIZE(col1) > 1;

SELECT col1 FROM test.arrayTable ORDER BY ARRAY_SIZE(col1);

ARRAY 連結

BigQuery
SELECT [50, 30, 12] || [22, 33, 44] AS result;
Snowflake
SELECT ARRAY_CAT([50, 30, 12], [22, 33, 44]) AS result;

ARRAY はパラメーター/戻り値の型として使用されます

BigQuery
CREATE FUNCTION test.myArrayFunction (valuesArray ARRAY<INT64>, otherValue INTEGER)
RETURNS ARRAY<INT64>
AS
(
  valuesArray || [otherValue]
);

SELECT test.myArrayFunction([5, 20, 10], 55) AS result;
Snowflake
CREATE FUNCTION test.myArrayFunction (valuesArray ARRAY, otherValue INTEGER)
RETURNS ARRAY
AS
$$
  ARRAY_CAT(valuesArray, [otherValue])
$$;

SELECT test.myArrayFunction([5, 20, 10], 55) AS result;

既知の問題

1.非安全な ARRAY アクセスは、正の範囲外インデックスに対しては失敗しません

BigQuery では、 SAFE_OFFSET または SAFE_ORDINAL を使用しない場合、インデックス値が低すぎる(アンダーフロー)または高すぎる(オーバーフロー)場合、インデックスによる配列要素へのアクセスは失敗します。しかし、Snowflakeではエラーはアンダーフローの場合にのみスローされ、オーバーフローエラーが発生するインデックスは代わりに NULL 値を生成します。

配列内の要素への安全でないアクセスが検出されると、 SnowConvert AI は[SSC-FDM-BQ0001](../../general/technical-documentation/issues-and-troubleshooting/function-difference/bigqueryFDM.md#ssc-fdm-bq0001)を生成して、これについてユーザーに警告します。

BYTES

バイトデータ型と使用法

説明

バイナリ文字列内で許可される最大Lバイトのバイトシーケンス。最大長は8 MB (8,388,608バイト)です。詳細については、[BigQuery BYTES データ型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#bytes_type)をご参照ください。

注釈

BYTES データ型はSnowflakeではサポートされていません。現在[BINARY](https://docs.snowflake.com/en/sql-reference/data-types-text#binary)に変換されています。

サンプルソースパターン

BYTES 出力形式

BigQuery のバイナリデータ型のデフォルトの出力形式は 'BASE64'、Snowflake では 'HEX' です。このため、バイナリ列が選択が選択されると、[BASE64_ENCODE](https://docs.snowflake.com/en/sql-reference/functions/base64_encode)関数が自動的に追加されます。BigQuery のデフォルトの形式を維持するためです。

BigQuery
 CREATE OR REPLACE TABLE bytesTable
(
  COL1 BYTES,
  COL2 BYTES(20)
);

INSERT INTO bytesTable VALUES (B"01020304", B"""AABBCCDD""");
INSERT INTO bytesTable VALUES (B'''\x01\x02\x03''', B"/+A=");

SELECT COL1 FROM bytesTable;
Snowflake:
CREATE OR REPLACE TABLE bytesTable
(
  COL1 BINARY,
  COL2 BINARY(20)
);

INSERT INTO bytesTable
SELECT
  TRY_TO_BINARY('01020304', 'utf-8'),
  TRY_TO_BINARY('AABBCCDD', 'utf-8');
  
INSERT INTO bytesTable
SELECT
  TRY_TO_BINARY('\x01\x02\x03', 'utf-8'),
  TRY_TO_BINARY('/+A=', 'utf-8');
  
SELECT BASE64_ENCODE( COL1) FROM bytesTable;

自動的に追加されず、 BASE64 形式でデータを表示したい場合は、[BASE64_ENCODE](https://docs.snowflake.com/en/sql-reference/functions/base64_encode)関数を使用するか、[BINARY_OUTPUT_FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#binary-output-format)形式を設定できます。


BYTES リテラル

以下のケースは、 BigQuery でバイトリテラルをフォーマットするために使用できる形式を表しています。

 B"abc"
B'''abc'''
b"""abc"""

Snowflakeではこれらのリテラルはサポートされていませんが、代わりに[TRY_TO_BINARY](https://docs.snowflake.com/en/sql-reference/functions/try_to_binary)関数を使用して入力式をバイナリ値に変換できます。この関数は、[TO _BINARY](https://docs.snowflake.com/en/sql-reference/functions/to_binary)の特別バージョンで、同じ操作を実行しますが、エラー処理がサポートされています。

変換のバイナリ形式は HEX 、 BASE64 、または UTF-8 になる可能性があることを考慮することが重要です。デフォルトは[BINARY_INPUT_FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#binary-input-format)セッションパラメーターの値です。このパラメーターが設定されていない場合、デフォルト値は HEX です。

観察

  • BigQuery のバイナリデータ型のデフォルトの出力形式は 'BASE64' 、Snowflakeでは 'HEX' であることに注意してください。データを BASE64 形式で表示するには、[BASE64_ENCODE](https://docs.snowflake.com/en/sql-reference/functions/base64_encode)関数を使用するか、[BINARY_OUTPUT_FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#binary-output-format)形式を設定できます。

  • Snowflakeでサポートされている形式は、 HEX BASE64 または UTF-8のみです。詳細については、Snowflakeの[バイナリ入出力](https://docs.snowflake.com/en/user-guide/binary-input-output)をご参照ください。

  • 値句へのデータ挿入に使用されるバイナリ関数は、Snowflakeではサポートされていません。

GEOGRAPHY

GEOGRAPHY データタイプと使用法

説明

点、ラインストリング、ポリゴンの集合であり、点集合として、または地球表面の一部として表現されます。詳細については、[BigQuery GEOGRAPHY データ型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#geography_type)ご参照ください。

Success

Snowflakeでサポートされているデータ型。

サンプルソースパターン

GEOGRAPHY 出力形式

BigQuery における地理データ型のデフォルトの出力形式は WKT(Well-Known Text)**で、Snowflakeでは **WKB (Well-Known Binary)**です。このため、地理列が選択されると、[ST_ASWKT](https://docs.snowflake.com/en/sql-reference/functions/st_aswkt)関数が自動的に追加されます。また、テーブルのすべての列が選択され、それに地理列が含まれている場合、[GEOGRAPHY_OUTPUT_FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#geography-output-forma)は WKT に設定されます。これはデフォルトの BigQuery 形式を維持するためです。

BigQuery
CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType VALUES
    (ST_GEOGFROMTEXT('POINT(-122.35 37.55)')), (ST_GEOGFROMTEXT('LINESTRING(-124.20 42.00, -120.01 41.99)'));

SELECT COL1 FROM test.geographyType;
SELECT * FROM test.geographyType;	
Snowflake
CREATE OR REPLACE TABLE test.geographyType
(
  COL1 GEOGRAPHY
);

INSERT INTO test.geographyType
VALUES
    (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'POINT(-122.35 37.55)'), (
     --** SSC-FDM-BQ0010 - THE FUNCTION 'ST_GEOGFROMTEXT' IS NOT REQUIRED IN SNOWFLAKE. **
     'LINESTRING(-124.20 42.00, -120.01 41.99)');
     
SELECT ST_ASWKT( COL1) FROM test.geographyType;
            
ALTER SESSION SET GEOGRAPHY_OUTPUT_FORMAT = 'WKT';
SELECT * FROM test.geographyType;

自動的に追加されず、 WKT 形式でデータを表示する場合は、ST_ASWKT 関数を使用するか、[GEOGRAPHY_OUTPUT_FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#geography-output-format)形式を設定できます。


GEOGRAPHY データを挿入

地理型列にデータを挿入する場合、Snowflakeはデータが[WGS 84 標準](https://spatialreference.org/ref/epsg/wgs-84/)に準拠していることを自動的に検出するため、関数は必要ありません。

観察

  • 地理データ型のデフォルトの出力形式は WKT **(Well-Known Text)**であり、Snowflakeでは **WKB (Well-Known Binary)**であることに注意してください。また、WKT形式で表示する場合は、[ST_ASWKT](https://docs.snowflake.com/en/sql-reference/functions/st_aswkt)関数を使用するか、[GEOGRAPHYOUTPUT FORMAT](https://docs.snowflake.com/en/sql-reference/parameters#geography-output-format)形式を設定できます。

  • 値句にデータを挿入するために使用される地理関数は、Snowflakeでは必要ありません。

関連 EWIs

  1. [SSC-FDM-BQ0010](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/bigqueryFDM.md#ssc-fdm-bq0010):地理機能はSnowflakeでは必要ありません。

INTERVAL

インターバルデータの型と使用法

説明

An INTERVAL object represents duration or amount of time, without referring to any specific point in time. By default, it is transformed to VARCHAR because Snowflake historically did not support a stored INTERVAL type (BigQuery Language Reference INTERVAL Data Type).

注釈

Preview Feature: When the --UseIntervalDatatype preview flag is enabled, BigQuery INTERVAL columns are preserved as native Snowflake INTERVAL DAY TO SECOND types instead of being converted to VARCHAR. Interval literals and expressions are also normalized to Snowflake-compatible syntax. See the Interval Data Types translation reference for complete transformation details.

構文

INTERVAL int64_expression datetime_part

INTERVAL datetime_parts_string starting_datetime_part TO ending_datetime_part

サンプルソースパターン

単一の DateTime 部分を持つ間隔

BigQuery
SELECT INTERVAL 1 YEAR;

SELECT CURRENT_DATE + INTERVAL 1 YEAR, 
  CURRENT_DATE + INTERVAL 1 QUARTER,
  CURRENT_DATE + INTERVAL 1 MONTH,
  CURRENT_DATE + INTERVAL 1 WEEK,
  CURRENT_DATE + INTERVAL 1 DAY,
  CURRENT_DATE + INTERVAL 1 HOUR,
  CURRENT_DATE + INTERVAL 1 MINUTE,
  CURRENT_DATE + INTERVAL 1 SECOND;
結果
1-0 0 0:0:0
2024-10-13T00:00:00
2024-01-13T00:00:00
2023-11-13T00:00:00
2023-10-20T00:00:00
2023-10-14T00:00:00
2023-10-13T01:00:00
2023-10-13T00:01:00
2023-10-13T00:00:01

Snowflake
SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO  ***/!!! INTERVAL 1 YEAR;

SELECT
CURRENT_DATE() + INTERVAL '1 year',
CURRENT_DATE() + INTERVAL '1 quarter',
CURRENT_DATE() + INTERVAL '1 month',
CURRENT_DATE() + INTERVAL '1 week',
CURRENT_DATE() + INTERVAL '1 day',
CURRENT_DATE() + INTERVAL '1 hour',
CURRENT_DATE() + INTERVAL '1 minute',
CURRENT_DATE() + INTERVAL '1 second';
結果
2024-10-13
2024-01-13
2023-11-13
2023-10-20
2023-10-14
2023-10-13 01:00:00.000
2023-10-13 00:01:00.000
2023-10-13 00:00:01.000

Snowflakeでは、Interval データ型が直接クエリされるシナリオはサポートされていません。逆に、指定された日付の演算子として使用される場合は、[Interval定数](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#interval-constants)を使用して変換されます(可能な場合)。


DateTime 部分範囲を持つインターバル

BigQuery
 SELECT INTERVAL '2-1 10' YEAR TO DAY;

SELECT CURRENT_DATE + INTERVAL '2-11' YEAR TO MONTH,
  CURRENT_DATE + INTERVAL '2-11 28' YEAR TO DAY,
  CURRENT_DATE + INTERVAL '2-11 28 16' YEAR TO HOUR,
  CURRENT_DATE + INTERVAL '2-11 28 16:15' YEAR TO MINUTE,
  CURRENT_DATE + INTERVAL '2-11 28 16:15:14' YEAR TO SECOND,
  CURRENT_DATE + INTERVAL '11 28' MONTH TO DAY,
  CURRENT_DATE + INTERVAL '11 28 16' MONTH TO HOUR,
  CURRENT_DATE + INTERVAL '11 28 16:15' MONTH TO MINUTE,
  CURRENT_DATE + INTERVAL '11 28 16:15:14' MONTH TO SECOND,
  CURRENT_DATE + INTERVAL '28 16' DAY TO HOUR,
  CURRENT_DATE + INTERVAL '28 16:15' DAY TO MINUTE,
  CURRENT_DATE + INTERVAL '28 16:15:14' DAY TO SECOND,
  CURRENT_DATE + INTERVAL '16:15' HOUR TO MINUTE,
  CURRENT_DATE + INTERVAL '16:15:14' HOUR TO SECOND,
  CURRENT_DATE + INTERVAL '15:14' MINUTE TO SECOND;
結果
2-1 10 0:0:0
2026-09-13T00:00:00
2026-10-11T00:00:00
2026-10-11T16:00:00
2026-10-11T16:15:00
2026-10-11T16:15:14
2024-10-11T00:00:00
2024-10-11T16:00:00
2024-10-11T16:15:00
2024-10-11T16:15:14
2023-11-10T16:00:00
2023-11-10T16:15:00
2023-11-10T16:15:14
2023-10-13T16:15:00
2023-10-13T16:15:14
2023-10-13T00:15:14

Snowflake
 SELECT
!!!RESOLVE EWI!!! /*** SSC-EWI-0107 - INTERVAL LITERAL IS NOT SUPPORTED BY SNOWFLAKE IN THIS SCENARIO  ***/!!! INTERVAL '2-1 10' YEAR TO DAY;

SELECT
CURRENT_DATE() + INTERVAL '2y, 11mm',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '11mm, 28d',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '11mm, 28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '28d, 16h',
CURRENT_DATE() + INTERVAL '28d, 16h, 15m',
CURRENT_DATE() + INTERVAL '28d, 16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '16h, 15m',
CURRENT_DATE() + INTERVAL '16h, 15m, 14s',
CURRENT_DATE() + INTERVAL '15m, 14s';
結果
2026-09-13
2026-10-11
2026-10-11 16:00:00.000
2026-10-11 16:15:00.000
2026-10-11 16:15:14.000
2024-10-11
2024-10-11 16:00:00.000
2024-10-11 16:15:00.000
2024-10-11 16:15:14.000
2023-11-10 16:00:00.000
2023-11-10 16:15:00.000
2023-11-10 16:15:14.000
2023-10-13 16:15:00.000
2023-10-13 16:15:14.000
2023-10-13 00:15:14.000

インターバルの値は、サポートされているSnowflake形式に変換され、列の中にテキストとして挿入されます。 Snowflakeはデータ型としてインターバルをサポートしていないため、算術演算でのみサポートされます。 値を使用するためには、その値を抽出し、[インターバル定数](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#interval-constants)として使用する必要があります(可能な場)。


列データ型としてのインターバル

BigQuery
 CREATE OR REPLACE TABLE test.my_table (
  id INT NOT NULL,
  interval_column INTERVAL
);

INSERT INTO test.my_table
VALUES (1, INTERVAL '2-11 28' YEAR TO DAY);

INSERT INTO test.my_table
VALUES (2, INTERVAL '2-11 28 16:15:14' YEAR TO SECOND);

INSERT INTO test.my_table
VALUES (3, INTERVAL '11 28 16:15:14' MONTH TO SECOND);

INSERT INTO test.my_table
VALUES (4, INTERVAL '15:14' MINUTE TO SECOND);

SELECT * FROM test.my_table;
結果

ID

interval_column

1

2-11 28 0:0:0

2

2-11 28 16:15:14

3

0-11 28 16:15:14

4

0-0 0 0:15:14

Snowflake
 CREATE OR REPLACE TABLE test.my_table (
  id INT NOT NULL,
interval_column VARCHAR(30) !!!RESOLVE EWI!!! /*** SSC-EWI-0036 - INTERVAL DATA TYPE CONVERTED TO VARCHAR ***/!!!
)
COMMENT = '{ "origin": "sf_sc", "name": "snowconvert", "version": {  "major": 0,  "minor": 0,  "patch": "0" }, "attributes": {  "component": "bigquery",  "convertedOn": "04/01/2025",  "domain": "test" }}';

INSERT INTO test.my_table
VALUES (1, '2y, 11mm, 28d');

INSERT INTO test.my_table
VALUES (2, '2y, 11mm, 28d, 16h, 15m, 14s');

INSERT INTO test.my_table
VALUES (3, '11mm, 28d, 16h, 15m, 14s');

INSERT INTO test.my_table
VALUES (4, '15m, 14s');

SELECT * FROM
test.my_table;
結果

ID

interval_column

1

2y, 11mm, 28d

2

2y, 11mm, 28d, 16h, 15m, 14s

3

11mm, 28d, 16h, 15m, 14s

4

15m, 14s

BigQuery では、datetime_partは次の標準形式に従います。

[sign]Y-M [sign]D [sign]H:M:S[.F]


インターバル比較

BigQuery
SELECT INTERVAL 1 YEAR = INTERVAL 1 YEAR;

SELECT CURRENT_DATE + INTERVAL '-2 -16' DAY TO HOUR =  CURRENT_DATE + INTERVAL '-2 -16' DAY TO HOUR;

SELECT INTERVAL '-2 -16' DAY TO HOUR != INTERVAL '-2 16' DAY TO HOUR,
  INTERVAL '-2 -16' DAY TO HOUR <> INTERVAL '-2 16' DAY TO HOUR,
  INTERVAL '2 16:15' DAY TO MINUTE = INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE > INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE >= INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE < INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '2 16:15' DAY TO MINUTE <= INTERVAL '2 -16:15' DAY TO MINUTE,
  INTERVAL '1-5' YEAR TO MONTH = INTERVAL '1-5' YEAR TO MONTH,
  INTERVAL '1-5' YEAR TO MONTH > INTERVAL '2 16' DAY TO HOUR,
  INTERVAL '2-11 28 16:15:14.222' YEAR TO SECOND = INTERVAL '2-11 28 16:15:14.222' YEAR TO SECOND,
  INTERVAL '1-1 3' YEAR TO DAY = INTERVAL '13 3' MONTH TO DAY,
  INTERVAL '1-5' YEAR TO MONTH > INTERVAL '2 16' DAY TO HOUR;
Snowflake
SELECT
'1 year' = '1 year';

SELECT
CURRENT_DATE() + INTERVAL '-2d, -16h' = CURRENT_DATE() + INTERVAL '-2d, -16h';

SELECT
CURRENT_TIMESTAMP + INTERVAL '-2d, -16h' != CURRENT_TIMESTAMP + INTERVAL '-2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '-2d, -16h' <> CURRENT_TIMESTAMP + INTERVAL '-2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' = CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' > CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' >= CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' < CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '2d, 16h, 15m' <= CURRENT_TIMESTAMP + INTERVAL '2d, -16h, -15m',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' = CURRENT_TIMESTAMP + INTERVAL '1y, 5mm',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' > CURRENT_TIMESTAMP + INTERVAL '2d, 16h',
CURRENT_TIMESTAMP + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s, 222ms' = CURRENT_TIMESTAMP + INTERVAL '2y, 11mm, 28d, 16h, 15m, 14s, 222ms',
CURRENT_TIMESTAMP + INTERVAL '1y, 1mm, 3d' = CURRENT_TIMESTAMP + INTERVAL '13mm, 3d',
CURRENT_TIMESTAMP + INTERVAL '1y, 5mm' > CURRENT_TIMESTAMP + INTERVAL '2d, 16h';

ご存知のとおり、Snowflakeは算術演算のデータ型としててインターバルのみをサポートしています。そのため、比較を正しくサポートするために、各オペランドに CURRENT_TIMESTAMP 関数が追加されています。

既知の問題

1.算術演算のみがサポートされています

Snowflakeインターバルにはいくつかの制限があります。 DATE 、またはTIMESTAMP と[間隔定数](https://docs.snowflake.com/en/sql-reference/data-types-datetime.html#interval-constants)の間の算術演算のみがサポートされており、その他のシナリオはサポートされていません。

2.インターバルデータ型で符号を扱う

BigQuery では、年月に対応する部分文字列の前に記号(+ -)がある場合、それは年と月の両方に影響します。同様の方法で、時刻に対応する部分文字列にも適用されます。この場合、以下は時、分、秒に影響します。その例を以下に示します。

BigQuery
SELECT CURRENT_DATE + INTERVAL '-2-11 -28 -16:15:14.222' YEAR TO SECOND;
Snowflake
 SELECT CURRENT_DATE + INTERVAL '-2y, -11mm, -28d, -16h, -15m, -14s, -222ms';

関連 EWIs

  1. SSC-EWI-0036: データ型が別のデータ型に変換されました。

  2. SSC-EWI-0107: 現在のシナリオでは間隔リテラルはサポートされていません。

JSON

Jsonデータ型と使用法

説明

軽量データ交換形式である JSON を表します。詳細については、[BigQuery JSON データ型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#json_typ)をご参照ください。

危険

JSON データ型はSnowflakeではサポートされておらず、現在は[VARIANT](https://docs.snowflake.com/en/sql-reference/data-types-semistructured#variant)に変換されます。


JSON リテラル

 JSON 'json_formatted_data'

詳細については、[JSON BigQuery のリテラル](https://cloud.google.com/bigquery/docs/reference/standard-sql/lexical#json_literals)をご参照ください。

これらのリテラルはSnowflakeではサポートされていませんが、代わりに[PARSE_JSON](https://docs.snowflake.com/en/sql-reference/functions/parse_json)関数を使用して入力式をJSON型に変換できます。唯一の注意点は、この関数はSnowflakeの値句では使用できないことで、このためサブクエリに変換されます。

サンプルソースパターン

BigQuery

CREATE OR REPLACE TABLE test.jsonType
(
  COL1 JSON
);

INSERT INTO test.jsonType
VALUES
  (JSON'{"name": "John", "age": 30, "city": "New York"}'), 
  (JSON'{"name": "Alice", "age": 28, "city": "San Francisco"}');  
  
SELECT * FROM test.jsonType;

SELECT JSON'{"name": "John", "age": 30, "city": "New York"}';

Snowflake

CREATE OR REPLACE TABLE test.jsonType
(
  COL1 VARIANT
);

INSERT INTO test.jsonType
SELECT
  PARSE_JSON('{"name": "John", "age": 30, "city": "New York"}')
UNION ALL
SELECT
  PARSE_JSON('{"name": "Alice", "age": 28, "city": "San Francisco"}');

SELECT * FROM test.jsonType;

SELECT
  PARSE_JSON('{"name": "John", "age": 30, "city": "New York"}');

STRUCT

BigQuery からSnowflakeへの STRUCT データ型の変換仕様。

説明

BigQuery では、それぞれ型(必須)とフィールド名(オプション)を持つ順序付けされたフィールドのコンテナが含まれます。[構造型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#struct_typ)をご参照ください。

Snowflakeでは、[OBJECT_CONSTRUCT](https://docs.snowflake.com/en/sql-reference/functions/object_construct)を使用して STRUCT の動作をエミュレートでき、 SnowConvert AI がほとんどの実装の違いを処理します。

注釈

OBJECT_CONSTRUCT 内のキーを表す引数は、ターゲット STRUCT の元の名前である必要があります。STRUCT 式本体内で指定された名前は、ターゲットSTRUCT で見つかった名前に置き換えられます。以下のデータパターンの例のほとんどは、名前をターゲット名に置き換えた例を含んでいます。

サンプルソースパターン

BigQuery

CREATE OR REPLACE TABLE test.structTypes
(
    COL1 STRUCT<sc1 INT64>,
    COL2 STRUCT<sc2 STRING(10)>,
    COL3 STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>,
    COL4 STRUCT<sc4 ARRAY<INT64>>,
    COL5 STRUCT<sc5 INT64, sc51 INT64>,
    COL7 STRUCT<sc7 INT64 OPTIONS(description = "A repeated STRING field"), sc71 BOOL>,
    COL8 STRUCT<sc8 INT64 NOT NULL, sc81 BOOL NOT NULL OPTIONS(description = "A repeated STRING field")>
);
    
CREATE OR REPLACE TABLE test.tuple_sample (
  COL1 STRUCT<Key1 INT64, Key2 INT64>
);

Snowflake

CREATE OR REPLACE TABLE test.structTypes
(
    COL1 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL2 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<STRING(10)> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL3 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<STRUCT<INT64, INT64>> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL4 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL5 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL7 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/,
    COL8 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, BOOLEAN> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
);

CREATE OR REPLACE TABLE test.tuple_sample (
  COL1 VARIANT /*** SSC-FDM-BQ0009 - STRUCT<INT, INT> CONVERTED TO VARIANT. SOME OF ITS USAGES MIGHT HAVE FUNCTIONAL DIFFERENCES. ***/
);

STRUCT 列に INT データ型を挿入する

BigQuery
INSERT INTO test.structTypes (COL1) VALUES
(STRUCT(1)), 
(STRUCT<INT64>(2)), 
(STRUCT<a INT64>(3)), 
(STRUCT<sc1 INT64>(4)), 
(STRUCT<sc1 INT64>(5));
Snowflake
INSERT INTO test.structTypes (COL1)
SELECT
    OBJECT_CONSTRUCT('sc1', 1 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 2 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 3 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 4 :: INT)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc1', 5 :: INT);

STRUCT 列に STRING データ型を挿入する

BigQuery
INSERT INTO test.structTypes (COL2) VALUES
(STRUCT('t1')), 
(STRUCT<STRING>('t2')), 
(STRUCT<sc2 STRING>('t3'));
Snowflake
INSERT INTO test.structTypes (COL2)
SELECT
    OBJECT_CONSTRUCT('sc2', 't1' :: STRING)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc2', 't2' :: STRING)
UNION ALL
SELECT
    OBJECT_CONSTRUCT('sc2', 't3' :: STRING);

STRUCT 列に STRUCT データ型を挿入する

BigQuery
INSERT INTO test.structTypes (COL3) VALUES
(STRUCT(STRUCT(1,2))), 
(STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>(STRUCT<INT64, INT64>(3, 4))),
(STRUCT<sc3 STRUCT<sc31 INT64, sc32 INT64>>(STRUCT<sc31 INT64, sc32 INT64>(5, 6))),
(STRUCT<STRUCT<INT64,INT64>>(STRUCT<INT64, INT64>(7, 8))),
(STRUCT<STRUCT<INT64,INT64>>(STRUCT(9, 10)));
Snowflake
INSERT INTO test.structTypes (COL3)
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 1 :: INT, 'sc32', 2 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 3 :: INT, 'sc32', 4 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 5 :: INT, 'sc32', 6 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 7 :: INT, 'sc32', 8 :: INT))
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 9 :: INT, 'sc32', 10 :: INT));

STRUCT 列に ARRAY データ型を挿入する

BigQuery
INSERT INTO test.structTypes (COL4) VALUES
(STRUCT([1,2,3,4])), 
(STRUCT<sc4 ARRAY<INT64>>(ARRAY[5,6,7])), 
(STRUCT<ARRAY<INT64>>([8,9,10,11]));
Snowflake
INSERT INTO test.structTypes (COL4)
SELECT
  OBJECT_CONSTRUCT('sc4', [1,2,3,4] :: ARRAY)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc4', [5,6,7] :: ARRAY)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc4', [8,9,10,11] :: ARRAY);

選択された STRUCT 列への挿入

BigQuery
INSERT INTO test.structTypes (COL7, COL8) VALUES
(STRUCT(1,true), STRUCT(2,false)), 
(STRUCT<INT64, BOOL>(3, false), STRUCT<INT64, BOOL>(4, false)), 
(STRUCT<a INT64, b BOOL>(5, true), STRUCT<a INT64, b BOOL>(6, true));
Snowflake
INSERT INTO test.structTypes (COL7, COL8)
SELECT
  OBJECT_CONSTRUCT('sc7', 1 :: INT, 'sc71', true),
  OBJECT_CONSTRUCT('sc8', 2 :: INT, 'sc81', false)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc7', 3 :: INT, 'sc71', false),
  OBJECT_CONSTRUCT('sc8', 4 :: INT, 'sc81', false)
UNION ALL
SELECT
  OBJECT_CONSTRUCT('sc7', 5 :: INT, 'sc71', true),
  OBJECT_CONSTRUCT('sc8', 6 :: INT, 'sc81', true);

STRUCT 列タプル構文への挿入

警告

タプル構文値の変換は現在サポートされていません。

BigQuery
INSERT INTO test.tuple_sample
VALUES
  ((12, 34)),
  ((56, 78)),
  ((9, 99)),
  ((12, 35));
Snowflake
INSERT INTO test.tuple_sample
!!!RESOLVE EWI!!! /*** SSC-EWI-BQ0012 - SNOWCONVERT AI WAS UNABLE TO GENERATE A CORRECT OBJECT_CONSTRUCT PARAMETER. MISSING SYMBOL INFORMATION. ***/!!!
VALUES
  ((12, 34)),
  ((56, 78)),
  ((9, 99)),
  ((12, 35));



STRUCT 列の更新

BigQuery
UPDATE test.structTypes
SET col1 = STRUCT(100 AS number)
WHERE col1.sc1 = 4;
Snowflake
UPDATE test.structTypes
    SET col1 = OBJECT_CONSTRUCT('sc1', 100 :: INT)
WHERE col1:sc1 = 4;

STRUCT 列フィールドの更新

BigQuery
UPDATE test.structTypes
SET col3 = STRUCT(STRUCT(80,90))
WHERE col3.sc3.sc31 = 20;
Snowflake
UPDATE test.structTypes
SET col3 = OBJECT_CONSTRUCT('sc3', OBJECT_CONSTRUCT('sc31', 80 :: INT, 'sc32', 90 :: INT))
WHERE col3:sc3:sc31 = 20;

STRUCT 列から選択

BigQuery
SELECT COL3.sc3 FROM test.structTypes;
SELECT COL3.sc3.sc32 FROM test.structTypes;
SELECT COL4.sc4 FROM test.structTypes WHERE COL4.sc4 IS NOT NULL;
Snowflake
SELECT COL3:sc3
FROM
test.structTypes;
SELECT COL3:sc3:sc32
FROM
test.structTypes;
SELECT COL4:sc4
FROM
test.structTypes
WHERE COL4:sc4 IS NOT NULL;

STRUCT 列タプルの構文から選択

BigQuery
SELECT *
FROM test.tuple_sample
WHERE (COL1.Key1, COL1.Key2) IN ((12, 34), (56, 78));

SELECT STRUCT<x ARRAY<INT64>, y INT64>(COL4.sc4, COL1.sc1)
FROM test.structTypes
WHERE COL1.sc1 IS NOT NULL;
Snowflake
SELECT *
FROM
test.tuple_sample
WHERE (COL1:Key1, COL1:Key2) IN ((12, 34), (56, 78));

SELECT
OBJECT_CONSTRUCT('x', COL4:sc4 :: ARRAY, 'y', COL1:sc1 :: INT)
FROM
test.structTypes
WHERE COL1:sc1 IS NOT  NULL;

匿名 STRUCT 定義を使用してビューを作成する

BigQuery
CREATE OR REPLACE TABLE project-test.mydataset.sourcetable (
  id STRING,
  payload JSON
);

CREATE VIEW project-test.mydataset.myview AS 
SELECT
  id,
  STRUCT(
    payload.user_id AS user_id,
    STRUCT(
      JSON_VALUE(payload, '$.details.ip_address') AS ip_address,
      JSON_VALUE(payload, '$.details.item_id') AS item_id,
      SAFE_CAST(JSON_VALUE(payload, '$.details.quantity') AS INT64) AS quantity,
      SAFE_CAST(JSON_VALUE(payload, '$.details.price') AS FLOAT64) AS price,
      JSON_VALUE(payload, '$.details.text') AS text
    ) AS details
  ) AS structured_payload
  FROM project-test.mydataset.sourcetable;
Snowflake
CREATE OR REPLACE TABLE "project-test".mydataset.sourcetable (
  id STRING,
  payload VARIANT
);

CREATE VIEW "project-test".mydataset.myview
AS
SELECT
  id,
  OBJECT_CONSTRUCT('user_id',
  payload:user_id, 'details', OBJECT_CONSTRUCT('ip_address', JSON_EXTRACT_PATH_TEXT(payload, 'details.ip_address'), 'item_id', JSON_EXTRACT_PATH_TEXT(payload, 'details.item_id'), 'quantity', TRY_CAST(JSON_EXTRACT_PATH_TEXT(payload, 'details.quantity') AS INT), 'price', TRY_CAST(JSON_EXTRACT_PATH_TEXT(payload, 'details.price') AS FLOAT), 'text', JSON_EXTRACT_PATH_TEXT(payload, 'details.text'))) AS structured_payload
  FROM
  "project-test".mydataset.sourcetable;

STRUCT 列比較式

BigQuery 構造体の比較演算では、キーが存在する場合はそれを無視して値同士を比較します。一方、Snowflakeのオブジェクトの比較演算では、値とキーの両方を比較します。このため、比較によっては異なる結果を返すことがあります。

BigQuery
SELECT * FROM test.structTypes WHERE COL1 NOT IN (COL2);
SELECT * FROM test.structTypes WHERE COL1 <> (COL2);
SELECT * FROM test.structTypes WHERE COL1 != (COL2);
Snowflake
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 NOT IN (COL2);
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 <> (COL2);
SELECT * FROM
test.structTypes
--** SSC-FDM-BQ0008 - WHERE CLAUSE REFERENCES A COLUMN OF STRUCT TYPE. COMPARISON OPERATIONS MAY PRODUCE DIFFERENT RESULTS IN SNOWFLAKE. **
WHERE COL1 != (COL2);

関連 EWIs

  1. [SSC-FDM-BQ0010](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/bigqueryFDM.md#ssc-fdm-bq0010):構造体が VARIANT に変換されました。使用方法によっては機能上の違いがある場合があります。

  2. SSC-EWI-BQ0012: SnowConvert AI was unable to generate a correct OBJECT_CONSTRUCT parameter. Missing symbol information.

  3. [SSC-FDM-BQ0008](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/bigqueryFDM.md#ssc-fdm-bq0008):Where句は STRUCT 型の列を参照します。

TIMESTAMP

タイムスタンプのデータ型と使用法

説明

タイムスタンプ値は、タイムゾーンや夏時間( DST )などの規則に依存せず、マイクロ秒単位の精度で絶対的な時点を表します。詳細については、[BigQuery タイムスタンプデータ型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#timestamp_type)をご参照ください。

文法構文

NameRange
TIMESTAMP0001-01-01 00:00:00 to 9999-12-31 23:59:59.999999 UTC

Success

TIMESTAMP データ型は現在[TIMESTAMP_TZ](https://docs.snowflake.com/en/sql-reference/data-types-datetime#timestamp-ltz-timestamp-ntz-timestamp-t)に変換されています。

BigQuery は TIMESTAMP データを協定世界時( UTC )で保存することに注意してください。

サンプルソースパターン

時刻なしの TIMESTAMP

BigQuery
 CREATE OR REPLACE TABLE timestampTable
(
  COL1 TIMESTAMP
);

INSERT INTO timestampTable VALUES ('2008-12-26 15:30:00');
INSERT INTO timestampTable VALUES (TIMESTAMP'2008-12-27 18:30:00');
SELECT * FROM timestampTable;
結果
2008-12-26 15:30:00 UTC
2008-12-27 18:30:00 UTC

Snowflake
CREATE OR REPLACE TABLE timestampTable
(
  COL1 TIMESTAMP_TZ
);

INSERT INTO timestampTable VALUES ('2008-12-26 15:30:00');
INSERT INTO timestampTable VALUES (TIMESTAMP'2008-12-27 18:30:00');
SELECT * FROM timestampTable;
結果
2008-12-26 15:30:00.000 -0800
2008-12-27 18:30:00.000 -0800


タイムゾーンのある TIMESTAMP

タイムゾーンが定義されたら、[CONVERT_TIMEZONE](https://docs.snowflake.com/en/sql-reference/functions/convert_timezone)関数を使用してデータを協定世界時( UTC )で保存する必要があります。また、タイムスタンプリテラル内のタイムゾーン名はSnowflakeではサポートされていないため、その場合はこの関数も使用する必要があります。

BigQuery
CREATE OR REPLACE TABLE test.timestampType
(
  COL1 TIMESTAMP
);

INSERT INTO test.timestampType VALUES ('2008-12-25 15:30:00 America/Chicago');
INSERT INTO test.timestampType VALUES ('2018-04-05 12:00:00+02:00');
INSERT INTO test.timestampType VALUES ('2008-12-26 15:30:00-08:00');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-12-25 15:30:00 America/North_Dakota/New_Salem');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-04-05 12:00:00+02:00');
INSERT INTO test.timestampType VALUES (TIMESTAMP'2022-12-26 15:30:00-08:00');
SELECT * FROM test.timestampType ORDER BY COL1;
結果
2008-12-25 21:30:00 UTC	
2008-12-26 23:30:00 UTC	
2018-04-05 10:00:00 UTC	
2022-04-05 10:00:00 UTC	
2022-12-25 21:30:00 UTC	
2022-12-26 23:30:00 UTC
Snowflake
CREATE OR REPLACE TABLE test.timestampType
(
  COL1 TIMESTAMP_TZ
);

INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('America/Chicago', 'UTC', '2008-12-25 15:30:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC','2018-04-05 12:00:00+02:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC','2008-12-26 15:30:00-08:00'));

INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('America/North_Dakota/New_Salem', 'UTC', '2022-12-25 15:30:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC', '2022-04-05 12:00:00+02:00'));
INSERT INTO test.timestampType
VALUES (CONVERT_TIMEZONE('UTC', '2022-12-26 15:30:00-08:00'));
SELECT * FROM test.timestampType ORDER BY COL1;
結果
 2008-12-25 21:30:00.000 -0800
2008-12-26 23:30:00.000 +0000
2018-04-05 10:00:00.000 +0000
2022-04-05 10:00:00.000 +0000
2022-12-25 21:30:00.000 -0800
2022-12-26 23:30:00.000 +0000