Beam ZetaSQL 運算子
運算子由特殊字元或關鍵字表示;它們不使用函數呼叫語法。運算子會操作任意數量的資料輸入(也稱為運算元),並傳回結果。
通用慣例
- 除非另有說明,否則當其中一個運算元為
NULL
時,所有運算子都會傳回NULL
。
下表列出所有支援的運算子,從最高優先權到最低優先權。優先權決定運算子在陳述式中求值的順序。
優先權順序 | 運算子 | 輸入資料類型 | 名稱 | 運算子元數 |
---|---|---|---|---|
1 | . | STRUCT | 成員欄位存取運算子 | 二元 |
[ ] | ARRAY | 陣列位置。必須與 OFFSET 或 ORDINAL 搭配使用&mdash。 | 二元 | |
2 | - | 所有數值類型 | 一元負號 | 一元 |
3 | * | 所有數值類型 | 乘法 | 二元 |
/ | 所有數值類型 | 除法 | 二元 | |
4 | + | 所有數值類型 | 加法 | 二元 |
- | 所有數值類型 | 減法 | 二元 | |
5 (比較運算子) | = | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 等於 | 二元 |
< | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 小於 | 二元 | |
> | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 大於 | 二元 | |
<= | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 小於或等於 | 二元 | |
>= | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 大於或等於 | 二元 | |
!=, <> | 任何可比較的類型。如需完整清單,請參閱資料類型。 | 不等於 | 二元 | |
[NOT] LIKE | 字串和位元組 | 值是否 [不] 符合指定的模式 | 二元 | |
[NOT] BETWEEN | 任何可比較的類型。如需清單,請參閱資料類型。 | 值是否 [不] 在指定的範圍內 | 二元 | |
[NOT] IN | 任何可比較的類型。如需清單,請參閱資料類型。 | 值是否 [不] 在指定的值集合中 | 二元 | |
IS [NOT] NULL | 全部 | 值是否 [不] 為 NULL | 一元 | |
IS [NOT] TRUE | BOOL | 值是否 [不] 為 TRUE。 | 一元 | |
IS [NOT] FALSE | BOOL | 值是否 [不] 為 FALSE。 | 一元 | |
6 | NOT | BOOL | 邏輯 NOT | 一元 |
7 | AND | BOOL | 邏輯 AND | 二元 |
8 | OR | BOOL | 邏輯 OR | 二元 |
具有相同優先權的運算子為左關聯。這表示這些運算子會從左邊開始,然後向右移動來分組。例如,運算式
x AND y AND z
會解讀為
( ( x AND y ) AND z )
運算式
x * y / z
會解讀為
( ( x * y ) / z )
所有比較運算子都具有相同的優先權,並使用左關聯性進行分組。但是,比較運算子不是關聯的。因此,建議您使用括號來提高可讀性,並確保運算式以所需的方式解析。例如
(x < y) IS FALSE
建議使用,而不是
x < y IS FALSE
元素存取運算子
運算子 | 語法 | 輸入資料類型 | 結果資料類型 | 描述 |
---|---|---|---|---|
. | expression.fieldname1... | STRUCT | 儲存在 fieldname1 中的類型 T | 點運算子。可用於存取巢狀欄位,例如 expression.fieldname1.fieldname2... |
[ ] | array_expression [position_keyword (int_expression ) ] | 請參閱 ARRAY 函數。 | 儲存在 ARRAY 中的類型 T | position_keyword 為 OFFSET 或 ORDINAL。 |
算術運算子
所有算術運算子都接受數值類型 T 的輸入,結果類型為 T,除非以下描述中另有說明
名稱 | 語法 |
---|---|
加法 | X + Y |
減法 | X - Y |
乘法 | X * Y |
除法 | X / Y |
一元負號 | - X |
加法和乘法的結果類型
INT64 | FLOAT64 | |
---|---|---|
INT64 | INT64 | FLOAT64 |
FLOAT64 | FLOAT64 | FLOAT64 |
減法的結果類型
INT64 | FLOAT64 | |
---|---|---|
INT64 | INT64 | FLOAT64 |
FLOAT64 | FLOAT64 | FLOAT64 |
除法的結果類型
INT64 | FLOAT64 | |
---|---|---|
INT64 | FLOAT64 | FLOAT64 |
FLOAT64 | FLOAT64 | FLOAT64 |
一元負號的結果類型
輸入資料類型 | 結果資料類型 |
---|---|
INT64 | INT64 |
FLOAT64 | FLOAT64 |
邏輯運算子
所有邏輯運算子都只允許 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。比較通常要求兩個運算元都具有相同的類型。如果運算元屬於不同的類型,並且 Cloud Dataflow SQL 可以在不遺失精確度的情況下將這些類型的值轉換為通用類型,則 Cloud Dataflow SQL 通常會將它們強制轉換為該通用類型以進行比較;Cloud Dataflow SQL 通常會將常值強制轉換為非常值的類型(如果存在)。可比較資料類型定義於資料類型。
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。 |
BETWEEN | 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 指定的模式。運算式可以包含這些字元
|
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 |
IS 運算子
IS 運算子會針對它們正在測試的條件回傳 TRUE 或 FALSE。它們永遠不會回傳 NULL
,即使輸入為 NULL
也一樣。如果存在 NOT,則輸出的 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。 |