Snowflake SQL 翻譯指南

本文詳述 Snowflake 和 BigQuery 之間 SQL 語法的相似與差異之處,協助加速將企業資料倉儲 (EDW) 移至 BigQuery 的規劃與執行作業。Snowflake 資料倉儲技術專為與 Snowflake 專屬的 SQL 語法搭配使用而設計。由於 SQL 方言會因為服務不同而有差異,針對 Snowflake 撰寫的指令碼必須先進行修改才可在 BigQuery 中使用。您可以使用批次 SQL 翻譯大量遷移 SQL 指令碼,或是使用互動式 SQL 翻譯翻譯臨時查詢。兩個工具在預先發布版中都支援 Snowflake SQL。

資料類型

本節說明 Snowflake 和 BigQuery 的資料類型之間的對應關係。



Snowflake BigQuery 附註
NUMBER/ DECIMAL/NUMERIC NUMERIC/BIGNUMERIC 視精確度和比例而定,可對應至 NUMERICBIGNUMERIC

Snowflake 中的 NUMBER 資料類型支援 38 位精確度和 37 位小數位數。您可以根據使用者指定精確度和比例。

BigQuery 支援 NUMERICBIGNUMERIC可在特定範圍內指定精確度和比例
INT/INTEGER BIGNUMERIC INT/INTEGER 和所有其他類似 INT 的資料類型 (例如 BIGINT, TINYINT, SMALLINT, BYTEINT) 代表 NUMBER 資料類型的別名,其中精確度和比例無法指定,且一律為 NUMBER(38, 0)
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,而 Snowflake 中的 BOOL 資料類型則可接受 TRUE/FALSE/NULL。
DATE DATE Snowflake 中的 DATE 類型可接受多數常見日期格式,這與 BigQuery 中的 DATE 類型不同,後者只接受格式為「YYYY-[M]M-[D]D」的日期。
TIME TIME Snowflake 中的 TIME 類型支援 0 到 9 奈秒的精確度,而 BigQuery 中的 TIME 類型則支援 0 到 6 奈秒的精確度。
TIMESTAMP DATETIME TIMESTAMP 是使用者可設定的別名,預設值為 TIMESTAMP_NTZ,會對應至 BigQuery 中的 DATETIME
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 別名和 ID 不區分大小寫。為保留大小寫,請使用雙引號 (「」) 將別名和 ID 括起來。

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 的替代方案。timestamp 的值不得早於目前時間戳記的 7 天前。

@[namespace]<stage_name>[/path]

BigQuery 不支援階段檔案的概念。

SELECT*

FROM table

START WITH predicate

CONNECT BY

[PRIOR] col1 = [PRIOR] col2

[, ...]

...

BigQuery 並未提供 Snowflake CONNECT BY 的直接替代方案。

您可以在 FROM 子句中使用以下方式參照 BigQuery 資料表:

  • [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 都支援下列聯結類型:

Snowflake 和 BigQuery 都支援 ONUSING 子句。

下表列出一些細微差異。

Snowflake BigQuery

SELECT col1

FROM table1

NATURAL JOIN

table2

SELECT col1

FROM table1

INNER JOIN

table2

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


注意:在 BigQuery 中,JOIN 子句需要 JOIN 條件,除非是 CROSS 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 子句包含一或多個具名的子查詢,每當後續的 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 是同義詞。請注意,HAVING 會在 GROUP 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 BY 子句BigQuery ORDER BY 子句之間有一些細微差異。

Snowflake BigQuery
在 Snowflake 中,NULL 預設會排在最後 (遞增順序)。 在 BigQuery 中,NULLS 預設會排在第一位 (由小到大排序)。
您可以分別使用 NULLS FIRST NULLS LAST,指定 NULL 值應排在前面還是最後面。 在 BigQuery 中,沒有等同於 NULL 值的指定值,無法指定 NULL 值應在 BigQuery 中排在前面還是後面。

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 不支援 FETCHLIMIT 取代 FETCH

注意:在 BigQuery 中,OFFSET 必須搭配 LIMIT 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;

在 BigQuery 中,含有 ROW_NUMBER()COUNT() 等分析函式和 OVER PARTITION BY 的 Snowflake QUALIFY 子句會以 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 不支援使用 Window 函式的 APPROX_COUNT_DISTINCT

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


注意:Snowflake 沒有 RESPECT NULLS 選項

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


注意:BigQuery 不支援使用 Window 函式的 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 不支援使用 Window 函式的 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 變異的方法,是將一個雜湊函式的最小值保留為
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 不支援使用 Window 函式的 HLL_COUNT… 。使用者無法在單一 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 實作 MINHASH,並使用 k 不同的雜湊函式。另一種減少 MINHASH 變異的方法,是保留一個雜湊函式的最小值 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 至少需要兩個運算式。BigQuery 只需要一個。

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。使用者必須使用 IS NULL 而非 = NULL,才能將 NULL 選取運算式與 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 不會強制在 CURRENT_DATE 指令後方加上 '()',以符合 ANSI 標準。

CURRENT_DATE([timezone])


注意:BigQuery 的 CURRENT_DATE 支援選用的時區規格。

CURRENT_REGION()

SELECT location

FROM INFORMATION_SCHEMA.SCHEMATA


注意:與 Snowflake 的 CURRENT_REGION() 相比,BigQuery 的 INFORMATION_SCHEMA.SCHEMATA 會傳回更通用的位置參照。並非直接比較。

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 允許選用的秒數小數精確度。有效值範圍為 0 到 9 奈秒。預設值為 9。為了符合 ANSI 標準,您可以不使用 '()' 呼叫這個方法。

CURRENT_TIME()

CURRENT_TIMESTAMP[([frac_sec_prec])]


注意:Snowflake 允許選用的秒數小數精確度。有效值範圍為 0 到 9 奈秒。預設值為 9。為符合 ANSI 規範,您可以不使用 '()' 呼叫此方法。請將 TIMEZONE 設為工作階段參數。

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


注意:CURRENT_DATETIME 會傳回 DATETIME 資料類型 (Snowflake 不支援)。CURRENT_TIMESTAMP 會傳回 TIMESTAMP 資料類型。

CURRENT_TRANSACTION()

SELECT job_id

FROM INFORMATION_SCHEMA.JOBS_BY_*

注意:BigQuery 的 INFORMATION_SCHEMA.JOBS_BY_* 可讓您依工作類型、開始/結束時間等搜尋工作 ID。

CURRENT_USER[()]


注意:Snowflake 不會強制在 CURRENT_USER 指令後方加上 '()',以符合 ANSI 標準。

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 不會強制在 LOCALTIME 指令後方加上 '()',以符合 ANSI 標準。

CURRENT_TIME()

LOCALTIMESTAMP()

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


注意:CURRENT_DATETIME 會傳回 DATETIME 資料類型 (Snowflake 不支援)。CURRENT_TIMESTAMP 會傳回 TIMESTAMP 資料類型。

轉換函式

下表列出常見 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_TIMEFORMAT_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]]


注意:Snowflake 的 DECIMALNUMBERNUMERIC 資料類型的格式模型可在這裡找到。BigQuery 沒有 VARIANT 資料類型的替代方案。

ROUND(CAST(expression AS NUMERIC)

, x)


注意:您可以使用 FORMAT. 為 BigQuery 的輸入式樣式設定格式

TO_DOUBLE(expression[, format])


注意:Snowflake 的 DOUBLE 資料類型格式模型可在這個頁面找到。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])


注意:Snowflake 的 STRING 資料類型格式模型可在這個頁面找到。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 中,source_timezone 一律為世界標準時間

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,

start_date_or_time,

end_date_or_time

)


注意:Snowflake 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。

DATE_DIFF(

end_date,

start_date,

part

)


DATETIME_DIFF(

end_datetime,

start_datetime,

part

)


TIME_DIFF(

start_time,

end_time,

part

)


TIMESTAMP_DIFF(

end_timestamp,

start_timestamp,

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 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。

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 支援在這個函式中計算兩個日期、時間和時間戳記類型的差異。

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)]


注意:整個分隔符字串引數會用作單一分隔符。預設分隔符號為半形逗號。
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(運算式 AS 類型名稱),如果 BigQuery 無法執行轉換,就會傳回空值 (例如 SAFE_CAST("apple" AS INT64) 會傳回空值)。

運算子

以下各節列出 Snowflake 運算子及其 BigQuery 對應項目。

算術運算子

下表列出 Snowflake 算術運算子與 BigQuery 對應項目之間的對應關係。

Snowflake BigQuery

(Unary) (+'5')

CAST("5" AS NUMERIC)

a + b

a + b

(Unary) (-'5')

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


注意:BigQuery 支援標準一元減號,但不會將字串格式的整數轉換為 INT64NUMERICFLOAT64 類型。

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 需要使用括號分隔不同的集合運算。如果重複使用相同的集合運算子,則不需要括號。

DML 語法

本節說明 Snowflake 和 BigQuery 之間的資料管理語言語法差異。

INSERT 陳述式

Snowflake 提供可設定的 DEFAULT 關鍵字,可用於資料欄。在 BigQuery 中,可為空值的資料欄的 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 也支援使用子查詢插入值 (其中一個值是使用子查詢計算),而 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 SparkApache 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 關鍵字,後接條件。

DELETETRUNCATE TABLE 陳述式

DELETETRUNCATE TABLE 陳述式都能從資料表中移除資料列,且不會影響資料表結構定義或索引。

在 Snowflake 中,DELETETRUNCATE TABLE 都會使用 Snowflake 的 Time Travel 技術,在資料保留期間保留已刪除的資料,以利復原。不過,DELETE 不會刪除外部檔案的載入記錄和載入的結構描述。

在 BigQuery 中,DELETE 陳述式必須包含 WHERE 子句。如要進一步瞭解 BigQuery 中的 DELETE,請參閱 DML 說明文件中的 BigQueryDELETE 範例

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 作業合併成單一「upsert」陳述式,並自動執行這些作業。MERGE 作業必須與每個目標資料列的最多一個來源資料列相符。

BigQuery 資料表的 DML 陳述式每日上限為 1,000 個,因此建議您將 INSERT、UPDATE 和 DELETE 陳述式合併為單一 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,

...



注意:如果要更新所有資料欄,則必須列出所有資料欄。

GETLIST 陳述式

GET 陳述式會將資料檔案從下列任一 Snowflake 階段下載至用戶端電腦上的本機目錄/資料夾:

  • 命名的內部階段
  • 指定資料表的內部階段
  • 目前使用者的內部階段

LIST (LS) 陳述式會傳回在下列任一 Snowflake 階段中已排程 (即從本機檔案系統上傳或從資料表卸載) 的檔案清單:

  • 命名的內部階段
  • 命名的外部階段
  • 指定資料表的階段
  • 目前使用者的階段

BigQuery 不支援暫存概念,也沒有 GETLIST 的等效項目。

PUTREMOVE 陳述式

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 相似,但名稱可包含 1024 個字元。

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>'

BigQuery 不支援 DDL 中的排序。

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 資料移轉服務複製資料集。如要瞭解資料集複製作業的必要條件,請參閱這篇文章

BigQuery 也提供下列 bq mk 指令選項,這些選項在 Snowflake 中並沒有直接對應項目:

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

ALTER DATABASE 陳述式

本節將使用與 Snowflake 指令相對應的 BigQuery CLI 指令,說明 ALTER 陳述式的差異。

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 陳述式

本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 DROP 陳述式的差異。

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 陳述式

本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 SHOW 陳述式的差異。

Snowflake BigQuery

SHOW DATABASES


注意:Snowflake 提供單一選項,可列出並顯示所有資料庫的詳細資料,包括保留期間內已刪除的資料庫。
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 的值不得超過 10K。

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 不支援建立及管理結構定義的概念。

不過,您可以在將資料載入資料表,以及建立空白資料表時,指定資料表的結構定義。此外,您也可以針對支援的資料格式,使用結構定義自動偵測功能。

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 KEYFOREIGN KEY 資料表限制。如要達到這些限制在執行查詢時提供的類似最佳化效果,請將 BigQuery 資料表分區和分群。CLUSTER BY 最多支援四個資料欄。

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 陳述式

本節將使用與 Snowflake 指令相對應的 BigQuery CLI 指令,說明資料表 ALTER 陳述式的差異。

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 TABLEUNDROP TABLE 陳述式

本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 DROP 和 UNDROP 陳述式的差異。

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 可讓您建立永久性外部資料表,在查詢時,從指定外部階段的一或多個檔案組合中讀取資料。

本節將使用與 Snowflake 指令對應的 BigQuery CLI 指令,說明 CREATE EXTERNAL TABLE 陳述式的差異。

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 可讓您將含有待讀取資料的檔案設為待處理檔案,並指定外部資料表的格式類型選項。BigQuery 支援所有 Snowflake 格式類型 (除了 XML 格式),包括 CSV、JSON、AVRO、Parquet 和 ORC。

[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 也支援查詢外部分區資料,這些資料採用 AVRO、Parquet、ORC、JSON 和 CSV 格式,且以預設 Hive 分區配置儲存在 Google Cloud Storage 中。

CREATE VIEW 陳述式

下表列出 CREATE VIEW 陳述式在 Snowflake 和 BigQuery 之間的對應項目。

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 資料移轉服務、bq extract 等。本節將說明這些方法在資料載入和卸載時的差異。

帳戶和工作階段 DDL

BigQuery 不支援 Snowflake 的帳戶和工作階段概念。BigQuery 允許您透過 Cloud IAM 在所有層級管理帳戶。此外,BigQuery 尚不支援多陳述式交易。

使用者定義函式 (UDF)

使用者定義函式可讓您建立自訂作業的函式。這些函式會接受輸入資料欄、執行動作,並以值的形式傳回這些動作的結果

SnowflakeBigQuery 都支援使用 SQL 運算式和 JavaScript 程式碼的 UDF。

如需常見 BigQuery 自訂函式程式庫,請參閱 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 類型的陣列。

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


注意: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;


注意:空值輸入的程序行為會在 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 隔離層級。不過,如果兩個陳述式位於同一筆交易中,則一個陳述式可以看到另一個陳述式所做的變更,即使這些變更尚未提交也一樣。Snowflake 交易會在資源 (資料表) 遭到修改時取得鎖定。使用者可以調整已封鎖陳述式等待陳述式逾時前的等待時間上限。如果啟用 AUTOCOMMIT 參數,系統會自動提交 DML 陳述式。

BigQuery 也支援交易。BigQuery 可透過快照隔離功能,確保樂觀並行控制 (先提交者勝),在這種情況下,查詢會在開始查詢前讀取上次提交的資料。這種做法可確保在每個資料列、每個變異版本和相同 DML 陳述式中的各資料列上,維持相同程度的一致性,同時避免發生死結。如果針對同一個資料表執行多項 DML 更新作業,BigQuery 會切換為悲觀並行控制。載入工作可以完全獨立執行,並附加至資料表。不過,BigQuery 尚未提供明確的交易邊界或工作階段。

復原

如果 Snowflake 交易的工作階段在交易提交或回滾前意外終止,交易就會處於未連結狀態。使用者應執行 SYSTEM$ABORT_TRANSACTION 來中止已分離的交易,否則 Snowflake 會在閒置四小時後回復已分離的交易。如果發生死結,Snowflake 會偵測死結,並選取較新的陳述式來回溯。如果明確開啟的交易中的 DML 陳述式失敗,變更會復原,但交易會保持開啟狀態,直到修訂或復原為止。Snowflake 中的 DDL 陳述式會自動提交,因此無法回復。

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