標準 SQL 中的運算子

運算子由特殊字元或關鍵字表示;它們不使用函式呼叫語法。運算子可操作任何數目的資料輸入 (也稱為運算元) 並傳回結果。

常見慣例:

  • 除非另外指定,當其中一個運算元是 NULL 時,所有運算子都會傳回 NULL
  • 如果計算結果溢位,所有運算子都將擲回錯誤。
  • 對於所有浮點運算,如果其中一個運算元是 +/-infNaN,就只可能傳回 +/-infNaN。在其他情況下,會傳回錯誤。

下表從最高優先順序到最低優先順序 (也就是將在陳述式內接受評估的順序) 列出所有 BigQuery 運算子。

優先順序 運算子 輸入資料類型 名稱 運算子引數數目
1 . STRUCT
成員欄位存取運算子 二進位
  [ ] ARRAY 陣列位置。必須與 OFFSET 或 ORDINAL 搭配使用—請參閱 ARRAY 函式 二進位
2 - 所有數值類型 一元減 一元
  ~ 整數或 BYTES 位元 not 一元
3 * 所有數值類型 二進位
  / 所有數值類型 二進位
4 + 所有數值類型 二進位
  - 所有數值類型 二進位
5 << 整數或 BYTES 向左移位 二進位
  >> 整數或 BYTES 向右移位 二進位
6 & 整數或 BYTES 位元 and 二進位
7 ^ 整數或 BYTES 位元 xor 二進位
8 | 整數或 BYTES 位元 or 二進位
9 (比較運算子) = 任何可比較類型。完整清單請參閱資料類型 等與 二進位
  < 任何可比較類型。完整清單請參閱資料類型 小於 二進位
  > 任何可比較類型。完整清單請參閱資料類型 大於 二進位
  <= 任何可比較類型。完整清單請參閱資料類型 小於或等於 二進位
  > = 任何可比較類型。完整清單請參閱資料類型 大於或等於 二進位
  !=, <> 任何可比較類型。完整清單請參閱資料類型 不等於 二進位
  [NOT] LIKE STRING 與位元組 值與指定模式 [不] 相符 二進位
  [NOT] BETWEEN 任何可比較類型。清單請參閱「資料類型」。 值 [不] 在指定範圍之內 二進位
  [NOT] IN 任何可比較類型。清單請參閱資料類型。 值 [不] 在指定值組中 二進位
  IS [NOT] NULL 全部 值 [不是] NULL 一元
  IS [NOT] TRUE BOOL 值 [不是] TRUE。 一元
  IS [NOT] FALSE BOOL 值 [不是] FALSE。 一元
10 NOT BOOL 邏輯 NOT 一元
11 AND BOOL 邏輯 AND 二進位
12 OR BOOL 邏輯 OR 二進位

優先順序相同的運算子會保持關聯性。這表示這些運算子會從左開始向右分組在一起。例如,以下運算式:

x AND y AND z

會被解讀為

( ( x AND y ) AND z )

以下運算式:

x * y / z

會被解讀為:

( ( x * y ) / z )

所有比較運算子都具有相同的優先順序,但比較運算子不會相互關聯。為避免混淆,請務必使用括號。例如:

(x < y) IS FALSE

元素存取運算子

運算子 語法 輸入資料類型 結果資料類型 說明
. expression.fieldname1... STRUCT
類型 T 儲存在 fieldname1 中 點運算子。可用於存取巢狀欄位,例如 expression.fieldname1.fieldname2...
[ ] array_expression [position_keyword (int_expression ) ] 請參閱 ARRAY 函式。 類型 T 儲存在 ARRAY 中 position_keyword 為 OFFSET 或 ORDINAL。如需瞭解使用這個運算子的兩個函式,請參閱 ARRAY 函式

算術運算子

所有算數運算子都接受數字類型 T 的輸入,且除非在以下說明中另外指定,否則結果類型都是類型 T。

名稱 語法
X + Y
X - Y
X * Y
X / Y
一元減 - X

注意:除以零運算會傳回錯誤。若要傳回其他結果,請考慮 IEEE_DIVIDE 或 SAFE_DIVIDE 函式。

加與減的結果類型:

 INT64NUMERICFLOAT64
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

減的結果類型:

 INT64NUMERICFLOAT64
INT64INT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

除的結果類型:

 INT64NUMERICFLOAT64
INT64FLOAT64NUMERICFLOAT64
NUMERICNUMERICNUMERICFLOAT64
FLOAT64FLOAT64FLOAT64FLOAT64

一元減的結果類型:

輸入資料類型 結果資料類型
INT64 INT64
NUMERIC NUMERIC
FLOAT64 FLOAT64

位元運算子

所有位元運算子都會傳回與第一個運算元相同的類型與長度。

名稱 語法 輸入資料類型 說明
位元 not ~ X 整數或 BYTES 對每個位元執行邏輯非,形成位元之指定二進位值的補數。
位元 or X | Y X:整數或 BYTES
Y:類型與 X 相同
取用相等長度的兩個位元模式並對對應位元的每個配對執行邏輯包含 OR 運算。 如果 X 與 Y 是不同長度的 BYTES,這個運算子會擲回錯誤。
位元 xor X ^ Y X:整數或 BYTES
Y:類型與 X 相同
取用相等長度的兩個位元模式並對對應位元的每個配對執行邏輯排除 OR 運算。如果 X 與 Y 是不同長度的 BYTES,這個運算子會擲回錯誤。
位元 and X & Y X:整數或 BYTES
Y:類型與 X 相同
取用相等長度的兩個位元模式並對對應位元的每個配對執行邏輯 AND 運算。如果 X 與 Y 是不同長度的 BYTES,這個運算子會擲回錯誤。
向左移位 X << Y X:整數或 BYTES
Y:INT64
向左移位第一個運算元 X。如果第二個運算元 Y 大於或等於第一個運算元 X 的位元長度,這個運算子會傳回 0 或 b'\x00' 的位元組順序 (例如,如果 X 的類型是 INT64 就會傳回 64)。 如果 Y 是負數,這個運算子會擲回錯誤。
向右移位 X >> Y X:整數或 BYTES
Y:INT64
向右移位第一個運算元 X。這個運算子不會對帶正負號的類型執行正負號位元擴充 (也就是說,它會在空缺位元的左側填入 0)。如果第二個運算元 Y 大於或等於第一個運算元 X 的位元長度,這個運算子會傳回 0 或 b'\x00' 的位元組順序 (例如,如果 X 的類型是 INT64 就會傳回 64)。 如果 Y 是負數,這個運算子會擲回錯誤。

邏輯運算子

所有邏輯運算子都只允許 BOOL 輸入。

名稱 語法 說明
邏輯 NOT NOT X 如果輸入為 TRUE 就傳回 FALSE。如果輸入為 FALSE 就傳回 TRUE。其他情況下傳回 NULL
邏輯 AND X AND Y 如果至少一個輸入為 FALSE 就傳回 FALSE。如果 X 與 Y 都是 TRUE 就傳回 TRUE。其他情況下傳回 NULL
邏輯 OR X OR Y 如果 X 與 Y 都是 FALSE 就傳回 FALSE。如果至少一個輸入為 TRUE 就傳回 TRUE。其他情況下傳回 NULL

比較運算子

比較一律傳回 BOOL。比較通常需要兩個類型相同的運算元。如果運算元屬於不同類型,且 BigQuery 可以將那些類型的值轉換成一般類型而不會減損精確度,BigQuery 通常會將它們強制轉換成比較常用的類型;BigQuery 通常會將常值強制轉成非常值類型 (如果有的話)。請參閱資料類型,瞭解可比較的資料類型定義。

STRUCT 只支援 4 個比較運算子:等於 (=)、不等於 (!= 與 <>) 及 IN。

以下規則只在比較這些資料類型時適用:

  • FLOAT64:所有帶有 NaN 的比較均會傳回 FALSE,但 !=<> 除外,因為會傳回 TRUE。
  • BOOL:FALSE 小於 TRUE。
  • STRING:字串會逐一碼點進行比較,這表示如果正式相等的字串已先進行正規化,它們只保證會比較為相等。
  • NULL:以下是適用的慣例:帶有 NULL 輸入的任何運算都會傳回 NULL
名稱 語法 說明
小於 X < Y 如果 X 小於 Y 就傳回 TRUE。
小於或等於 X <= Y 如果 X 小於或等於 Y 就傳回 TRUE。
大於 X > Y 如果 X 大於 Y 就傳回 TRUE。
大於或等於 X >= Y 如果 X 大於或等於 Y 就傳回 TRUE。
等於 X = Y 如果 X 等於 Y 就傳回 TRUE。
不等於 X != Y
X <> Y
如果 X 不等於 Y 就傳回 TRUE。
介於 X [NOT] BETWEEN Y AND Z 如果 X [不] 在指定範圍之內就傳回 TRUE。「X BETWEEN Y AND Z」的結果相當於「Y <= X AND X <= Z」但  X 只在前者中評估一次。
LIKE X [NOT] LIKE Y 檢查第一個運算元 X 中的 STRING 是否與第二個運算元 Y 指定的模式相符。運算式可以包含這些字元:
  • 百分比符號「%」會比對任何數目的字元或位元組
  • 底線「_」會比對單一字元或位元組
  • 您可以使用兩條反斜線逸出「\」、「_」或「%」。例如, "\\%"。如果您使用原始字串,就只需要一條反斜線。例如,r"\%".
IN 多個語法 - 請見以下說明 如果右運算元為空白,就傳回 FALSE。如果左運算元為 NULL 就傳回 NULL。如果右運算元包含 NULL,就傳回 TRUE 或 NULL,永遠不傳回 FALSE。IN 任一側的引數是一般運算式。任何一個運算元都不需要是常值,但最常見的情況是在右側使用常值。X 只評估一次。

測試資料類型為 STRUCT 之值的相等性時,可能一或多個欄位為 NULL。在此類情況下:

  • 如果非 NULL 欄位值相等,比較會傳回 NULL。
  • 如果任何非 NULL 欄位值不相等,比較會傳回 false。

下表示範當 STRUCT 資料類型的欄位具有 NULL 值時如何比較這些資料類型。

Struct1 Struct2 Struct1 = Struct2
STRUCT(1, NULL) STRUCT(1, NULL) NULL
STRUCT(1, NULL) STRUCT(2, NULL) FALSE
STRUCT(1,2) STRUCT(1, NULL) NULL

IN 運算子

IN 運算子支援下列語法:

x [NOT] IN (y, z, ... ) # Requires at least one element
x [NOT] IN (<subquery>)
x [NOT] IN UNNEST(<array expression>) # analysis error if the expression
                                      # does not return an ARRAY type.

IN 運算子任一側的引數為一般運算式。經常會在右側運算式使用常值;但是,這並非必要。

下列項目的語意:

x IN (y, z, ...)

定義為等於:

(x = y) OR (x = z) OR ...

子查詢與陣列表單的定義方式類似。

x NOT IN ...

等於:

NOT(x IN ...)

UNNEST 表單會像 FROM 子句中的 UNNEST 一樣處理陣列掃描:

x [NOT] IN UNNEST(<array expression>)

這個表單通常與 ARRAY 參數搭配使用。例如:

x IN UNNEST(@array_parameter)

注意事項:NULL ARRAY 的處理方式與空白 ARRAY 相同。

有關如何使用這個語法的詳細資訊,請參閱陣列主題。

使用 IN 運算子時,適用下列語意:

  • IN 帶有右側空白運算式一律為 FALSE
  • IN 帶有左側 NULL 運算式與右側非空白運算式一律為 NULL
  • ININ 清單中帶有 NULL 只能傳回 TRUE 或 NULL,永遠不會傳回 FALSE
  • NULL IN (NULL) 會傳回 NULL
  • IN UNNEST(<NULL array>) 會傳回 FALSE (非 NULL)
  • IN 清單中帶有 NULLNOT IN 只能傳回 FALSE 或 NULL,永遠不會傳回 TRUE

使用結構建構函式語法,IN 可與多部分金鑰搭配使用。例如:

(Key1, Key2) IN ( (12,34), (56,78) )
(Key1, Key2) IN ( SELECT (table.a, table.b) FROM table )

如需這個語法的詳細資訊,請參閱「資料類型」主題的結構類型一節。

IS 運算子

IS 運算子會針對它們測試的情況傳回 TRUE 或 FALSE。與數學函式中定義的 IS_INF 和 IS_NAN 函式不同,即使是 NULL 輸入,IS 運算子也絕不會傳回 NULL。若「不」存在,會反轉輸出 BOOL 值。

函式語法 輸入資料類型 結果資料類型 說明

X IS [NOT] NULL
不限值類型 BOOL 如果運算元 X 評估為 NULL,就會傳回 TRUE,否則會傳回 FALSE。

X IS [NOT] TRUE
BOOL BOOL 如果 BOOL 運算元評估為 TRUE,就會傳回 TRUE。否則會傳回 FALSE。

X IS [NOT] FALSE
BOOL BOOL 如果 BOOL 運算元評估為 FALSE,就會傳回 TRUE,否則會傳回 FALSE。
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
需要協助嗎?請前往我們的支援網頁