Beam ZetaSQL 运算符

运算符由特殊字符或关键字表示;它们不使用函数调用语法。运算符操作任何数量的数据输入(也称为操作数),并返回结果。

常见约定

下表列出了所有支持的运算符,从最高优先级到最低优先级。优先级决定了运算符在语句中求值的顺序。

优先级顺序运算符输入数据类型名称运算符元数
1.STRUCT
成员字段访问运算符二元
 [ ]ARRAY数组位置。必须与 OFFSET 或 ORDINAL 配合使用—二元
2-所有数字类型一元减号一元
3*所有数字类型乘法二元
 /所有数字类型除法二元
4+所有数字类型加法二元
 -所有数字类型减法二元
5(比较运算符)=任何可比较类型。有关完整列表,请参见 数据类型等于二元
 <任何可比较类型。有关完整列表,请参见 数据类型小于二元
 >任何可比较类型。有关完整列表,请参见 数据类型大于二元
 <=任何可比较类型。有关完整列表,请参见 数据类型小于或等于二元
 >=任何可比较类型。有关完整列表,请参见 数据类型大于或等于二元
 !=, <>任何可比较类型。有关完整列表,请参见 数据类型不等于二元
 [NOT] LIKESTRING 和字节值[不]匹配指定的模式二元
 [NOT] BETWEEN任何可比较类型。请参阅数据类型以获取列表。值[不]在指定范围内二元
 [NOT] IN任何可比较类型。请参阅数据类型以获取列表。值[不]在指定的值集中二元
 IS [NOT] NULL全部值[不]为NULL一元
 IS [NOT] TRUEBOOL值为[不]为 TRUE。一元
 IS [NOT] FALSEBOOL值为[不]为 FALSE。一元
6NOTBOOL逻辑非一元
7ANDBOOL逻辑与二元
8ORBOOL逻辑或二元

具有相同优先级的运算符是左结合的。这意味着这些运算符从左到右分组在一起。例如,表达式

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 中的类型 Tposition_keyword 既可以是 OFFSET,也可以是 ORDINAL。

算术运算符

所有算术运算符都接受数字类型 T 的输入,结果类型为 T,除非在下面的描述中另有说明

名称语法
加法X + Y
减法X - Y
乘法X * Y
除法X / Y
一元减号- X

加法和乘法的结果类型

 INT64FLOAT64
INT64INT64FLOAT64
FLOAT64FLOAT64FLOAT64

减法的结果类型

 INT64FLOAT64
INT64INT64FLOAT64
FLOAT64FLOAT64FLOAT64

除法的结果类型

 INT64FLOAT64
INT64FLOAT64FLOAT64
FLOAT64FLOAT64FLOAT64

一元减号的结果类型

输入数据类型结果数据类型
INT64INT64
FLOAT64FLOAT64

逻辑运算符

所有逻辑运算符只允许 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。

比较这些数据类型时,适用以下规则

名称语法描述
小于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。
BETWEENX [NOT] BETWEEN Y AND Z如果 X [不]在指定范围内,则返回 TRUE。 "X BETWEEN Y AND Z" 的结果等效于 "Y <= X AND X <= Z",但在前者中,X 只计算一次。
LIKEX [NOT] LIKE Y检查第一个操作数 X 中的 STRING 是否与第二个操作数 Y 指定的模式匹配。表达式可以包含以下字符
  • 百分号 "%" 匹配任意数量的字符或字节
  • 下划线 "_" 匹配单个字符或字节
  • 可以使用两个反斜杠转义 "\", "_", 或 "%"。例如,"\\%"。如果您使用的是原始字符串,则只需要一个反斜杠。例如,r"\%"
IN多个 - 见下文如果右操作数为空,则返回 FALSE。如果左操作数为 NULL,则返回 NULL。如果右操作数包含 NULL,则返回 TRUE 或 NULL,永远不会返回 FALSE。两侧的 IN 参数都是一般表达式。两个操作数都不需要是文字,尽管在右侧使用文字是最常见的。X 只计算一次。

当测试具有 STRUCT 数据类型的值的相等性时,一个或多个字段可能为 NULL。在这种情况下

下表演示了当 STRUCT 数据类型具有值为 NULL 的字段时如何进行比较。

Struct1Struct2Struct1 = 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
BOOLBOOL如果 BOOL 操作数评估为 TRUE,则返回 TRUE。否则返回 FALSE。
X IS [NOT] FALSE
BOOLBOOL如果 BOOL 操作数评估为 FALSE,则返回 TRUE。否则返回 FALSE。