Beam ZetaSQL 运算符
运算符由特殊字符或关键字表示;它们不使用函数调用语法。运算符操作任何数量的数据输入(也称为操作数),并返回结果。
常见约定
- 除非另有说明,否则所有运算符在其中一个操作数为 NULL 时返回 NULL。
下表列出了所有支持的运算符,从最高优先级到最低优先级。优先级决定了运算符在语句中求值的顺序。
| 优先级顺序 | 运算符 | 输入数据类型 | 名称 | 运算符元数 |
|---|---|---|---|---|
| 1 | . | STRUCT | 成员字段访问运算符 | 二元 |
| [ ] | ARRAY | 数组位置。必须与 OFFSET 或 ORDINAL 配合使用— | 二元 | |
| 2 | - | 所有数字类型 | 一元减号 | 一元 |
| 3 | * | 所有数字类型 | 乘法 | 二元 |
| / | 所有数字类型 | 除法 | 二元 | |
| 4 | + | 所有数字类型 | 加法 | 二元 |
| - | 所有数字类型 | 减法 | 二元 | |
| 5(比较运算符) | = | 任何可比较类型。有关完整列表,请参见 数据类型。 | 等于 | 二元 |
| < | 任何可比较类型。有关完整列表,请参见 数据类型。 | 小于 | 二元 | |
| > | 任何可比较类型。有关完整列表,请参见 数据类型。 | 大于 | 二元 | |
| <= | 任何可比较类型。有关完整列表,请参见 数据类型。 | 小于或等于 | 二元 | |
| >= | 任何可比较类型。有关完整列表,请参见 数据类型。 | 大于或等于 | 二元 | |
| !=, <> | 任何可比较类型。有关完整列表,请参见 数据类型。 | 不等于 | 二元 | |
| [NOT] LIKE | STRING 和字节 | 值[不]匹配指定的模式 | 二元 | |
| [NOT] BETWEEN | 任何可比较类型。请参阅数据类型以获取列表。 | 值[不]在指定范围内 | 二元 | |
| [NOT] IN | 任何可比较类型。请参阅数据类型以获取列表。 | 值[不]在指定的值集中 | 二元 | |
IS [NOT] NULL | 全部 | 值[不]为NULL | 一元 | |
| IS [NOT] TRUE | BOOL | 值为[不]为 TRUE。 | 一元 | |
| IS [NOT] FALSE | BOOL | 值为[不]为 FALSE。 | 一元 | |
| 6 | NOT | BOOL | 逻辑非 | 一元 |
| 7 | AND | BOOL | 逻辑与 | 二元 |
| 8 | OR | BOOL | 逻辑或 | 二元 |
具有相同优先级的运算符是左结合的。这意味着这些运算符从左到右分组在一起。例如,表达式
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 X | 如果输入为 TRUE,则返回 FALSE。如果输入为 FALSE,则返回 TRUE。否则返回 NULL。 |
| 逻辑与 | X AND Y | 如果至少一个输入为 FALSE,则返回 FALSE。如果 X 和 Y 都为 TRUE,则返回 TRUE。否则返回 NULL。 |
| 逻辑或 | 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。 |

