Snowflake SQL 変換ガイド

このドキュメントでは、エンタープライズ データ ウェアハウス(EDW)から BigQuery への移行をスムーズに行えるように、Snowflake と BigQuery の SQL 構文の類似点と違いについて詳しく説明します。Snowflake データ ウェアハウジングは、Snowflake 固有の SQL 構文で動作するように設計されています。サービスによって SQL 言語に違いがあるため、Snowflake 用に作成したスクリプトをそのまま BigQuery で使用できない場合があります。バッチ SQL 変換を使用して SQL スクリプトを一括で移行することも、インタラクティブ SQL 変換を使用してアドホック クエリを変換することもできます。 Snowflake SQL は、プレビューでは両方のツールでサポートされています。

データ型

ここでは、Snowflake と BigQuery の間で対応するデータ型を示します。



Snowflake BigQuery メモ
NUMBER/ DECIMAL/NUMERIC NUMERIC Snowflake の NUMBER データ型は、38 桁の精度と 37 桁のスケールをサポートします。精度とスケールはユーザーに従って指定できます。

BigQuery では、NUMERICBIGNUMERIC一定の範囲で任意に指定された精度とスケールでサポートします。
INT/INTEGER BIGNUMERIC INT/INTEGER などの INT のようなデータ型(BIGINT, TINYINT, SMALLINT, BYTEINT など)は、精度とスケールを指定できず、常に NUMBER(38, 0) である NUMBER データ型のエイリアスを表します。
BIGINT BIGNUMERIC
SMALLINT BIGNUMERIC
TINYINT BIGNUMERIC
BYTEINT BIGNUMERIC
FLOAT/
FLOAT4/
FLOAT8
FLOAT64 Snowflake の FLOAT データ型は、「NaN」を X より大きい値に設定します。ここで、X は任意の FLOAT 値です(NaN 自体を除く)。

BigQuery の FLOAT データ型は、「NaN」を X より大きい値に設定します。ここで、X は任意の FLOAT 値です(NaN 自体を除く)。
DOUBLE/
DOUBLE PRECISION/

REAL
FLOAT64 Snowflake の DOUBLE データ型は Snowflake の FLOAT データ型と同義ですが、誤って FLOAT と表示されることがよくあります。これは DOUBLE として適切に保存されています。
VARCHAR STRING Snowflake の VARCHAR データ型の最大長は 16 MB(非圧縮)です。長さが指定されていない場合、デフォルトは最大長です。

BigQuery の STRING データ型は、可変長の UTF-8 エンコードされた Unicode として保存されます。最大で 16,000 文字です。
CHAR/CHARACTER STRING Snowflake の CHAR データ型の最大長は 1 です。
STRING/TEXT STRING Snowflake の STRING データ型は、Snowflake の VARCHAR と同義です。
BINARY BYTES
VARBINARY BYTES
BOOLEAN BOOL BigQuery の BOOL データ型は TRUE/FALSE のみを受け入れます。これは、TRUE/FALSE/NULL を受け入れる Snowflake の BOOL データ型とは異なります。
DATE DATE Snowflake の DATE 型は、ほとんどの日付形式を受け入れます。これは、'YYYY-[M]M-[D]D' 形式の日付のみを受け入れる BigQuery の DATE 型とは異なります。
TIME TIME Snowflake の TIME 型は 0~9 ナノ秒の精度をサポートしますが、BigQuery の TIME 型は 0~6 ナノ秒の精度をサポートします。
TIMESTAMP DATETIME TIMESTAMP はユーザーが構成可能なエイリアスで、デフォルトは BigQuery の DATETIME に対応する TIMESTAMP_NTZ です。
TIMESTAMP_LTZ TIMESTAMP
TIMESTAMP_NTZ/DATETIME DATETIME
TIMESTAMP_TZ TIMESTAMP
OBJECT JSON Snowflake の OBJECT 型は、明示的に型指定された値をサポートしていません。値の型は VARIANT です。
VARIANT JSON Snowflake の OBJECT 型は、明示的に型指定された値をサポートしていません。値の型は VARIANT です。
ARRAY ARRAY<JSON> Snowflake の ARRAY 型は VARIANT 型のみをサポートでき、BigQuery の ARRAY 型は配列自体を除くすべてのデータ型をサポートできます。

BigQuery には次のデータ型もあります。これらのデータ型に直接対応する Snowflake データ型はありません。

クエリ構文とクエリ演算子

ここでは、Snowflake と BigQuery のクエリ構文の違いについて説明します。

SELECT ステートメント

Snowflake の SELECT ステートメントの大部分は、BigQuery と互換性があります。次の表に小さな違いの一覧を示します。

Snowflake BigQuery

SELECT TOP ...

FROM table

SELECT expression

FROM table

ORDER BY expression DESC

LIMIT number

SELECT

x/total AS probability,

ROUND(100 * probability, 1) AS pct

FROM raw_data


注: Snowflake では、同じ SELECT ステートメント内でのエイリアスの作成と参照がサポートされます。

SELECT

x/total AS probability,

ROUND(100 * (x/total), 1) AS pct

FROM raw_data

SELECT * FROM (

VALUES (1), (2), (3)

)

SELECT AS VALUE STRUCT(1, 2, 3)

デフォルトでは、Snowflake のエイリアスと識別子では大文字と小文字が区別されません。大文字と小文字を区別するには、エイリアスと識別子を二重引用符(")で囲みます。

FROM

クエリの FROMは、SELECT ステートメントで使用できるテーブル、ビュー、サブクエリ、テーブル関数を指定します。これらのテーブル参照はすべて BigQuery でサポートされています。

次の表に小さな違いの一覧を示します。

Snowflake BigQuery

SELECT $1, $2 FROM (VALUES (1, 'one'), (2, 'two'));

WITH table1 AS
(
SELECT STRUCT(1 as number, 'one' as spelling)
UNION ALL
SELECT STRUCT(2 as number, 'two' as spelling)
)
SELECT *
FROM table1

SELECT* FROM table SAMPLE(10)

SELECT* FROM table

TABLESAMPLE

BERNOULLI (0.1 PERCENT)

SELECT * FROM table1 AT(TIMESTAMP => timestamp) SELECT * FROM table1 BEFORE(STATEMENT => statementID)

SELECT * FROM table

FOR SYSTEM_TIME AS OF timestamp


注: BigQuery には、ステートメント ID を使用する Snowflake の BEFORE の直接的な代替手段がありません。timestamp の値は、現在のタイムスタンプよりも 7 日以上前の値にすることができません。

@[namespace]<stage_name>[/path]

BigQuery は、ステージされたファイルの概念をサポートしていません。

SELECT*

FROM table

START WITH predicate

CONNECT BY

[PRIOR] col1 = [PRIOR] col2

[, ...]

...

BigQuery には、Snowflake の CONNECT BY に対応する直接的な代替手段はありません。

BigQuery のテーブルは、FROM 句で以下を使用することによって参照できます。

  • [project_id].[dataset_id].[table_name]
  • [dataset_id].[table_name]
  • [table_name]

BigQuery はその他のテーブル参照もサポートしています。

WHERE

次の場合を除き、Snowflake の WHERE 句と BigQuery の WHERE 句は同じです。

Snowflake BigQuery

SELECT col1, col2 FROM table1, table2 WHERE col1 = col2(+)

SELECT col1, col2
FROM table1 INNER JOIN table2
ON col1 = col2

注: BigQuery は JOIN に対する (+) 構文をサポートしていません

JOIN

Snowflake と BigQuery はともに、以下のタイプの JOIN をサポートしています。

Snowflake と BigQuery はどちらも ON 句と USING 句をサポートしています。

次の表に小さな違いの一覧を示します。

Snowflake BigQuery

SELECT col1

FROM table1

NATURAL JOIN

table2

SELECT col1

FROM table1

INNER JOIN

table2

USING (col1, col2 [, ...])


注: BigQuery では、CROSS JOIN の場合、または結合されるテーブルの 1 つが 1 つのデータ型または配列内のフィールドである場合を除いて、JOIN 句には JOIN 条件が必要です。

SELECT ... FROM table1 AS t1, LATERAL ( SELECT*

FROM table2 AS t2

WHERE t1.col = t2.col )


注: 非ラテラル結合の出力とは異なり、ラテラル結合の出力には、インライン ビューから生成された行のみが含まれます。左側の行は、インライン ビューに渡されていることによってすでに考慮されているため、右側の行に結合する必要はありません。

SELECT ... FROM table1 as t1 LEFT JOIN table2 as t2

ON t1.col = t2.col

注: BigQuery では、LATERAL JOIN の直接的な代替機能はサポートされていません。

WITH

BigQuery の WITHには 1 つまたは複数の名前付きサブクエリが含まれます。このサブクエリは、その後の SELECT ステートメントから参照されるたびに実行されます。Snowflake の WITH 句は、BigQuery と同じように動作しますが、BigQuery では WITH RECURSIVE がサポートされていません。

GROUP BY

Snowflake の GROUP BY 句は GROUP BYGROUP BY ROLLUPGROUP BY GROUPING SETSGROUP BY CUBEをサポートし、BigQuery の GROUP BY 句は GROUP BYGROUP BY ALLGROUP BY ROLLUPGROUP BY GROUPING SETSGROUP BY CUBE をサポートします。

Snowflake の HAVING と BigQuery の HAVING は同じです。HAVINGGROUP BY と集計の後、ORDER BY の前に置かれることに注意してください。

Snowflake BigQuery

SELECT col1 as one, col2 as two

FROM table GROUP BY (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY ROLLUP (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY ROLLUP (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY GROUPING SETS (one, 2)


注: Snowflake では、同じクエリブロックで最大 128 個のグループ化セットを使用できます

SELECT col1 as one, col2 as two

FROM table GROUP BY GROUPING SETS (one, 2)

SELECT col1 as one, col2 as two

FROM table GROUP BY CUBE (one,2)


注: Snowflake では、各キューブに最大 7 個の要素(128 個のグループ化セット)を含めることができます。

SELECT col1 as one, col2 as two

FROM table GROUP BY CUBE (one, 2)

ORDER BY

Snowflake の ORDER BYBigQuery ORDER BY 句にはいくつかの細かな違いがあります。

Snowflake BigQuery
Snowflake では、NULL はデフォルト(昇順)で最も優先順位が低くなります。 BigQuery では、NULLS はデフォルト(昇順)で最も優先順位が高くなります。
NULLS FIRST NULLS LAST を使用して、NULL 値をそれぞれ支所と最後に指定することもできます。 BigQuery には、NULL を先頭にするか最後にするかを指定する同等の機能はありません。

LIMIT/FETCH

Snowflake の LIMIT/FETCH 句は、ステートメントまたはサブクエリによって返される最大行数を制限します。 LIMIT(Postgres 構文)と FETCH(ANSI 構文)は同じ結果を生成します。

Snowflake と BigQuery では、クエリに LIMIT 句を適用しても、読み取られるデータの量には影響しません。

Snowflake BigQuery

SELECT col1, col2

FROM table

ORDER BY col1

LIMIT count OFFSET start


SELECT ...

FROM ...

ORDER BY ...

OFFSET start {[ROW | ROWS]} FETCH {[FIRST | NEXT]} count

{[ROW | ROWS]} [ONLY]


注: NULL、空の文字列('')、 $$$$ の値が受け入れられ、「無制限」として扱われます。主な用途はコネクタとドライバです。

SELECT col1, col2

FROM table

ORDER BY col1

LIMIT count OFFSET start


注: BigQuery は FETCH をサポートしません。LIMIT に代わり FETCH になります。

注: BigQuery では、OFFSETLIMIT count と組み合わせて使用する必要があります。パフォーマンスを最大にするために、count は必ず最小限必要な順序付きの行の数を示す INT64 値に設定します。結果のすべての行を並べ替えると、不必要に実行のパフォーマンスが低下することになります。

QUALIFY

Snowflake の QUALIFY 句を使用すると、HAVING が集計関数や GROUP BY 句を使用して行うのと同様のウィンドウ関数の結果をフィルタリングできます。

Snowflake BigQuery

SELECT col1, col2 FROM table QUALIFY ROW_NUMBER() OVER (PARTITION BY col1 ORDER BY col2) = 1;

ROW_NUMBER()COUNT()OVER PARTITION BY などの分析関数を含む Snowflake の QUALIFY 句は、BigQuery では分析値を含むサブクエリの WHERE 句として表現されます。

ROW_NUMBER() の使用:

SELECT col1, col2

FROM ( SELECT col1, col2

ROW NUMBER() OVER (PARTITION BY col1 ORDER by col2) RN FROM table ) WHERE RN = 1;


より大きなパーティションをサポートする ARRAY_AGG() の使用:

SELECT result.* FROM ( SELECT ARRAY_AGG(table ORDER BY table.col2 DESC LIMIT 1) [OFFSET(0)] FROM table

GROUP BY col1 ) AS result;

関数

以下のセクションでは、Snowflake 関数とそれに対応する BigQuery の機能をリストします。

集計関数

次の表に、Snowflake の一般的な集計関数、集計分析関数、近似集計関数と BigQuery でこれらに相当するものを示します。

Snowflake BigQuery

ANY_VALUE([DISTINCT] expression) [OVER ...]


注: DISTINCT には効果はありません。

ANY_VALUE(expression) [OVER ...]

APPROX_COUNT_DISTINCT([DISTINCT] expression) [OVER ...]


注: DISTINCT には効果はありません。

APPROX_COUNT_DISTINCT(expression)


注: BigQuery ではウィンドウ関数での APPROX_COUNT_DISTINCT はサポートされていません。

APPROX_PERCENTILE(expression, percentile) [OVER ...]


注: Snowflake には RESPECT NULLS オプションはありません。

APPROX_QUANTILES([DISTINCT] expression,100) [OFFSET((CAST(TRUNC(percentile * 100) as INT64))]


注: BigQuery ではウィンドウ関数での APPROX_QUANTILES はサポートされていません。

APPROX_PERCENTILE_ACCUMULATE (expression)

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROX_PERCENTILE_COMBINE(state)

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROX_PERCENTILE_ESTIMATE(state, percentile)

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROX_TOP_K(expression, [number [counters]]


注: 数値パラメータが指定されていない場合、デフォルトは 1 です。カウンタは数値よりも大幅に大きくする必要があります。

APPROX_TOP_COUNT(expression, number)


注: BigQuery ではウィンドウ関数での APPROX_TOP_COUNT はサポートされていません。

APPROX_TOP_K_ACCUMULATE(expression, counters)

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROX_TOP_K_COMBINE(state, [counters])

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROX_TOP_K_ESTIMATE(state, [k])

BigQuery では、近似値を予測する際に中間状態を保存する機能はサポートされていません。

APPROXIMATE_JACCARD_INDEX([DISTINCT] expression)


カスタム UDF を使用して、k の個別のハッシュ関数で MINHASH を実装できます。MINHASH のバリアンスを削減するもう 1 つの方法は
1 つのハッシュ関数の最小値を k にすることです。この場合、Jaccard インデックスは次のように近似できます。

WITH

minhash_A AS (

SELECT DISTINCT FARM_FINGERPRINT(TO_JSON_STRING(t)) AS h

FROM TA AS t

ORDER BY h

LIMIT k),

minhash_B AS (

SELECT DISTINCT FARM_FINGERPRINT(TO_JSON_STRING(t)) AS h

FROM TB AS t

ORDER BY h

LIMIT k)

SELECT

COUNT(*) / k AS APPROXIMATE_JACCARD_INDEX

FROM minhash_A

INNER JOIN minhash_B

ON minhash_A.h = minhash_B.h

APPROXIMATE_SIMILARITY([DISTINCT] expression)


APPROXIMATE_JACCARD_INDEX と同義であり、同じ方法で実装できます。

ARRAY_AGG([DISTINCT] expression1) [WITHIN GROUP (ORDER BY ...)]

[OVER ([PARTITION BY expression2])]

Note: Snowflake does not support ability to IGNORE|RESPECT NULLS and to LIMIT directly in ARRAY_AGG.

ARRAY_AGG([DISTINCT] expression1

[{IGNORE|RESPECT}] NULLS] [ORDER BY ...] LIMIT ...])

[OVER (...)]

AVG([DISTINCT] expression) [OVER ...]

AVG([DISTINCT] expression) [OVER ...]


注: BigQuery の AVG では STRING の自動キャストは実行されません。

BITAND_AGG(expression)

[OVER ...]

BIT_AND(expression) [OVER ...]

注: BigQuery では、文字やテキスト列は最も近い INTEGER に暗黙的にキャストされません。

BITOR_AGG(expression)

[OVER ...]

BIT_OR(expression)

[OVER ...]


注: BigQuery では、文字やテキスト列は最も近い INTEGER に暗黙的にキャストされません。

BITXOR_AGG([DISTINCT] expression) [OVER ...]

BIT_XOR([DISTINCT] expression) [OVER ...]


注: BigQuery では、文字やテキスト列は最も近い INTEGER に暗黙的にキャストされません。

BOOLAND_AGG(expression) [OVER ...]


注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱うことができます。

LOGICAL_AND(expression)

[OVER ...]

BOOLOR_AGG(expression)

[OVER ...]


注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱うことができます。

LOGICAL_OR(expression)

[OVER ...]

BOOLXOR_AGG(expression)

[OVER ([PARTITION BY <partition_expr> ])


注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱うことができます。
数値式の場合:

SELECT

CASE COUNT(*)

WHEN 1 THEN TRUE

WHEN 0 THEN NULL

ELSE FALSE

END AS BOOLXOR_AGG

FROM T

WHERE expression != 0


OVER を使用するには、次のコマンドを実行します(ブール値の例)。

SELECT

CASE COUNT(expression) OVER (PARTITION BY partition_expr)

WHEN 0 THEN NULL

ELSE

CASE COUNT(

CASE expression

WHEN TRUE THEN 1

END) OVER (PARTITION BY partition_expr)

WHEN 1 THEN TRUE

ELSE FALSE

END

END AS BOOLXOR_AGG

FROM T

CORR(dependent, independent)

[OVER ...]

CORR(dependent, independent)

[OVER ...]

COUNT([DISTINCT] expression [,expression2]) [OVER ...]

COUNT([DISTINCT] expression [,expression2]) [OVER ...]

COVAR_POP(dependent, independent) [OVER ...]

COVAR_POP(dependent, independent) [OVER ...]

COVAR_SAMP(dependent, independent)

[OVER ...]

COVAR_SAMP(dependent, independent)

[OVER ...]

GROUPING(expression1, [,expression2...])

BigQuery では、Snowflake の GROUPING の直接的な代替手段がサポートされていません。ユーザー定義関数を通じて使用できます。

GROUPING_ID(expression1, [,expression2...])

BigQuery では、Snowflake の GROUPING_ID の直接的な代替手段がサポートされていません。ユーザー定義関数を通じて使用できます。

HASH_AGG([DISTINCT] expression1, [,expression2])

[OVER ...]

SELECT
BIT_XOR(
FARM_FINGERPRINT(
TO_JSON_STRING(t))) [OVER]
FROM t

SELECT HLL([DISTINCT] expression1, [,expression2])

[OVER ...]


注: Snowflake では精度を指定できません。

SELECT HLL_COUNT.EXTRACT(sketch) FROM (

SELECT HLL_COUNT.INIT(expression)

AS sketch FROM table )


注: BigQuery では、ウィンドウ関数での HLL_COUNT… はサポートされていません。1 つの HLL_COUNT... 関数に複数の式を含めることはできません。

HLL_ACCUMULATE([DISTINCT] expression)


注: Snowflake では精度を指定できません。
HLL_COUNT.INIT(expression [, precision])

HLL_COMBINE([DISTINCT] state)

HLL_COUNT.MERGE_PARTIAL(sketch)

HLL_ESTIMATE(state)

HLL_COUNT.EXTRACT(sketch)

HLL_EXPORT(binary)

BigQuery では、Snowflake の HLL_EXPORT の直接的な代替手段がサポートされていません。

HLL_IMPORT(object)

BigQuery では、Snowflake の HLL_IMPORT の直接的な代替手段がサポートされていません。

KURTOSIS(expression)

[OVER ...]

BigQuery では、Snowflake の KURTOSIS の直接的な代替手段がサポートされていません。

LISTAGG(

[DISTINCT] aggregate_expression

[, delimiter]

)

[OVER ...]

STRING_AGG(

[DISTINCT] aggregate_expression

[, delimiter]

)

[OVER ...]

MEDIAN(expression) [OVER ...]


注: Snowflake では、ARRAY_AGG. で直接 IGNORE|RESPECT NULLS および LIMIT を指定できる機能はサポートされていません。

PERCENTILE_CONT(

value_expression,

0.5

[ {RESPECT | IGNORE} NULLS]

) OVER()

MAX(expression) [OVER ...]


MIN(expression) [OVER ...]

MAX(expression) [OVER ...]


MIN(expression) [OVER ...]

MINHASH(k, [DISTINCT] expressions)

カスタム UDF を使用して、k の個別のハッシュ関数で MINHASH を実装できます。MINHASH のバリアンスを削減するもう一つの方法は、1 つのハッシュ関数の最小値を k にすることです。 SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS MINHASH

FROM t

ORDER BY MINHASH

LIMIT k

MINHASH_COMBINE([DISTINCT] state)

<code<select
FROM (
SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS h
FROM TA AS t
ORDER BY h
LIMIT k
UNION
SELECT DISTINCT
FARM_FINGERPRINT(
TO_JSON_STRING(t)) AS h
FROM TB AS t
ORDER BY h
LIMIT k
)
ORDER BY h
LIMIT k

MODE(expr1)

OVER ( [ PARTITION BY <expr2> ] )

SELECT expr1

FROM (

SELECT

expr1,

ROW_NUMBER() OVER (

PARTITION BY expr2

ORDER BY cnt DESC) rn

FROM (

SELECT

expr1,

expr2,

COUNTIF(expr1 IS NOT NULL) OVER

(PARTITION BY expr2, expr1) cnt

FROM t))

WHERE rn = 1

OBJECT_AGG(key, value) [OVER ...]

TO_JSON_STRING を使用して値を JSON 形式の文字列に変換することもできます。

PERCENTILE_CONT(percentile) WITHIN GROUP (ORDER BY value_expression)

[OVER ...]

PERCENTILE_CONT(

value_expression,

percentile

[ {RESPECT | IGNORE} NULLS]

) OVER()

PERCENTILE_DISC(percentile) WITHIN GROUP (ORDER BY value_expression)

[OVER ...]

PERCENTILE_DISC(

value_expression,

percentile

[ {RESPECT | IGNORE} NULLS]

) OVER()

REGR_AVGX(dependent, independent)

[OVER ...]

SELECT AVG(independent) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_AVGY(dependent, independent)

[OVER ...]

SELECT AVG(dependent) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_COUNT(dependent, independent)

[OVER ...]

SELECT COUNT(*) [OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

REGR_INTERCEPT(dependent, independent)

[OVER ...]

SELECT

AVG(dependent) -

COVAR_POP(dependent,independent)/

VAR_POP(dependent) *

AVG(independent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_R2(dependent, independent)

[OVER ...]

SELECT

CASE

WHEN VAR_POP(independent) = 0

THEN NULL

WHEN VAR_POP(dependent) = 0 AND VAR_POP(independent) != 0

THEN 1

ELSE POWER(CORR(dependent, independent), 2)

END AS ...

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SLOPE(dependent, independent)

[OVER ...]

SELECT

COVAR_POP(dependent,independent)/

VAR_POP(dependent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SXX(dependent, independent)

[OVER ...]

SELECT COUNT(*)*VAR_POP(independent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

REGR_SYY(dependent, independent)

[OVER ...]

SELECT COUNT(*)*VAR_POP(dependent)

[OVER ...]

FROM table

WHERE (

(dependent IS NOT NULL) AND

(independent IS NOT NULL)

)

[GROUP BY ...]

SKEW(expression)

BigQuery では、Snowflake の SKEW の直接的な代替手段がサポートされていません。

STDDEV([DISTINCT] expression)

[OVER ...]

STDDEV([DISTINCT] expression)

[OVER ...]

STDDEV_POP([DISTINCT] expression)

[OVER ...]

STDDEV_POP([DISTINCT] expression)

[OVER ...]

STDDEV_SAMP([DISTINCT] expression)

[OVER ...]

STDDEV_SAMP([DISTINCT] expression)

[OVER ...]

SUM([DISTINCT] expression)

[OVER ...]

SUM([DISTINCT] expression)

[OVER ...]

VAR_POP([DISTINCT] expression)

[OVER ...]


注: Snowflake では、VARCHAR を浮動小数点値にキャストする機能がサポートされています。

VAR_POP([DISTINCT] expression)

[OVER ...]

VARIANCE_POP([DISTINCT] expression)

[OVER ...]


注: Snowflake では、VARCHAR を浮動小数点値にキャストする機能がサポートされています。

VAR_POP([DISTINCT] expression)

[OVER ...]

VAR_SAMP([DISTINCT] expression)

[OVER ...]


注: Snowflake では、VARCHAR を浮動小数点値にキャストする機能がサポートされています。

VAR_SAMP([DISTINCT] expression)

[OVER ...]

VARIANCE([DISTINCT] expression)

[OVER ...]


注: Snowflake では、VARCHAR を浮動小数点値にキャストする機能がサポートされています。

VARIANCE([DISTINCT] expression)

[OVER ...]

BigQuery には次の集計関数集計分析関数近似集計関数も用意されています。Snowflake にはこれらに直接対応するものがありません。

ビット単位の式関数

次の表に、Snowflake の一般的なビット単位の式関数と BigQuery でこれらに対応する関数を示します。

式のデータ型が INTEGER でない場合、Snowflake は INTEGER へのキャストを試みます。ただし、BigQuery は INTEGER へのキャストを試みません。

Snowflake BigQuery

BITAND(expression1, expression2)

BIT_AND(x) FROM UNNEST([expression1, expression2]) AS x expression1 & expression2

BITNOT(expression)

~ expression

BITOR(expression1, expression2)

BIT_OR(x) FROM UNNEST([expression1, expression2]) AS x


expression1 | expression2

BITSHIFTLEFT (expression, n)

expression << n

BITSHIFTRIGHT

(expression, n)

expression >> n

BITXOR(expression, expression)


注: Snowflake では DISTINCT. はサポートされていません。

BIT_XOR([DISTINCT] x) FROM UNNEST([expression1, expression2]) AS x


expression ^ expression

条件式関数

次の表に、Snowflake の一般的な条件式と BigQuery でそれに相当するものを示します。

Snowflake BigQuery

expression [ NOT ] BETWEEN lower AND upper

(expression >= lower AND expression <= upper)

BOOLAND(expression1, expression2)


注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱うことができます。

LOGICAL_AND(x)

FROM UNNEST([expression1, expression2]) AS x


expression1 AND expression2

BOOLNOT(expression1)


注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱うことができます。

NOT expression

BOOLOR

注: Snowflake では、数値、小数、浮動小数点の値をゼロ以外の場合は TRUE として扱います。

LOGICAL_OR(x) FROM UNNEST([expression1, expression2]) AS x


expression1 OR expression2

BOOLXOR

注: Snowflake では、数値、小数値、浮動小数点値をゼロ以外の場合は TRUE として扱うことができます。
BigQuery では、Snowflake の BOOLXOR. の直接的な代替手段がサポートされていません

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

COALESCE(expr1, expr2, [,...])


注: Snowflake では少なくとも 2 つの式が必要です。BigQuery で必要なのは 1 つのみです。

COALESCE(expr1, [,...])

DECODE(expression, search1, result1, [search2, result2...] [,default])

CASE [expression] WHEN condition1 THEN result1 [WHEN condition2 THEN result2]

[...]

[ELSE result3]

END

注: BigQuery では、条件ステートメントのサブクエリがサポートされています。これを使用して、Snowflake の DECODE を再現できます。NULL 選択式と NULL 検索式を一致させるために、= NULL ではなく IS NULL を使用する必要があります。

EQUAL_NULL(expression1, expression2)

BigQuery では、Snowflake の EQUAL_NULL. の直接的な代替手段がサポートされていません

GREATEST(expression1, [,expression2]...)

GREATEST(expression1, [,expression2]...)

IFF(condition, true_result, false_result)

IF(condition, true_result, false_result)

IFNULL(expression1, expression2)

IFNULL(expression1, expression2)

[ NOT ] IN ...

[ NOT ] IN ...

expression1 IS [ NOT ] DISTINCT FROM expression2

BigQuery では、Snowflake の IS [ NOT ] DISTINCT FROM. の直接的な代替手段がサポートされていません

expression IS [ NOT ] NULL

expression IS [ NOT ] NULL

IS_NULL_VALUE(variant_expr)

BigQuery では VARIANT データ型はサポートされていません。

LEAST(expression,...)

LEAST(expression,...)

NULLIF(expression1,expression2)

NULLIF(expression1,expression2)

NVL(expression1, expression2)

IFNULL(expression1,expression2)

NVL2(expr1,expr2,expr2)

IF(expr1 IS NOT NULL, expr2,expr3)

REGR_VALX(expr1,expr2)

IF(expr1 IS NULL, NULL, expr2)

注: BigQuery では Snowflake の REGR... 関数に対応する直接的な代替手段がサポートされていません。

REGR_VALY(expr1,expr2)

IF(expr2 IS NULL, NULL, expr1)


注: BigQuery では Snowflake の REGR... 関数に対応する直接的な代替手段がサポートされていません。

ZEROIFNULL(expression)

IFNULL(expression,0)

コンテキスト関数

次の表に、Snowflake の一般的なコンテキスト関数と BigQuery でこれらに対応する関数を示します。

Snowflake BigQuery

CURRENT_ACCOUNT()

SESSION_USER()


注: 直接的な比較ではありません。Snowflake はアカウント ID を返し、BigQuery はユーザーのメールアドレスを返します。

CURRENT_CLIENT()

BigQuery で使用されていないコンセプト

CURRENT_DATABASE()

SELECT catalog_name

FROM INFORMATION_SCHEMA.SCHEMATA

プロジェクト名のテーブルが返されます。直接的な比較ではありません。

CURRENT_DATE[()]


注: Snowflake は、ANSI 標準に準拠するために、CURRENT_DATE コマンドの後に「()」を適用しません。

CURRENT_DATE([timezone])


注: BigQuery の CURRENT_DATE は、オプションのタイムゾーン仕様をサポートします。

CURRENT_REGION()

SELECT location

FROM INFORMATION_SCHEMA.SCHEMATA


注: BigQuery の INFORMATION_SCHEMA.SCHEMATA は、Snowflake の CURRENT_REGION() よりも一般化されたロケーション参照を返します。直接的な比較ではありません。

CURRENT_ROLE()

BigQuery で使用されていないコンセプト

CURRENT_SCHEMA()

SELECT schema_name

FROM INFORMATION_SCHEMA.SCHEMATA

プロジェクトまたはリージョンで使用可能なすべてのデータセット(スキーマ)のテーブルが返されます。直接的な比較ではありません。

CURRENT_SCHEMAS()

BigQuery で使用されていないコンセプト

CURRENT_SESSION()

BigQuery で使用されていないコンセプト

CURRENT_STATEMENT()

SELECT query

FROM INFORMATION_SCHEMA.JOBS_BY_*


注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでクエリを検索できます。

CURRENT_TIME[([frac_sec_prec])]


注: Snowflake では、オプションの小数点以下の第 2 の精度が許可されます。有効な値の範囲は 0~9 ナノ秒です。デフォルト値は 9 です。ANSI に準拠するために、これは「()」なしで呼び出すことができます。

CURRENT_TIME()

CURRENT_TIMESTAMP[([frac_sec_prec])]


注: Snowflake では、オプションの小数点以下の第 2 の精度が許可されます。有効な値の範囲は 0~9 ナノ秒です。デフォルト値は 9 です。ANSI に準拠するために、これは「()」なしで呼び出すことができます。セッション パラメータとして TIMEZONE を設定します。

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


注: CURRENT_DATETIMEDATETIME データ型を返します(Snowflake ではサポートされていません)。CURRENT_TIMESTAMPTIMESTAMP データ型を返します。

CURRENT_TRANSACTION()

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*

注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。

CURRENT_USER[()]


注: Snowflake は、ANSI 標準を遵守するために、CURRENT_USER コマンドの後に「()」を適用しません。

SESSION_USER()


SELECT user_email

FROM INFORMATION_SCHEMA.JOBS_BY_*

注: 直接的な比較ではありません。Snowflake はユーザー名を返します。BigQuery からユーザーのメールアドレスが返されます。

CURRENT_VERSION()

BigQuery で使用されていないコンセプト

CURRENT_WAREHOUSE()

SELECT catalg_name

FROM INFORMATION_SCHEMA.SCHEMATA

LAST_QUERY_ID([num])

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*


注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。

LAST_TRANSACTION()

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*


注: BigQuery の INFORMATION_SCHEMA.JOBS_BY_* では、ジョブタイプ、開始/終了タイプなどでジョブ ID を検索できます。

LOCALTIME()


注: Snowflake は、ANSI 標準を遵守するために、LOCALTIME コマンドの後に「()」を適用しません。

CURRENT_TIME()

LOCALTIMESTAMP()

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


注: CURRENT_DATETIMEDATETIME データ型を返します(Snowflake ではサポートされていません)。CURRENT_TIMESTAMPTIMESTAMP データ型を返します。

変換関数

次の表に、Snowflake の一般的な変換関数と BigQuery でこれらに対応する関数を示します。

Snowflake と BigQuery で同一に見える関数でも、異なるデータ型が返される可能性があることに注意してください。

Snowflake BigQuery

CAST(expression AS type)


expression :: type

CAST(expression AS type)

TO_ARRAY(expression)

[expression]


ARRAY(subquery)

TO_BINARY(expression[, format])


注: Snowflake では、HEXBASE64UTF-8 の変換がサポートされています。Snowflake では、VARIANT データ型を使用する TO_BINARY もサポートされています。BigQuery には、VARIANT データ型に相当するものがありません。

TO_HEX(CAST(expression AS BYTES)) TO_BASE64(CAST(expression AS BYTES))

CAST(expression AS BYTES)


注: BigQuery のデフォルトの STRING キャストでは UTF-8 エンコードが使用されます。Snowflake には、BASE32 エンコードをサポートするオプションがありません。

TO_BOOLEAN(expression)


注:
  • INT64
    TRUE:
    それ以外の場合は FALSE: 0
  • STRING
    TRUE: "true"/"t"/"yes"/"y"/"on"/"1", FALSE: "false"/"f"/"no"/"n"/"off"/"0"

CAST(expression AS BOOL)


注:
  • INT64
    TRUE:
    それ以外の場合は FALSE: 0
  • STRING
    TRUE: "true", FALSE: "false"

TO_CHAR(expression[, format])


TO_VARCHAR(expression[, format])


注: Snowflake の形式モデルはこちらで確認できます。BigQuery には、VARIANT データ型に相当するものがありません。

CAST(expression AS STRING)


注: BigQuery の入力式は、FORMAT_DATEFORMAT_DATETIMEFORMAT_TIME、または FORMAT_TIMESTAMP を使用してフォーマットできます。

TO_DATE(expression[, format])


DATE(expression[, format])


注: Snowflake では、INTEGER 型を DATE 型に直接変換する機能がサポートされています。Snowflake の形式モデルはこちらで確認できます。BigQuery には、VARIANT データ型に相当するものがありません。

CAST(expression AS DATE)


注: BigQuery の入力式は、FORMATFORMAT_DATETIMEFORMAT_TIMESTAMP を使用してフォーマットできます。

TO_DECIMAL(expression[, format]

[,precision[, scale]]


TO_NUMBER(expression[, format]

[,precision[, scale]]


TO_NUMERIC(expression[, format]

[,precision[, scale]]


注: DECIMALNUMBERNUMERIC データ型の Snowflake の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。

ROUND(CAST(expression AS NUMERIC)

, x)


注: BigQuery の入力式は、FORMAT. を使用してフォーマットできます。

TO_DOUBLE(expression[, format])


注: DOUBLE データ型の Snowflake の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。

CAST(expression AS FLOAT64)


注: BigQuery の入力式は、FORMAT. を使用してフォーマットできます。

TO_JSON(variant_expression)

BigQuery には、Snowflake の VARIANT データ型に代わるものはありません。

TO_OBJECT(variant_expression)

BigQuery には、Snowflake の VARIANT データ型に代わるものはありません。

TO_TIME(expression[, format])


TIME(expression[, format])


注: STRING データ型の Snowflake の形式モデルについては、こちらをご覧ください。BigQuery には、VARIANT データ型に相当するものがありません。

CAST(expression AS TIME)


注: BigQuery には、Snowflake の VARIANT データ型に代わるものはありません。BigQuery の入力式は、FORMATFORMAT_DATETIMEFORMAT_TIMESTAMPFORMAT_TIME を使用してフォーマットできます。

TO_TIMESTAMP(expression[, scale])


TO_TIMESTAMP_LTZ(expression[, scale])


TO_TIMESTAMP_NTZ(expression[, scale])


TO_TIMESTAMP_TZ(expression[, scale])


注: BigQuery には、VARIANT データ型に相当するものがありません。

CAST(expression AS TIMESTAMP)


注: BigQuery の入力式は、FORMATFORMAT_DATEFORMAT_DATETIMEFORMAT_TIME を使用してフォーマットできます。タイムゾーンは、FORMAT_TIMESTAMP パラメータを使用して含めることも、含めないこともできます。

TO_VARIANT(expression)

BigQuery には、Snowflake の VARIANT データ型に代わるものはありません。

TO_XML(variant_expression)

BigQuery には、Snowflake の VARIANT データ型に代わるものはありません。

TRY_CAST(expression AS type)

SAFE_CAST(expression AS type)

TRY_TO_BINARY(expression[, format])

TO_HEX(SAFE_CAST(expression AS BYTES)) TO_BASE64(SAFE_CAST(expression AS BYTES))

SAFE_CAST(expression AS BYTES)

TRY_TO_BOOLEAN(expression)

SAFE_CAST(expression AS BOOL)

TRY_TO_DATE(expression)

SAFE_CAST(expression AS DATE)

TRY_TO_DECIMAL(expression[, format]

[,precision[, scale]]


TRY_TO_NUMBER(expression[, format]

[,precision[, scale]]


TRY_TO_NUMERIC(expression[, format]

[,precision[, scale]]

ROUND(

SAFE_CAST(expression AS NUMERIC)

, x)

TRY_TO_DOUBLE(expression)

SAFE_CAST(expression AS FLOAT64)

TRY_TO_TIME(expression)

SAFE_CAST(expression AS TIME)

TRY_TO_TIMESTAMP(expression)


TRY_TO_TIMESTAMP_LTZ(expression)


TRY_TO_TIMESTAMP_NTZ(expression)


TRY_TO_TIMESTAMP_TZ(expression)

SAFE_CAST(expression AS TIMESTAMP)

BigQuery では、次の変換関数もサポートされています。Snowflake には、これらに直接対応するものはありません。

データ生成関数

次の表に、Snowflake の一般的なデータ生成関数と BigQuery でこれらに対応する関数を示します。

Snowflake BigQuery

NORMAL(mean, stddev, gen)

BigQuery では、Snowflake の NORMAL. に対応する直接的な比較がサポートされていません

RANDOM([seed])

IF(RAND()>0.5, CAST(RAND()*POW(10, 18) AS INT64),

(-1)*CAST(RAND()*POW(10, 18) AS

INT64))


注: BigQuery ではシードはサポートされていません。

RANDSTR(length, gen)

BigQuery では、Snowflake の RANDSTR. に対応する直接的な比較がサポートされていません
SEQ1 / SEQ2 / SEQ4 / SEQ8 BigQuery では、Snowflake の SEQ_. に対応する直接的な比較がサポートされていません

UNIFORM(min, max, gen)

CAST(min + RAND()*(max-min) AS INT64)


注: 永続的な UDF を使用して、Snowflake の UNIFORM と同等のものを作成します。詳しくはこちらの例を参照
UUID_STRING([uuid, name])

注: Snowflake は 128 個のランダムなビットを返します。Snowflake は、バージョン 4(ランダム)とバージョン 5(名前付き)の両方の UUID をサポートしています。

GENERATE_UUID()


注: BigQuery は 122 個のランダムなビットを返します。BigQuery はバージョン 4 の UUID のみをサポートします。

ZIPF(s, N, gen)

BigQuery では、Snowflake の ZIPF. に対応する直接的な代替手段がサポートされていません

日付と時刻の関数

次の表に、Snowflake の一般的な日時関数と BigQuery でそれに相当するものを示します。BigQuery の日付と時刻の関数としては、日付関数日時関数時刻関数タイムスタンプ関数があります。

Snowflake BigQuery

ADD_MONTHS(date, months)

CAST(

DATE_ADD(

date,

INTERVAL integer MONTH

) AS TIMESTAMP

)

CONVERT_TIMEZONE(source_tz, target_tz, source_timestamp)


CONVERT_TIMEZONE(target_tz, source_timestamp)

PARSE_TIMESTAMP(

"%c%z",

FORMAT_TIMESTAMP(

"%c%z",

timestamp,

target_timezone

)

)


注: BigQuery では、変換元タイムゾーンは常に UTC です。

DATE_FROM_PARTS(year, month, day)


注: Snowflake では、オーバーフローと負の日付がサポートされています。たとえば、DATE_FROM_PARTS(2000, 1 + 24, 1) は 2002 年 1 月 1 日を返します。これは BigQuery ではサポートされていません。

DATE(year, month, day)


DATE(timestamp_expression[, timezone])


DATE(datetime_expression)

DATE_PART(part, dateOrTime)


注: Snowflake は ISO 曜日、ナノ秒、エポック秒/ミリ秒/マイクロ秒/ナノ秒の部分型をサポートしています。BigQuery ではサポートされません。Snowflake の部分型の一覧については、こちらをご覧ください。.

EXTRACT(part FROM dateOrTime)


注: BigQuery ではサポートされている部分タイプは、週(<weekday>)、マイクロ秒、ミリ秒の部分タイプがサポートされています。Snowflake ではサポートされません。BigQuery の部分型の完全なリストについては、こちらこちらをご覧ください。

DATE_TRUNC(part, dateOrTime)


注: Snowflake はナノ秒単位の部分型をサポートしています。BigQuery ではサポートされません。Snowflake の部分型の一覧については、こちらをご覧ください。.

DATE_TRUNC(date, part)


DATETIME_TRUNC(datetime, part)


TIME_TRUNC(time, part)


TIMESTAMP_TRUNC(timestamp, part[, timezone])


注: BigQuery は、週(<weekday>)、ISO 週、ISO の年の各部分型をサポートしています。Snowflake ではサポートされません。

DATEADD(part, value, dateOrTime)

DATE_ADD(date, INTERVAL value part)

DATEDIFF(

part,

expression1,

expression2

)


注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。

DATE_DIFF(

dateExpression1,

dateExpression2,

part

)


DATETIME_DIFF(

datetimeExpression1,

datetimeExpression2,

part

)


TIME_DIFF(

timeExpression1,

timeExpression2,

part

)


TIMESTAMP_DIFF(

timestampExpression1,

timestampExpression2,

part

)


注: BigQuery は、週(<weekday>)と ISO 年の部分型をサポートしています。

DAYNAME(dateOrTimestamp)

FORMAT_DATE('%a', date)


FORMAT_DATETIME('%a', datetime)


FORMAT_TIMESTAMP('%a', timestamp)

EXTRACT(part FROM dateOrTime)


注: Snowflake は ISO 曜日、ナノ秒、エポック秒/ミリ秒/マイクロ秒/ナノ秒の部分型をサポートしています。BigQuery ではサポートされません。Snowflake の部分型の一覧については、こちらをご覧ください。.

EXTRACT(part FROM dateOrTime)


注: BigQuery ではサポートされている部分タイプは、週(<weekday>)、マイクロ秒、ミリ秒の部分タイプがサポートされています。Snowflake ではサポートされません。BigQuery の部分型の完全なリストについては、こちらこちらをご覧ください。

[HOUR, MINUTE, SECOND](timeOrTimestamp)

EXTRACT(part FROM timestamp [AT THE ZONE timezone])

LAST_DAY(dateOrTime[, part])

DATE_SUB( DATE_TRUNC(

DATE_ADD(date, INTERVAL

1 part),

part),

INTERVAL 1 DAY)

MONTHNAME(dateOrTimestamp)

FORMAT_DATE('%b', date)


FORMAT_DATETIME('%b', datetime)


FORMAT_TIMESTAMP('%b', timestamp)

NEXT_DAY(dateOrTime, dowString)

DATE_ADD(

DATE_TRUNC(

date,

WEEK(dowString)),

INTERVAL 1 WEEK)


注: dowString の再フォーマットが必要となることがあります。たとえば、Snowflake の「su」は BigQuery では「SUNDAY」になります。

PREVIOUS_DAY(dateOrTime, dowString)

DATE_TRUNC(

date,

WEEK(dowString)

)


注: dowString の再フォーマットが必要となることがあります。たとえば、Snowflake の「su」は BigQuery では「SUNDAY」になります。

TIME_FROM_PARTS(hour, minute, second[, nanosecond)


注: Snowflake ではオーバーフロー時間がサポートされています。たとえば、TIME_FROM_PARTS(0, 100, 0) は 01:40:00... を返します。これは BigQuery ではサポートされていません。BigQuery ではナノ秒はサポートされていません。

TIME(hour, minute, second)


TIME(timestamp, [timezone])


TIME(datetime)

TIME_SLICE(dateOrTime, sliceLength, part[, START]


TIME_SLICE(dateOrTime, sliceLength, part[, END]

DATE_TRUNC(

DATE_SUB(CURRENT_DATE(),

INTERVAL value MONTH),

MONTH)


DATE_TRUNC(

DATE_ADD(CURRENT_DATE(),

INTERVAL value MONTH),

MONTH)


注: BigQuery では、Snowflake の TIME_SLICE に直接、正確に対応する関数はありません。適切なデータ型に対して DATETINE_TRUNCTIME_TRUNCTIMESTAMP_TRUNC を使用します。

TIMEADD(part, value, dateOrTime)

TIME_ADD(time, INTERVAL value part)

TIMEDIFF(

part,

expression1,

expression2,

)


注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。

DATE_DIFF(

dateExpression1,

dateExpression2,

part

)


DATETIME_DIFF(

datetimeExpression1,

datetimeExpression2,

part

)


TIME_DIFF(

timeExpression1,

timeExpression2,

part

)


TIMESTAMP_DIFF(

timestampExpression1,

timestampExpression2,

part

)


注: BigQuery は、週(<weekday>)と ISO 年の部分型をサポートしています。

TIMESTAMP_[LTZ, NTZ, TZ _]FROM_PARTS (year, month, day, hour, second [, nanosecond][, timezone])

TIMESTAMP(

string_expression[, timezone] | date_expression[, timezone] |

datetime_expression[, timezone]

)


注: BigQuery ではタイムスタンプを STRING 型として入力する必要があります。例: "2008-12-25 15:30:00"

TIMESTAMPADD(part, value, dateOrTime)

TIMESTAMPADD(timestamp, INTERVAL value part)

TIMESTAMPDIFF(

part,

expression1,

expression2,

)


注: Snowflake では、この関数で 2 つの日付型、時刻型、タイムスタンプ型の差を計算できます。

DATE_DIFF(

dateExpression1,

dateExpression2,

part

)


DATETIME_DIFF(

datetimeExpression1,

datetimeExpression2,

part

)


TIME_DIFF(

timeExpression1,

timeExpression2,

part

)


TIMESTAMP_DIFF(

timestampExpression1,

timestampExpression2,

part

)


注: BigQuery は、週(<weekday>)と ISO 年の部分型をサポートしています。

TRUNC(dateOrTime, part)


注: Snowflake はナノ秒単位の部分型をサポートしています。BigQuery ではサポートされません。Snowflake の部分型の一覧については、こちらをご覧ください。.

DATE_TRUNC(date, part)


DATETIME_TRUNC(datetime, part)


TIME_TRUNC(time, part)


TIMESTAMP_TRUNC(timestamp, part[, timezone])


注: BigQuery は、週(<weekday>)、ISO 週、ISO の年の各部分型をサポートしています。Snowflake ではサポートされません。

[YEAR*, DAY*, WEEK*, MONTH, QUARTER](dateOrTimestamp)

EXTRACT(part FROM timestamp [AT THE ZONE timezone])

BigQuery では、次の日付と時刻関数もサポートされています。Snowflake には、これらに直接対応するものはありません。

情報スキーマとテーブル関数

BigQuery では、Snowflake の情報スキーマとテーブル関数の多くの概念がサポートされていません。Snowflake には次の情報スキーマとテーブル関数がありますが、BigQuery にはこれらに直接対応するものはありません。

以下に、関連する BigQuery と Snowflake の情報スキーマとテーブル関数の一覧を示します。

Snowflake BigQuery
QUERY_HISTORY

QUERY_HISTORY_BY_*
INFORMATION_SCHEMA.JOBS_BY_*

注: 直接的な代替手段ではありません。
TASK_HISTORY INFORMATION_SCHEMA.JOBS_BY_*

注: 直接的な代替手段ではありません。

BigQuery には次の情報スキーマとテーブル関数がありますが、Snowflake にはこれらに直接対応するものはありません。

数値関数

次の表に、Snowflake の一般的な数値関数と BigQuery でこれらに対応する関数を示します。

Snowflake BigQuery

ABS(expression)

ABS(expression)

ACOS(expression)

ACOS(expression)

ACOSH(expression)

ACOSH(expression)

ASIN(expression)

ASIN(expression)

ASINH(expression)

ASINH(expression)

ATAN(expression)

ATAN(expression)

ATAN2(y, x)

ATAN2(y, x)

ATANH(expression)

ATANH(expression)

CBRT(expression)

POW(expression, ⅓)

CEIL(expression [, scale])

CEIL(expression)


注: BigQuery の CEIL では、精度やスケールを指定する機能はサポートされていません。 ROUND では切り上げを指定できません。

COS(expression)

COS(expression)

COSH(expression)

COSH(expression)

COT(expression)

1/TAN(expression)

DEGREES(expression)

(expression)*(180/ACOS(-1))

EXP(expression)

EXP(expression)

FACTORIAL(expression)

BigQuery には、Snowflake の FACTORIAL に直接的な代替手段はありません。ユーザー定義関数を使用します。

FLOOR(expression [, scale])

FLOOR(expression)


注: BigQuery の FLOOR では、精度やスケールを指定する機能はサポートされていません。 ROUND では切り上げを指定できません。TRUNC は絶対値を評価するため、正の数に対して同意語として実行しますが、負の数に対しては実行しません。

HAVERSINE(lat1, lon1, lat2, lon2)

ST_DISTANCE( ST_GEOGPOINT(lon1, lat1),

ST_GEOGPOINT(lon2, lat2)

)/1000


注: 完全一致ではありませんが、十分に類似しています。

LN(expression)

LN(expression)

LOG(base, expression)

LOG(expression [,base])


LOG10(expression)


注: LOG のデフォルトのベースは 10 です。

MOD(expression1, expression2)

MOD(expression1, expression2)

PI()

ACOS(-1)

POW(x, y)


POWER(x, y)

POW(x, y)


POWER(x, y)

RADIANS(expression)

(expression)*(ACOS(-1)/180)

ROUND(expression [, scale])

ROUND(expression, [, scale])

SIGN(expression)

SIGN(expression)

SIN(expression)

SIN(expression)

SINH(expression)

SINH(expression)

SQRT(expression)

SQRT(expression)

SQUARE(expression)

POW(expression, 2)

TAN(expression)

TAN(expression)

TANH(expression)

TANH(expression)

TRUNC(expression [, scale])


TRUNCATE(expression [, scale])

TRUNC(expression [, scale])


注: BigQuery の戻り値は、式よりも小さくする必要があります。同じ値はサポートされません。

BigQuery には次の数学関数もサポートされています。Snowflake には、これらに直接対応するものはありません。

半構造化データ関数

Snowflake BigQuery
ARRAY_APPEND カスタムのユーザー定義関数
ARRAY_CAT ARRAY_CONCAT
ARRAY_COMPACT カスタムのユーザー定義関数
ARRAY_CONSTRUCT [ ]
ARRAY_CONSTRUCT_COMPACT カスタムのユーザー定義関数
ARRAY_CONTAINS カスタムのユーザー定義関数
ARRAY_INSERT カスタムのユーザー定義関数
ARRAY_INTERSECTION カスタムのユーザー定義関数
ARRAY_POSITION カスタムのユーザー定義関数
ARRAY_PREPEND カスタムのユーザー定義関数
ARRAY_SIZE ARRAY_LENGTH
ARRAY_SLICE カスタムのユーザー定義関数
ARRAY_TO_STRING ARRAY_TO_STRING
ARRAYS_OVERLAP カスタムのユーザー定義関数
AS_<object_type> CAST
AS_ARRAY CAST
AS_BINARY CAST
AS_BOOLEAN CAST
AS_CHAR , AS_VARCHAR CAST
AS_DATE CAST
AS_DECIMAL , AS_NUMBER CAST
AS_DOUBLE , AS_REAL CAST
AS_INTEGER CAST
AS_OBJECT CAST
AS_TIME CAST
AS_TIMESTAMP_* CAST
CHECK_JSON カスタムのユーザー定義関数
CHECK_XML カスタムのユーザー定義関数
FLATTEN UNNEST
GET カスタムのユーザー定義関数
GET_IGNORE_CASE カスタムのユーザー定義関数

GET_PATH , :

カスタムのユーザー定義関数
IS_<object_type> カスタムのユーザー定義関数
IS_ARRAY カスタムのユーザー定義関数
IS_BINARY カスタムのユーザー定義関数
IS_BOOLEAN カスタムのユーザー定義関数
IS_CHAR , IS_VARCHAR カスタムのユーザー定義関数
IS_DATE , IS_DATE_VALUE カスタムのユーザー定義関数
IS_DECIMAL カスタムのユーザー定義関数
IS_DOUBLE , IS_REAL カスタムのユーザー定義関数
IS_INTEGER カスタムのユーザー定義関数
IS_OBJECT カスタムのユーザー定義関数
IS_TIME カスタムのユーザー定義関数
IS_TIMESTAMP_* カスタムのユーザー定義関数
OBJECT_CONSTRUCT カスタムのユーザー定義関数
OBJECT_DELETE カスタムのユーザー定義関数
OBJECT_INSERT カスタムのユーザー定義関数
PARSE_JSON JSON_EXTRACT
PARSE_XML カスタムのユーザー定義関数
STRIP_NULL_VALUE カスタムのユーザー定義関数
STRTOK_TO_ARRAY SPLIT
TRY_PARSE_JSON カスタムのユーザー定義関数
TYPEOF カスタムのユーザー定義関数
XMLGET カスタムのユーザー定義関数

文字列とバイナリ関数

Snowflake BigQuery

string1 || string2

CONCAT(string1, string2)

ASCII

TO_CODE_POINTS(string1)[OFFSET(0)]

BASE64_DECODE_BINARY

SAFE_CONVERT_BYTES_TO_STRING(

FROM_BASE64(<bytes_input>)

)

BASE64_DECODE_STRING

SAFE_CONVERT_BYTES_TO_STRING(

FROM_BASE64(<string1>)

)

BASE64_ENCODE

TO_BASE64(

SAFE_CAST(<string1> AS BYTES)

)

BIT_LENGTH

BYTE_LENGTH * 8

CHARACTER_LENGTH

CHARINDEX(substring, string)

STRPOS(string, substring)

CHR,CHAR

CODE_POINTS_TO_STRING([number])

COLLATE カスタムのユーザー定義関数
COLLATION カスタムのユーザー定義関数
COMPRESS カスタムのユーザー定義関数

CONCAT(string1, string2)

CONCAT(string1, string2)

: BigQuery の CONCAT(...) では、任意の数の文字列を連結できます。
CONTAINS カスタムのユーザー定義関数
DECOMPRESS_BINARY カスタムのユーザー定義関数
DECOMPRESS_STRING カスタムのユーザー定義関数
EDITDISTANCE EDIT_DISTANCE
ENDSWITH カスタムのユーザー定義関数
HEX_DECODE_BINARY

SAFE_CONVERT_BYTES_TO_STRING(

FROM_HEX(<string1>)

HEX_DECODE_STRING

SAFE_CONVERT_BYTES_TO_STRING(

FROM_HEX(<string1>)

HEX_ENCODE

TO_HEX(

SAFE_CAST(<string1> AS BYTES))

ILIKE カスタムのユーザー定義関数
ILIKE ANY カスタムのユーザー定義関数
INITCAP INITCAP
INSERT カスタムのユーザー定義関数
LEFT ユーザー定義関数
LENGTH

LENGTH(expression)

LIKE LIKE
LIKE ALL カスタムのユーザー定義関数
LIKE ANY カスタムのユーザー定義関数
LOWER

LOWER(string)

LPAD

LPAD(string1, length[, string2])

LTRIM

LTRIM(string1, trim_chars)

MD5,MD5_HEX

MD5(string)

MD5_BINARY カスタムのユーザー定義関数
OCTET_LENGTH カスタムのユーザー定義関数
PARSE_IP カスタムのユーザー定義関数
PARSE_URL カスタムのユーザー定義関数
POSITION

STRPOS(string, substring)

REPEAT

REPEAT(string, integer)

REPLACE

REPLACE(string1, old_chars, new_chars)

REVERSE

number_characters

)

REVERSE(expression)

RIGHT ユーザー定義関数
RPAD RPAD
RTRIM

RTRIM(string, trim_chars)

RTRIMMED_LENGTH カスタムのユーザー定義関数
SHA1,SHA1_HEX

SHA1(string)

SHA1_BINARY カスタムのユーザー定義関数
SHA2,SHA2_HEX カスタムのユーザー定義関数
SHA2_BINARY カスタムのユーザー定義関数
SOUNDEX カスタムのユーザー定義関数
SPACE カスタムのユーザー定義関数
SPLIT SPLIT
SPLIT_PART カスタムのユーザー定義関数
SPLIT_TO_TABLE カスタムのユーザー定義関数
STARTSWITH カスタムのユーザー定義関数
STRTOK

SPLIT(instring, delimiter)[ORDINAL(tokennum)]


注: delimiter の文字列引数全体が単一の区切り文字として使用されます。デフォルトの区切り文字はカンマです。
STRTOK_SPLIT_TO_TABLE カスタムのユーザー定義関数
SUBSTR,SUBSTRING SUBSTR
TRANSLATE カスタムのユーザー定義関数
TRIM TRIM
TRY_BASE64_DECODE_BINARY カスタムのユーザー定義関数
TRY_BASE64_DECODE_STRING

SUBSTR(string, 0, integer)

TRY_HEX_DECODE_BINARY

SUBSTR(string, -integer)

TRY_HEX_DECODE_STRING

LENGTH(expression)

UNICODE カスタムのユーザー定義関数

UPPER

UPPER

文字列関数(正規表現)

Snowflake BigQuery
REGEXP

IF(REGEXP_CONTAINS,1,0)=1

REGEXP_COUNT

ARRAY_LENGTH(

REGEXP_EXTRACT_ALL(

source_string,

pattern

)

)


position が指定されている場合:

ARRAY_LENGTH(

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)

)


注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。
REGEXP_INSTR

IFNULL(

STRPOS(

source_string,

REGEXP_EXTRACT(

source_string,

pattern)

), 0)


position が指定されている場合:

IFNULL(

STRPOS(

SUBSTR(source_string, IF(position <= 0, 1, position)),

REGEXP_EXTRACT(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern)

) + IF(position <= 0, 1, position) - 1, 0)


occurrence が指定されている場合:

IFNULL(

STRPOS(

SUBSTR(source_string, IF(position <= 0, 1, position)),

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)[SAFE_ORDINAL(occurrence)]

) + IF(position <= 0, 1, position) - 1, 0)


注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。

REGEXP_LIKE

IF(REGEXP_CONTAINS,1,0)=1

REGEXP_REPLACE

REGEXP_REPLACE(

source_string,

pattern,

""

)


replace_string が指定されている場合:

REGEXP_REPLACE(

source_string,

pattern,

replace_string

)


position が指定されている場合:

CASE

WHEN position > LENGTH(source_string) THEN source_string

WHEN position <= 0 THEN

REGEXP_REPLACE(

source_string,

pattern,

""

)

ELSE

CONCAT(

SUBSTR(

source_string, 1, position - 1),

REGEXP_REPLACE(

SUBSTR(source_string, position),

pattern,

replace_string

)

)

END


注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。
REGEXP_SUBSTR

REGEXP_EXTRACT(

source_string,

pattern

)


position が指定されている場合:

REGEXP_EXTRACT(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)


occurrence が指定されている場合:

REGEXP_EXTRACT_ALL(

SUBSTR(source_string, IF(position <= 0, 1, position)),

pattern

)[SAFE_ORDINAL(occurrence)]


注: BigQuery は、re2 ライブラリを使用した正規表現をサポートしています。正規表現の構文については、該当するドキュメントをご覧ください。
RLIKE

IF(REGEXP_CONTAINS,1,0)=1

システム関数

Snowflake BigQuery
SYSTEM$ABORT_SESSION カスタムのユーザー定義関数
SYSTEM$ABORT_TRANSACTION カスタムのユーザー定義関数
SYSTEM$CANCEL_ALL_QUERIES カスタムのユーザー定義関数
SYSTEM$CANCEL_QUERY カスタムのユーザー定義関数
SYSTEM$CLUSTERING_DEPTH カスタムのユーザー定義関数
SYSTEM$CLUSTERING_INFORMATION カスタムのユーザー定義関数
SYSTEM$CLUSTERING_RATIO — Deprecated カスタムのユーザー定義関数
SYSTEM$CURRENT_USER_TASK_NAME カスタムのユーザー定義関数
SYSTEM$DATABASE_REFRESH_HISTORY カスタムのユーザー定義関数
SYSTEM$DATABASE_REFRESH_PROGRESS , SYSTEM$DATABASE_REFRESH_PROGRESS_BY_JOB カスタムのユーザー定義関数
SYSTEM$GET_AWS_SNS_IAM_POLICY カスタムのユーザー定義関数
SYSTEM$GET_PREDECESSOR_RETURN_VALUE カスタムのユーザー定義関数
SYSTEM$LAST_CHANGE_COMMIT_TIME カスタムのユーザー定義関数
SYSTEM$PIPE_FORCE_RESUME カスタムのユーザー定義関数
SYSTEM$PIPE_STATUS カスタムのユーザー定義関数
SYSTEM$SET_RETURN_VALUE カスタムのユーザー定義関数
SYSTEM$SHOW_OAUTH_CLIENT_SECRETS カスタムのユーザー定義関数
SYSTEM$STREAM_GET_TABLE_TIMESTAMP カスタムのユーザー定義関数
SYSTEM$STREAM_HAS_DATA カスタムのユーザー定義関数
SYSTEM$TASK_DEPENDENTS_ENABLE カスタムのユーザー定義関数
SYSTEM$TYPEOF カスタムのユーザー定義関数
SYSTEM$USER_TASK_CANCEL_ONGOING_EXECUTIONS カスタムのユーザー定義関数
SYSTEM$WAIT カスタムのユーザー定義関数
SYSTEM$WHITELIST カスタムのユーザー定義関数
SYSTEM$WHITELIST_PRIVATELINK カスタムのユーザー定義関数

テーブル関数

Snowflake BigQuery
GENERATOR カスタムのユーザー定義関数
GET_OBJECT_REFERENCES カスタムのユーザー定義関数
RESULT_SCAN カスタムのユーザー定義関数
VALIDATE カスタムのユーザー定義関数

ユーティリティとハッシュ関数

Snowflake BigQuery
GET_DDL 機能に関するリクエスト
HASH HASH は、Snowflake 固有の専用関数です。Snowflake で使用される基礎となるロジックが不明なために変換できません。

ウィンドウ関数

Snowflake BigQuery
CONDITIONAL_CHANGE_EVENT カスタムのユーザー定義関数
CONDITIONAL_TRUE_EVENT カスタムのユーザー定義関数
CUME_DIST CUME_DIST
DENSE_RANK DENSE_RANK
FIRST_VALUE FIRST_VALUE
LAG LAG
LAST_VALUE LAST_VALUE
LEAD LEAD
NTH_VALUE NTH_VALUE
NTILE NTILE
PERCENT_RANK PERCENT_RANK
RANK RANK
RATIO_TO_REPORT カスタムのユーザー定義関数
ROW_NUMBER ROW_NUMBER
WIDTH_BUCKET カスタムのユーザー定義関数

BigQuery では、SAFE_CAST(expression AS typename) もサポートされます。これは、BigQuery がキャストを実行できない場合に NULL を返します(たとえば、SAFE_CAST("apple" AS INT64) は NULL を返します)。

オペレーター

以下のセクションでは、Snowflake 演算子とそれに対応する BigQuery の機能をリストします。

算術演算子

次の表に、Snowflake の算術演算子と BigQuery でこれらに対応するものを示します。

Snowflake BigQuery

(Unary) (+'5')

CAST("5" AS NUMERIC)

a + b

a + b

(Unary) (-'5')

(-1) * CAST("5" AS NUMERIC)


注: BigQuery は標準の単項マイナスをサポートしますが、文字列形式の整数を INT64 型、NUMERIC 型、または FLOAT64 型に変換しません。

a - b

a - b

date1 - date2


date1 - 365

DATE_DIFF(date1, date2, date_part) DATE_SUB(date1, date2, date_part)

a * b

a * b

a / b

a / b

a % b

MOD(a, b)

算術演算実行時の Snowflake のスケールと精度の詳細を確認するには、Snowflake のドキュメントをご覧ください。

比較演算子

Snowflake の比較演算子と BigQuery の比較演算子は同じです。

論理演算子/ブール演算子

Snowflake の論理演算子/ブール演算子と BigQuery の論理演算子/ブール演算子は同じです。

集合演算子

次の表に、Snowflake の集合演算子とそれに対応する BigQuery のマッピングを示します。

Snowflake BigQuery

SELECT ... INTERSECT SELECT ...

SELECT ...

INTERSECT DISTINCT

SELECT...

SELECT ... MINUS SELECT ...

SELECT ... EXCEPT SELECT …


注: MINUS EXCEPT は同義です。

SELECT ... EXCEPT DISTINCT SELECT ...

SELECT ... UNION SELECT ...

SELECT ... UNION ALL SELECT ...

SELECT ... UNION DISTINCT SELECT ...


SELECT ... UNION ALL SELECT ...

サブクエリ演算子

次の表に、Snowflake の集合演算子と BigQuery でこれらに対応する演算子を示します。

Snowflake BigQuery

SELECT ... FROM ... WHERE col <operator> ALL … SELECT ... FROM ... WHERE col <operator> ANY ...

BigQuery では、Snowflake の「ALL/ANY」の直接的な代替手段がサポートされていません。

SELECT ... FROM ...

WHERE [NOT] EXISTS...

SELECT ... FROM ...

WHERE [NOT] EXISTS...

SELECT ... FROM ...

WHERE [NOT] IN...

SELECT ... FROM ...

WHERE [NOT] IN...

SELECT * FROM table1

UNION

SELECT * FROM table2

EXCEPT

SELECT * FROM table3

SELECT * FROM table1

UNION ALL

(

SELECT * FROM table2

EXCEPT

SELECT * FROM table3

)


: BigQuery では、set 演算子どうしを区別するためにかっこが必要です。同じ set 演算子を繰り返すときは、かっこは不要です。

DML 構文

ここでは、Snowflake と BigQuery のデータ管理言語の構文の違いについて説明します。

INSERT ステートメント

Snowflake では、列に対する設定可能な DEFAULT キーワードが提示されます。BigQuery では、NULL が許容される列の DEFAULT 値が NULLであり、必須の列では DEFAULT がサポートされません。Snowflake の INSERT ステートメントのほとんどは、BigQuery と互換性があります。次の表に例外を示します。

Snowflake BigQuery

INSERT [OVERWRITE] INTO table

VALUES [... | DEFAULT | NULL] ...


注: BigQuery では、INSERT ステートメント. を使用して JSON オブジェクトを挿入することはできません。

INSERT [INTO] table (column1 [, ...])

VALUES (DEFAULT [, ...])

注: BigQuery は Snowflake の OVERWRITE の直接的な代替手段がサポートされていません。DELETE を代わりに使用してください。

INSERT INTO table (column1 [, ...]) SELECT... FROM ...

INSERT [INTO] table (column1, [,...])

SELECT ...

FROM ...

INSERT [OVERWRITE] ALL <intoClause> ... INSERT [OVERWRITE] {FIRST | ALL} {WHEN condition THEN <intoClause>}

[...]

[ELSE <intoClause>]

...

注: <intoClause> は、上記の標準の INSERT statement を表します。
BigQuery では、条件付きおよび無条件の複数テーブルの INSERTs はサポートされていません。

BigQuery ではサブクエリ(値の 1 つがサブクエリを使用して計算される)を使用した値の挿入もサポートされますが、Snowflake ではサポートされません。例:

INSERT INTO table (column1, column2)
VALUES ('value_1', (
  SELECT column2
  FROM table2
))

COPY ステートメント

Snowflake は、ステージ ファイルから既存のテーブルへのデータのコピー、テーブルから名前付き内部ステージ、名前付き外部ステージ、外部ロケーション(Amazon S3、Google Cloud Storage、または Microsoft Azure)へのデータのコピーをサポートします。

BigQuery では、データの読み込みに SQL COPY コマンドは使用されませんが、SQL 以外のツールおよびオプションをいくつか自由に使用して、データを BigQuery テーブルに読み込むことができます。また、Apache Spark または Apache Beam で提供されるデータ パイプライン シンクを使用して BigQuery にデータを書き込むこともできます。

UPDATE ステートメント

Snowflake の UPDATE ステートメントの大部分は、BigQuery と互換性があります。次の表に例外を示します。

Snowflake BigQuery

UPDATE table SET col = value [,...] [FROM ...] [WHERE ...]

UPDATE table

SET column = expression [,...]

[FROM ...]

WHERE TRUE


: BigQuery のすべての UPDATE ステートメントには、WHERE キーワードと、その後に続く条件が必要です。

DELETE および TRUNCATE TABLE ステートメント

DELETE ステートメントと TRUNCATE TABLE ステートメントは、どちらもテーブルのスキーマやインデックスに影響を与えることなくテーブルから行を削除する方法です。

Snowflake では DELETETRUNCATE TABLE の両方がデータ保持期間の復元のため、Snowflake のタイムトラベルを使用して削除されたデータを維持します。ただし、DELETE を使用しても、外部ファイルの読み込み履歴と読み込みメタデータは削除されません。

BigQuery では、DELETE ステートメントには WHERE 句が必要です。BigQuery の DELETE の詳細については、DML ドキュメントの BigQuery DELETE の例をご覧ください。

Snowflake BigQuery

DELETE FROM table_name [USING ...]

[WHERE ...]



TRUNCATE [TABLE] [IF EXISTS] table_name

DELETE [FROM] table_name [alias]

WHERE ...


注: BigQuery DELETE ステートメントには WHERE 句が必要です。

MERGE ステートメント

MERGE ステートメントでは、INSERTUPDATEDELETE オペレーションを 1 つの「upsert」ステートメントに組み合わせて、自動的に実行できます。MERGE オペレーションでは、ターゲット行ごとに最大で 1 つのソース行を対応させる必要があります。

BigQuery のテーブルでは、DML ステートメントの数が 1 日あたり 1,000 件に制限されているため、次の表に示されるように INSERT、UPDATE、DELETE ステートメントを 1 つの MERGE ステートメントに統合して最適化する必要があります。

Snowflake BigQuery

MERGE INTO target USING source ON target.key = source.key WHEN MATCHED AND source.filter = 'Filter_exp' THEN

UPDATE SET target.col1 = source.col1, target.col1 = source.col2,

...


注: Snowflake では、非確定的な結果を処理するために ERROR_ON_NONDETERMINISTIC_MERGE セッション パラメータがサポートされています。

MERGE target

USING source

ON target.key = source.key

WHEN MATCHED AND source.filter = 'filter_exp' THEN

UPDATE SET

target.col1 = source.col1,

target.col2 = source.col2,

...



注: すべての列を更新するには、すべての列をリストする必要があります。

GET および LIST ステートメント

GET ステートメントは、次のいずれかの Snowflake ステージからクライアント マシンのローカル ディレクトリ / フォルダにデータファイルをダウンロードします。

  • 名前付き内部ステージ
  • 指定されたテーブルの内部ステージ
  • 現在のユーザーの内部ステージ

LIST(LS)ステートメントは、次のいずれかの Snowflake のステージから(つまり、ローカル ファイル システムからアップロードされるか、テーブルからアンロードされる)ステージングされたファイルのリストを返します。

  • 名前付き内部ステージ
  • 名前付き外部ステージ
  • 指定されたテーブルのステージ
  • 現在のユーザーのステージ

BigQuery はステージングのコンセプトをサポートしておらず、GETLIST に相当するものもありません。

PUT および REMOVE ステートメント

PUT ステートメントは、クライアント マシンのローカル ディレクトリまたはフォルダから、次のいずれかの Snowflake ステージにデータファイルをアップロード(つまり、ステージング)します。

  • 名前付き内部ステージ
  • 指定されたテーブルの内部ステージ
  • 現在のユーザーの内部ステージ

REMOVE (RM) ステートメントは、次のいずれかの Snowflake 内部ステージでステージングされたファイルを削除します。

  • 名前付き内部ステージ
  • 指定されたテーブルのステージ
  • 現在のユーザーのステージ

BigQuery はステージングのコンセプトをサポートしておらず、PUTREMOVE に対応するステートメントがありません。

DDL 構文

ここでは、Snowflake と BigQuery のデータ定義言語の構文の違いについて説明します。

データベース、スキーマ、共有 DDL

Snowflake の用語の大部分は BigQuery の用語と同じですが、Snowflake データベースは BigQuery のデータセットに似ているという点が異なります。Snowflake から BigQuery への詳細な用語のマッピングをご覧ください。

CREATE DATABASE ステートメント

Snowflake はデータベース管理コマンドを介したデータベースの作成と管理をサポートし、BigQuery にはデータセットの作成のために、コンソール、CLI、クライアント ライブラリのしようなどの複数のオプションが用意されています。このセクションでは、これらの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

CREATE DATABASE <name>


注: Snowflake では、データベースの命名に関する要件があります。名前に使用できるのは 255 文字のみです。

bq mk <name>


注: BigQuery には、Snowflake と似たデータセットの命名要件がありますが、名前に使用できる文字が 1,024 文字以内である点が異なります。

CREATE OR REPLACE DATABASE <name>

BigQuery ではデータセットの置換はサポートされていません。

CREATE TRANSIENT DATABASE <name>

BigQuery では一時データセットの作成はサポートされていません。

CREATE DATABASE IF NOT EXISTS <name>

BigQuery でサポートされていないコンセプト

CREATE DATABASE <name>

CLONE <source_db>

[ { AT | BEFORE }

( { TIMESTAMP => <timestamp> |

OFFSET => <time_difference> |

STATEMENT => <id> } ) ]

BigQuery では、データセットのクローン作成はまだサポートされていません。

CREATE DATABASE <name>

DATA_RETENTION_TIME_IN_DAYS = <num>

BigQuery では、データセット レベルでのタイムトラベルはサポートされていません。ただし、テーブルとクエリ結果のタイムトラベルはサポートされています。

CREATE DATABASE <name>

DEFAULT_DDL_COLLATION = '<collation_specification>'

DDL での照合は BigQuery ではサポートされていません。

CREATE DATABASE <name>

COMMENT = '<string_literal>'

bq mk \

--description "<string_literal>" \

<name>

CREATE DATABASE <name>

FROM SHARE <provider_account>.<share_name>

BigQuery では共有データセットの作成はサポートされていません。ただし、データセットが作成されると、ユーザーはコンソールまたは UI からデータセットを共有できます。

CREATE DATABASE <name>

AS REPLICA OF

<region>.<account>.<primary_db_name>

AUTO_REFRESH_MATERIALIZED_VIEWS_ON_SECONDARY = { TRUE | FALSE }


注: Snowflake には、BigQuery でサポートされていないセカンダリ データベースにマテリアライズド ビューの自動バックグラウンド メンテナンスのオプションが用意されています。

bq mk --transfer_config \

--target_dataset = <name> \

--data_source = cross_region_copy \ --params='

{"source_dataset_id":"<primary_db_name>"

,"source_project_id":"<project_id>"

,"overwrite_destination_table":"true"}'

注: BigQuery では、BigQuery Data Transfer Service を使用したデータセットのコピーがサポートされています。データセットのコピーの前提条件については、こちらをご覧ください。

BigQuery では、次の bq mk コマンド オプションもサポートされています。Snowflake にはこれに直接対応するものはありません。

  • --location <dataset_location>
  • --default_table_expiration <time_in_seconds>
  • --default_partition_expiration <time_in_seconds>

ALTER DATABASE ステートメント

このセクションでは、ALTER ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

ALTER DATABASE [ IF EXISTS ] <name> RENAME TO <new_db_name>

BigQuery ではデータセットの名前変更はサポートされていませんが、データセットのコピーはサポートされています。

ALTER DATABASE <name>

SWAP WITH <target_db_name>

BigQuery では、データセットのスワップはサポートされていません。

ALTER DATABASE <name>

SET

[DATA_RETENTION_TIME_IN_DAYS = <num>]

[ DEFAULT_DDL_COLLATION = '<value>']

BigQuery では、データセット レベルでのデータの保持と照合はサポートされていません。

ALTER DATABASE <name>

SET COMMENT = '<string_literal>'

bq update \

--description "<string_literal>" <name>

ALTER DATABASE <name>

ENABLE REPLICATION TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name>

DISABLE REPLICATION [ TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]]

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name>

SET AUTO_REFRESH_MATERIALIZED_VIEWS_ON_SECONDARY = { TRUE | FALSE }

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name> REFRESH

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name>

ENABLE FAILOVER TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name>

DISABLE FAILOVER [ TO ACCOUNTS <snowflake_region>.<account_name>

[ , <snowflake_region>.<account_name> ... ]]

BigQuery では、このコンセプトはサポートされていません。

ALTER DATABASE <name>

PRIMARY

BigQuery では、このコンセプトはサポートされていません。

DROP DATABASE ステートメント

このセクションでは、DROP ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

DROP DATABASE [ IF EXISTS ] <name>

[ CASCADE | RESTRICT ]


注: Snowflake では、データベースを破棄してもシステムから完全に削除されることはありません。破棄されたデータベースのバージョンは、データベースに対して DATA_RETENTION_TIME_IN_DAYS パラメータで指定された日数の間保持されます。

bq rm -r -f -d <name>


Where

-r は、データセット内のすべてのオブジェクトを削除します

-f is to skip confirmation for execution

-d はデータセットを示します

注: BigQuery では、データセットの削除は永続的です。また、データセット内のすべてのデータとオブジェクトが削除されるため、データセット レベルでのカスケードはサポートされていません。

Snowflake は UNDROP DATASET コマンドもサポートしています。このコマンドは、破棄したデータセットの最新バージョンを復元します。これは現在、BigQuery でデータセット レベルではサポートされていません。

USE DATABASE ステートメント

Snowflake では、USE DATABASE コマンドを使用してユーザー セッションのデータベースを設定できます。これにより、SQL コマンドで完全修飾オブジェクト名を指定する必要がなくなります。BigQuery には、Snowflake の USE DATABASE コマンドに対応するものはありません。

SHOW DATABASE ステートメント

このセクションでは、SHOW ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

SHOW DATABASES


注: Snowflake では、保持期間内に破棄されたデータベースを含むすべてのデータベースの詳細を 1 つの方法で一覧表示できます。
bq ls --format=prettyjson
/

bq show <dataset_name>


注: BigQuery では、ls コマンドはデータセット名と基本情報のみを表示し、show コマンドは最終更新時のタイムスタンプ、ACL、データセットのラベルなどの詳細を表示します。BigQuery では、情報スキーマを使用してデータセットの詳細情報も確認できます。

SHOW TERSE DATABASES


注: TERSE オプションを使用すると、Snowflake でデータセットに関する特定の情報やフィールドのみを表示できます。
BigQuery では、このコンセプトはサポートされていません。

SHOW DATABASES HISTORY

タイムトラベルのコンセプトは、BigQuery でデータセット レベルではサポートされていません。
SHOW DATABASES

[LIKE '<pattern>']

[STARTS WITH '<name_string>']

BigQuery では、データセット名による結果のフィルタリングはサポートされていません。ただし、ラベルによるフィルタリングはサポートされています。
SHOW DATABASES

LIMIT <rows> [FROM '<name_string>']


注: デフォルトでは、Snowflake では結果の数に制限はありません。ただし、LIMIT の値が 10,000 を超えることはできません。

bq ls \

--max_results <rows>


注: デフォルトでは、BigQuery は 50 件の結果のみを表示します。

BigQuery では、次の bq コマンド オプションもサポートされています。Snowflake にはこれらに直接対応するものはありません。

  • bq ls --format=pretty: 基本的なフォーマット済みの結果が返されます
  • *bq ls -a: *匿名データセット(アンダースコアで始まるデータセット)のみが返されます
  • bq ls --all: 匿名のデータセットを含むすべてのデータセットが返されます
  • bq ls --filter labels.key:value: データセット ラベルでフィルタした結果が返されます
  • bq ls --d: 匿名データセットの結果を除外します
  • bq show --format=pretty: すべてのデータセットに対する基本的なフォーマット済みの結果が返されます

SCHEMA の管理

Snowflake には、データベース管理コマンドと同様に、複数のスキーマ管理コマンドが用意されています。BigQuery では、スキーマの作成と管理というこのコンセプトはサポートされていません。

ただし、BigQuery では、データをテーブルに読み込むとき、および空のテーブルを作成するときにテーブルのスキーマを指定できます。あるいは、サポートされているデータ形式についてスキーマの自動検出を使用することもできます。

SHARE の管理

Snowflake には、データベースとスキーマの管理コマンドに似た複数の共有管理コマンドがあります。BigQuery では、共有の作成と管理というこのコンセプトはサポートされていません。

テーブル、ビュー、シーケンス DDL

CREATE TABLE ステートメント

Snowflake の CREATE TABLE ステートメントの大部分は、BigQuery と互換性がありますが、例外として次の構文要素は BigQuery で使用されません。

Snowflake BigQuery

CREATE TABLE table_name

(

col1 data_type1 NOT NULL,

col2 data_type2 NULL,

col3 data_type3 UNIQUE,

col4 data_type4 PRIMARY KEY,

col5 data_type5

)


注: UNIQUE 制約と PRIMARY KEY 制約は情報提供を目的としており、Snowflake システムでは適用されません。

CREATE TABLE table_name

(

col1 data_type1 NOT NULL,

col2 data_type2,

col3 data_type3,

col4 data_type4,

col5 data_type5,

)

CREATE TABLE table_name

(

col1 data_type1[,...]

table_constraints

)


ここで、 table_constraints は:

[UNIQUE(column_name [, ... ])]

[PRIMARY KEY(column_name [, ...])]

[FOREIGN KEY(column_name [, ...])

REFERENCES reftable [(refcolumn)]


注: UNIQUE 制約と PRIMARY KEY 制約は情報提供を目的としており、Snowflake システムでは適用されません。

CREATE TABLE table_name

(

col1 data_type1[,...]

)

PARTITION BY column_name

CLUSTER BY column_name [, ...]


注: BigQuery では、UNIQUEPRIMARY KEYFOREIGNKEY の各テーブル制約は使用されません。これらの制約によって提供されるものと同様の最適化をクエリの実行時に実現するには、BigQuery テーブルをパーティション化およびクラスタ化します。CLUSTER BY は最大 4 列をサポートします。

CREATE TABLE table_name

LIKE original_table_name

INFORMATION_SCHEMA テーブルを使用して列名、データ型、および NOT NULL 制約を新しいテーブルにコピーする方法については、この例を参照してください。

CREATE TABLE table_name

(

col1 data_type1

)

BACKUP NO


注: Snowflake では BACKUP NO が「スナップショットの作成時およびスナップショットからの復元時に処理時間を節約し、ストレージ容量を減らす」と指定されています。
BACKUP NO テーブル オプションは使用されず、必要でもありません。これは、BigQuery では処理時間にも課金対象ストレージにも影響を与えることなく、テーブルの過去バージョンが最大 7 日間、自動的に保存されるためです。

CREATE TABLE table_name

(

col1 data_type1

)

table_attributes


ここで、 table_attributes は:

[DISTSTYLE {AUTO|EVEN|KEY|ALL}]

[DISTKEY (column_name)]

[[COMPOUND|INTERLEAVED] SORTKEY

(column_name [, ...])]

BigQuery ではクラスタリングがサポートされており、並べ替えた順序でキーを保存できます。

CREATE TABLE table_name

AS SELECT ...

CREATE TABLE table_name

AS SELECT ...

CREATE TABLE IF NOT EXISTS table_name

...

CREATE TABLE IF NOT EXISTS table_name

...

BigQuery は DDL ステートメント CREATE OR REPLACE TABLE ステートメントもサポートされます。このステートメントでは、既存のテーブル(存在する場合)が上書きされます。

BigQuery の CREATE TABLE ステートメントでは次の句もサポートされています。Snowflake には、これらと同等のものはありません。

BigQuery の CREATE TABLE の詳細については、DDL ドキュメントの CREATE TABLE ステートメントの例をご覧ください。

ALTER TABLE ステートメント

このセクションでは、テーブル用の ALTER ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_name>

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (friendly_name="<new_name>")

ALTER TABLE <name>

SWAP WITH <target_db_name>

BigQuery では、テーブルのスワップはサポートされていません。

ALTER TABLE <name>

SET

[DEFAULT_DDL_COLLATION = '<value>']

BigQuery では、テーブルのデータ照合の管理はポートされていません。

ALTER TABLE <name>

SET

[DATA_RETENTION_TIME_IN_DAYS = <num>]

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (expiration_timestamp=<timestamp>)

ALTER TABLE <name>

SET

COMMENT = '<string_literal>'

ALTER TABLE [IF EXISTS] <name>

SET OPTIONS (description='<string_literal>')

さらに Snowflake には、BigQuery でサポートされていないテーブルを変更するためのクラスタリング、列、制約のオプションが用意されています。

DROP TABLE および UNDROP TABLE ステートメント

このセクションでは、DROP ステートメントと UNDROP ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery

DROP TABLE [IF EXISTS] <table_name>

[CASCADE | RESTRICT]


注: Snowflake では、テーブルを破棄してもシステムから完全に削除されることはありません。破棄されたテーブルのバージョンは、データベースに対して DATA_RETENTION_TIME_IN_DAYS パラメータで指定された日数の間保持されます。

bq rm -r -f -d <dataset_name>.<table_name>


Where

-r は、データセット内のすべてのオブジェクトを削除します
-f は、実行の確認をスキップします
-d は、データセットを示します

注: BigQuery では、テーブルの削除も永続的ではありませんが、スナップショットは現在、7 日間のみ保持されます。

UNDROP TABLE <table_name>

bq cp \ <dataset_name>.<table_name>@<unix_timestamp> <dataset_name>.<new_table_name>


: BigQuery では、テーブルが存在していたときの UNIX タイムスタンプ(ミリ秒単位)を最初に特定する必要があります。次に、そのタイムスタンプの時点のテーブルを新しいテーブルにコピーします。 新しいテーブルの名前は、削除したテーブルとは異なる名前にする必要があります。

CREATE EXTERNAL TABLE ステートメント

BigQuery では、永続テーブルと一時外部テーブルの両方を作成し、次のデータに対して直接クエリを実行できます。

Snowflake では、永続外部テーブルを作成できます。このテーブルに対してクエリを実行すると、指定された外部ステージにある 1 つ以上のファイルのセットからデータが読み取られます。

このセクションでは、CREATE EXTERNAL TABLE ステートメントでの違いに対処するために、Snowflake コマンドに対応する BigQuery CLI コマンドを使用します。

Snowflake BigQuery
CREATE [OR REPLACE] EXTERNAL TABLE

table

((<col_name> <col_type> AS <expr> )

| (<part_col_name> <col_type> AS <part_expr>)[ inlineConstraint ]

[ , ... ] )

LOCATION = externalStage

FILE_FORMAT =

({FORMAT_NAME='<file_format_name>'

|TYPE=source_format [formatTypeOptions]})


Where:

externalStage = @[namespace.]ext_stage_name[/path]


: Snowflake では、読み取るデータが含まれているファイルをステージングし、外部テーブルのフォーマット タイプ オプションを指定できます。Snowflake の形式タイプ(CSV、JSON、AVRO、PARQUET、ORC)は、XML タイプを除き、すべて BigQuery でサポートされています。

[1] bq mk \

--external_table_definition=definition_file \

dataset.table


OR


[2] bq mk \

--external_table_definition=schema_file@source_format={Cloud Storage URI | drive_URI} \

dataset.table


OR


[3] bq mk \

--external_table_definition=schema@source_format = {Cloud Storage URI | drive_URI} \

dataset.table


: BigQuery では、テーブル定義ファイル [1]、JSON スキーマ ファイル [2]、インライン スキーマ定義 [3] を使用して、データソースにリンクされた永続テーブルを作成できます。BigQuery では、読み取るファイルのステージングとフォーマット タイプ オプションの指定はサポートされていません。

CREATE [OR REPLACE] EXTERNAL TABLE [IF EXISTS]

<table_name>

((<col_name> <col_type> AS <expr> )

[ , ... ] )

[PARTITION BY (<identifier>, ...)]

LOCATION = externalStage

[REFRESH_ON_CREATE = {TRUE|FALSE}]

[AUTO_REFRESH = {TRUE|FALSE}]

[PATTERN = '<regex_pattern>']

FILE_FORMAT = ({FORMAT_NAME = '<file_format_name>' | TYPE = { CSV | JSON | AVRO | ORC | PARQUET} [ formatTypeOptions]})

[COPY GRANTS]

[COMMENT = '<string_literal>']

bq mk \

--external_table_definition=definition_file \

dataset.table


注: BigQuery では現在、外部テーブルの作成用に Snowflake のオプション パラメータのオプションはサポートされていません。パーティショニングの場合、BigQuery では _FILE_NAME 疑似列を使用して、外部テーブルの上にパーティション分割テーブルやビューを作成できます。詳細については、_FILE_NAME 疑似列のクエリをご覧ください。

さらに BigQuery では、デフォルトの Hive パーティショニング レイアウトを使用して Google Cloud Storage に保存されている AVRO、PARQUET、ORC、JSON、CSV 形式の外部でパーティションに分割されたデータのクエリもサポートされています。

CREATE VIEW ステートメント

次の表は、Snowflake と BigQuery で CREATE VIEW ステートメントに相当するものを示しています。

Snowflake BigQuery

CREATE VIEW view_name AS SELECT ...

CREATE VIEW view_name AS SELECT ...

CREATE OR REPLACE VIEW view_name AS SELECT ...

CREATE OR REPLACE VIEW

view_name AS SELECT ...

CREATE VIEW view_name

(column_name, ...)

AS SELECT ...

CREATE VIEW view_name

AS SELECT ...

非対応 CREATE VIEW IF NOT EXISTS

view_name

OPTIONS(view_option_list)

AS SELECT ...

CREATE VIEW view_name

AS SELECT ...

WITH NO SCHEMA BINDING

BigQuery でビューを作成するには、参照されるすべてのオブジェクトがすでに存在している必要があります。

BigQuery を使用すると、外部データソースにクエリを実行できます。

CREATE SEQUENCE ステートメント

シーケンスは BigQuery では使用されません。この機能は次のバッチ方法で実現できます。サロゲートキーと変化が緩やかなディメンション(SCD)について詳しくは、次のガイドをご覧ください。

INSERT INTO dataset.table SELECT *, ROW_NUMBER() OVER () AS id FROM dataset.table

データ読み込みと DDL のアンロード

Snowflake は、ステージ、ファイル形式、パイプ管理コマンドによるデータの読み込みとアンロードをサポートしています。BigQuery には、bq load、BigQuery Data Transfer Service、bq extract などの複数のオプションも用意されています。このセクションでは、データの読み込みとアンロードでのこれらの方法の使用の違いについて説明します。

アカウントとセッションの DDL

Snowflake のアカウントとセッションのコンセプトは、BigQuery ではサポートされていません。BigQuery では、Cloud IAM を使用してすべてのレベルでアカウントを管理できます。BigQuery では、マルチステートメント トランザクションはまだサポートされていません。

ユーザー定義関数(UDF)

UDF を使用すると、カスタム操作用の関数を作成できます。これらの関数は入力列を受け取ってアクションを実行し、その結果を値として返します。

SnowflakeBigQuery はどちらも、SQL 式と JavaScript コードを使用した UDF をサポートしています。

一般的な BigQuery UDF のライブラリについては、GoogleCloudPlatform/bigquery-utils/ の GitHub リポジトリを参照してください。

CREATE FUNCTION の構文

次のテーブルに、Snowflake と BigQuery の SQL UDF 作成構文の違いを示します。

Snowflake BigQuery

CREATE [ OR REPLACE ] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition

s

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

AS sql_function_definition


注: BigQuery の SQL UDF では、返されるデータ型の指定は任意です。BigQuery は、クエリが関数を呼び出すときに SQL 関数本文から関数の結果の型を推測します。

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS TABLE (col_name, col_data_type[,..])

AS sql_function_definition


CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: BigQuery の SQL UDF では現在、テーブルタイプを返すことはサポートされていませんが、プロダクト ロードマップに記載されており、まもなくご利用いただけるようになります。ただし、BigQuery は STRUCT 型の ARRAY を返すことはサポートしています。

CREATE [SECURE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: Snowflake には、UDF の定義と詳細を承認済みユーザー(ビューを所有するロールが付与されたユーザー)のみに制限する安全なオプションがあります。

CREATE FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: 関数のセキュリティは、BigQuery では構成可能なパラメータではありません。BigQuery では、IAM のロールと権限を作成して、基礎となるデータと関数定義へのアクセスを制限できます。

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[ { CALLED ON NULL INPUT | { RETURNS NULL ON NULL INPUT | STRICT } } ]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: null 入力に対する関数の動作は BigQuery で暗黙的に処理され、別のオプションとして指定する必要はありません。

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: 関数の変動性は、BigQuery では構成可能なパラメータではありません。BigQuery UDF の変動性はすべて、Snowflake の IMMUTABLE の変動性と同等です(つまり、データベースのルックアップを行わず、また引数リストに直接存在しない情報を使用しません)。

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS [' | $$]

sql_function_definition

[' | $$]

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


注: 単一引用符やドル記号のような文字シーケンスの使用は($$) is not required or supported in BigQuery. BigQuery implicitly interprets the SQL expression.

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS sql_function_definition

CREATE [OR REPLACE] FUNCTION

function_name

([sql_arg_name sql_arg_data_type[,..]])

RETURNS data_type

AS sql_function_definition


Note:Adding comments or descriptions in UDFs is currently not supported in BigQuery.

CREATE [OR REPLACE] FUNCTION function_name

(x integer, y integer)

RETURNS integer

AS $$

SELECT x + y

$$


Note: Snowflake does not support ANY TYPE for SQL UDFs. However, it supports using VARIANT data types.

CREATE [OR REPLACE] FUNCTION function_name

(x ANY TYPE, y ANY TYPE)

AS

SELECT x + y



Note: BigQuery supports using ANY TYPE as argument type. The function will accept an input of any type for this argument. For more information, see templated parameter in BigQuery.

BigQuery also supports the CREATE FUNCTION IF NOT EXISTSstatement which treats the query as successful and takes no action if a function with the same name already exists.

BigQuery's CREATE FUNCTIONstatement also supports creating TEMPORARY or TEMP functions, which do not have a Snowflake equivalent. See calling UDFs for details on executing a BigQuery persistent UDF.

DROP FUNCTION syntax

The following table addresses differences in DROP FUNCTION syntax between Snowflake and BigQuery.

Snowflake BigQuery

DROP FUNCTION [IF EXISTS]

function_name

([arg_data_type, ... ])

DROP FUNCTION [IF EXISTS] dataset_name.function_name


Note: BigQuery does not require using the function's signature (argument data type) for deleting the function.

BigQuery requires that you specify the project_name if the function is not located in the current project.

Additional function commands

This section covers additional UDF commands supported by Snowflake that are not directly available in BigQuery.

ALTER FUNCTION syntax

Snowflake supports the following operations using ALTER FUNCTION syntax.

  • Renaming a UDF
  • Converting to (or reverting from) a secure UDF
  • Adding, overwriting, removing a comment for a UDF

As configuring function security and adding function comments is not available in BigQuery, ALTER FUNCTION syntax is currently not supported. However, the CREATE FUNCTION statement can be used to create a UDF with the same function definition but a different name.

DESCRIBE FUNCTION syntax

Snowflake supports describing a UDF using DESC[RIBE] FUNCTION syntax. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

SHOW USER FUNCTIONS syntax

In Snowflake, SHOW USER FUNCTIONS syntax can be used to list all UDFs for which users have access privileges. This is currently not supported in BigQuery. However, querying UDF metadata via INFORMATION SCHEMA will be available soon as part of the product roadmap.

Stored procedures

Snowflake stored procedures are written in JavaScript, which can execute SQL statements by calling a JavaScript API. In BigQuery, stored procedures are defined using a block of SQL statements.

CREATE PROCEDURE syntax

In Snowflake, a stored procedure is executed with a CALL command while in BigQuery, stored procedures are executed like any other BigQuery function.

The following table addresses differences in stored procedure creation syntax between Snowflake and BigQuery.

Snowflake BigQuery

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS procedure_definition;


Note: Snowflake requires that stored procedures return a single value. Hence, return data type is a required option.
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_mode arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


arg_mode: IN | OUT | INOUT


Note: BigQuery doesn't support a return type for stored procedures. Also, it requires specifying argument mode for each argument passed.

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

AS

$$

javascript_code

$$;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

statement_list

END;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[{CALLED ON NULL INPUT | {RETURNS NULL ON NULL INPUT | STRICT}}]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


注: null 入力に対するプロシージャの動作は BigQuery で暗黙的に処理され、別のオプションとして指定する必要はありません。
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[VOLATILE | IMMUTABLE]

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


注: プロシージャの変動性は、BigQuery では構成可能なパラメータではありません。Snowflake の IMMUTABLE の変動性と同等です。
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[COMMENT = '<string_literal>']

AS procedure_definition;

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


注: 現時点では、BigQuery でプロシージャの定義にコメントや説明を追加することはできません。
CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

RETURNS data_type

[EXECUTE AS { CALLER | OWNER }]

AS procedure_definition;


注: Snowflake では、実行するプロシージャの呼び出し元または所有者を指定できます。

CREATE [OR REPLACE] PROCEDURE

procedure_name

([arg_name arg_data_type[,..]])

BEGIN

procedure_definition

END;


注: BigQuery のストアド プロシージャは、常に呼び出し元として実行されます。

BigQuery では、CREATE PROCEDURE IF NOT EXISTS ステートメントもサポートされます。同じ名前の関数がすでに存在する場合、このステートメントはクエリを成功として扱って何も実行しません。

DROP PROCEDURE の構文

次のテーブルに、Snowflake と BigQuery の DROP FUNCTION 構文の違いを示します。

Snowflake BigQuery

DROP PROCEDURE [IF EXISTS]

procedure_name

([arg_data_type, ... ])

DROP PROCEDURE [IF EXISTS] dataset_name.procedure_name


注: BigQuery では、プロシージャを削除するためにプロシージャの署名(引数のデータ型)を使用する必要はありません。

BigQuery では、プロシージャが現在のプロジェクトに配置されていない場合、project_name を指定する必要があります。

その他のプロシージャ コマンド

Snowflake では、ALTER PROCEDUREDESC[RIBE] PROCEDURESHOW PROCEDURES などの追加のコマンドを使用してストアド プロシージャを管理します。現在、これらのコマンドは BigQuery ではサポートされていません。

メタデータおよびトランザクション SQL ステートメント

Snowflake BigQuery

BEGIN [ { WORK | TRANSACTION } ] [ NAME <name> ]; START_TRANSACTION [ name <name> ];

BigQuery では、常にスナップショット分離が使用されます。詳しくは、このドキュメントの整合性の保証についての説明をご覧ください。

COMMIT;

BigQuery では使用されません。

ROLLBACK;

BigQuery では使用されません

SHOW LOCKS [ IN ACCOUNT ]; SHOW TRANSACTIONS [ IN ACCOUNT ]; Note: If the user has the ACCOUNTADMIN role, the user can see locks/transactions for all users in the account.

BigQuery では使用されません。

複数ステートメントおよび複数行 SQL ステートメント

Snowflake と BigQuery はどちらも、トランザクション(セッション)をサポートしているため、一貫して一緒に実行されるセミコロンで区切られたステートメントをサポートしています。詳細については、マルチステートメント トランザクションをご覧ください。

ステージングされたファイルのメタデータ列

Snowflake は内部ステージおよび外部ステージにあるファイルのメタデータを自動的に生成します。このメタデータは、通常のデータ列とともにクエリを実行してテーブルに読み込むことができます。次のメタデータ列を使用できます。

整合性の保証とトランザクション分離

Snowflake と BigQuery はどちらもアトミックです。つまり、多数の行にわたってミューテーション単位で ACID に準拠しています。

トランザクション

各 Snowflake トランザクションには一意の開始時刻(ミリ秒を含む)が割り当てられ、これがトランザクション ID として設定されます。Snowflake では READ COMMITTED 分離レベルのみがサポートされています。ただし、2 つのステートメントが同じトランザクション内にある場合、一方のステートメントで行われた変更は、まだ commit されていないでも、別のステートメントで参照できます。Snowflake トランザクションは、リソースの変更時にリソース(テーブル)をロックを取得します。ユーザーは、ステートメントがタイムアウトするまで待機するブロックされたステートメントの最大時間を調整できます。AUTOCOMMIT パラメータが有効になっていると、DML ステートメントが自動的に commit されます。

また、BigQuery はトランザクションをサポートしています。BigQuery では、スナップショット分離を使用して、オプティミスティック同時実行制御(最初の commit が優先)が確実に実行されるようにします。この場合、クエリは、クエリが開始される前に最後に commit されたデータを読み取ります。この方法により、行ごと、ミューテーションごと、および同じ DML ステートメント内の行全体で同じレベルの整合性が保証され、デッドロックも回避されます。同じテーブルに対して複数の DML 更新を行う場合、BigQuery はペシミスティック同時実行制御に切り替わります。読み込みジョブは完全に独立して実行され、テーブルへの連結を実行できます。しかし BigQuery では、明示的なトランザクション境界もセッションもまだ提供されていません。

ロールバック

トランザクションが commit またはロールバックされる前に、Snowflake トランザクションのセッションが予期せず終了した場合、トランザクションは切断された状態のままになります。ユーザーは SYSTEM$ABORT_TRANSACTION を実行して、切断されたトランザクションを中止する必要があります。中止しない場合、切断されたトランザクションは、Snowflake によって 4 時間のアイドル状態の経過後にロールバックされます。デッドロックが発生すると、Snowflake はデッドロックを検出し、ロールバックする新しいステートメントを選択します。明示的に開いたトランザクションの DML ステートメントが失敗した場合、変更はロールバックされますが、トランザクションは commit またはロールバックされるまで開いたままになります。Snowflake の DDL ステートメントは自動 commit されるため、ロールバックできません。

BigQuery では ROLLBACK TRANSACTION ステートメントがサポートされています。BigQuery には ABORT ステートメントがありません。

データベースに関する上限

最新の割り当てと上限については、必ず BigQuery の公開ドキュメントを確認してください。大量のユーザーに多数の割り当てを行う場合は、Cloud サポートチームに連絡して上限を引き上げることができます。

すべての Snowflake アカウントには、デフォルトでソフトリミットが設定されています。ソフトリミットはアカウント作成時に設定され、変更される可能性があります。Snowflake の多くのソフトリミットは、Snowflake アカウント チームまたはサポート チケットを使用して引き上げることができます。

次の表に、Snowflake と BigQuery のデータベースに関する上限の比較を示します。

上限 Snowflake BigQuery
クエリテキストのサイズ 1 MB 1 MB
同時実行クエリの最大数 XS ウェアハウス - 8
S ウェアハウス - 16
M ウェアハウス - 32
L ウェアハウス - 64
XL ウェアハウス - 128
100