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 データ型はSnowflakeではサポートされていません。代わりに VARCHAR が使用されます。詳細については、[INTERVAL](#interval)データ型のドキュメントをご参照ください。 |
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 TYPE を VARIANT に自動的に変換します。
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 において、配列は、配列以外の値の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では必要ありません。
INTERVAL¶
インターバルデータの型と使用法
説明¶
INTERVAL オブジェクトは、特定の時点を参照せずに、期間または時間の量を表します。Snowflakeには同等のものがないため、Varcharに変換されます([BigQuery 言語リファレンス INTERVAL データ型](https://cloud.google.com/bigquery/docs/reference/standard-sql/data-types#interval_type))。
構文
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¶
SSC-EWI-0036: データ型が別のデータ型に変換されました。
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 - UNABLE TO GENERATE CORRECT OBJECT_CONSTRUCT PARAMETER. SYMBOL INFORMATION COULD NOT BE COLLECTED. ***/!!!
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¶
[SSC-FDM-BQ0010](../../general/technical-documentation/issues-and-troubleshooting/functional-difference/bigqueryFDM.md#ssc-fdm-bq0010):構造体が VARIANT に変換されました。使用方法によっては機能上の違いがある場合があります。
[SSC-EWI-BQ0012](../../general/technical-documentation/issues-and-troubleshooting/conversion-issues/bigqueryEWI.md#ssc-ewi-bq0012):正しい OBJECT_CONSTRUCT パラメーターを生成できません。
[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)をご参照ください。
文法構文¶
| Name | Range |
|---|---|
| TIMESTAMP | 0001-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