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)

REWRITE_ZERO_SCALE_NUMERIC_AS_INTEGER 設定選項可用於將 INTEGER 和相關類型轉換為 INT64
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 沒有直接替代 Snowflake 的 BEFORE,可使用陳述式 ID。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 也支援其他資料表參照

  • 使用 FOR SYSTEM_TIME AS OF 存取資料表定義和資料列的歷史版本
  • 欄位路徑,或解析為某資料類型內之欄位的任一路徑 (即 STRUCT)
  • 整併陣列

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)


注意:每個 Cube 最多可有 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 值應為第一個或最後一個。

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 不支援搭配視窗函式的 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 變異數的另一種方法,是保留一個雜湊函式的
個最小值。
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… 。使用者無法在單一 HLL_COUNT... 函式中加入多個運算式。

HLL_ACCUMULATE([DISTINCT] expression)


注意:Snowflake 不允許您指定精確度。
HLL_COUNT.INIT(expression [, precision])

HLL_COMBINE([DISTINCT] state)

HLL_COUNT.MERGE_PARTIAL(草稿)

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 變異數的另一種方法,是保留一個雜湊函式的 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[()]


注意:為符合 ANSI 標準,Snowflake 不會在 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 允許選用小數秒精確度。有效值範圍為 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[()]


注意:為符合 ANSI 標準,Snowflake 不會在 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()


注意:為符合 ANSI 標準,Snowflake 不會在 LOCALTIME 指令後強制加上「()」。

CURRENT_TIME()

LOCALTIMESTAMP()

CURRENT_DATETIME([timezone]) CURRENT_TIMESTAMP()


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

轉換函式

下表列出常見的 Snowflake 轉換函式及其對應的 BigQuery 函式。

請注意,Snowflake 和 BigQuery 中看似相同的函式可能會傳回不同的資料類型。

雪花 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]]


注意:如要瞭解 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 函式。

雪花 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 的日期和時間函式包括日期函式日期時間函式時間函式時間戳記函式

雪花 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 支援 week(<weekday>)、microsecond 和 millisecond 部分類型。但 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 支援 week(<weekday>)、ISO week 和 ISO year 部分類型。但 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 支援 week(<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 支援 week(<weekday>)、microsecond 和 millisecond 部分類型。但 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 支援 week(<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 支援 week(<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 支援 week(<weekday>)、ISO week 和 ISO year 部分類型。但 Snowflake 不會。

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

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

BigQuery 也提供下列日期和時間函式,這些函式在 Snowflake 中沒有直接對應的函式:

資訊結構定義和資料表函式

從概念上來說,BigQuery 不支援 Snowflake 的許多資訊結構定義和資料表函式。Snowflake 提供下列資訊結構定義和資料表函式,BigQuery 沒有直接對應的項目:

以下列出相關的 BigQuery 和 Snowflake 資訊結構定義與資料表函式。

雪花 BigQuery
QUERY_HISTORY

QUERY_HISTORY_BY_*
INFORMATION_SCHEMA.JOBS_BY_*

注意:並非直接替代方案。
TASK_HISTORY INFORMATION_SCHEMA.JOBS_BY_*

注意:並非直接替代方案。

BigQuery 提供下列資訊結構定義和資料表函式,這些函式在 Snowflake 中沒有直接對應的項目:

數值函式

下表列出常見的 Snowflake 數值函式與對應的 BigQuery 函式。

雪花 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 中沒有直接對應的函式:

半結構化資料函式

雪花 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 自訂使用者定義函式

字串和二進位函式

雪花 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

字串函式 (規則運算式)

雪花 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

系統功能

雪花 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 自訂使用者定義函式

資料表函式

雪花 BigQuery
GENERATOR 自訂使用者定義函式
GET_OBJECT_REFERENCES 自訂使用者定義函式
RESULT_SCAN 自訂使用者定義函式
VALIDATE 自訂使用者定義函式

公用和雜湊函式

雪花 BigQuery
GET_DDL 功能要求
HASH HASH 是 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 無法執行轉換 (例如 SAFE_CAST("apple" AS INT64) 會傳回 NULL),則會傳回 NULL。

運算子

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

算術運算子

下表顯示 Snowflake 算術運算子與對應的 BigQuery 運算子。

雪花 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 set 運算子與對應的 BigQuery 運算子。

雪花 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 運算子的對應關係。

雪花 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 相容。下表列出例外狀況。

雪花 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 相容。下表列出例外狀況。

雪花 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 說明文件中的 BigQuery DELETE 範例

雪花 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 資料表每天最多只能執行 1,000 個 DML 陳述式,因此您應盡可能將 INSERT、UPDATE 和 DELETE 陳述式合併為單一 MERGE 陳述式,如下表所示:

雪花 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 指令,解決兩者之間的差異。

雪花 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 陳述式中的差異。

雪花 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 陳述式中的差異。

雪花 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 陳述式中的差異。

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

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

管理 SHARE

Snowflake 提供多個共用管理 指令,與資料庫和結構定義管理指令類似。BigQuery 不支援建立及管理共用內容的概念。

資料表、檢視區塊和序列 DDL

CREATE TABLE 陳述式

大多數 Snowflake CREATE TABLE 陳述式都與 BigQuery 相容,但下列語法元素除外,因為 BigQuery 不會使用這些元素:

雪花 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

)


where table_constraints are:

[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 設定指定為「在建立快照及從快照還原時節省處理時間,並減少儲存空間」。
BigQuery 會自動保留所有資料表最多 7 天的歷史版本,且不會影響處理時間或計費儲存空間,因此不需要也不會使用 BACKUP NO 資料表選項。

CREATE TABLE table_name

(

col1 data_type1

)

table_attributes


where table_attributes are:

[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 陳述式的差異。

雪花 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 陳述式之間的差異。

雪花 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 陳述式中的差異。

雪花 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 格式類型 (CSV、JSON、AVRO、PARQUET、ORC),但 XML 類型除外。

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

下表列出 Snowflake 和 BigQuery 中 CREATE VIEW 陳述式的對等項目。

雪花 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)

您可以透過 UDF 建立自訂作業的函式。這些函式會接受輸入資料欄並執行各項動作,再以資料值的形式傳回這些動作的結果。

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

如需常見 BigQuery UDF 的程式庫,請參閱 GoogleCloudPlatform/bigquery-utils/ GitHub 存放區。

CREATE FUNCTION 語法

下表說明 Snowflake 和 BigQuery 之間 SQL UDF 建立語法的差異。

雪花 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


注意: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 語法的差異。

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

雪花 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 的資料庫限制。

限制 雪花 BigQuery
查詢文字大小 1 MB 1 MB
並行查詢數量上限 XS Warehouse - 8
S Warehouse - 16
M Warehouse - 32
L Warehouse - 64
XL Warehouse - 128
100