Beam ZetaSQL 转换规则
转换包括但不限于强制转换和强制。
- 强制转换是显式转换,使用
CAST()
函数。 - 强制是隐式转换,Beam SQL 在下面描述的条件下自动执行。
下表总结了所有可能的 CAST
和强制。 “强制到”适用于给定数据类型的所有表达式(例如,列)。
源类型 | CAST 到 | 强制到 |
---|---|---|
INT64 | INT64 FLOAT64 STRING | FLOAT64 |
FLOAT64 | FLOAT64 | |
BOOL | BOOL | |
STRING | INT64 STRING BYTES TIMESTAMP | |
BYTES | BYTES STRING | |
TIMESTAMP | STRING TIMESTAMP | |
ARRAY | ARRAY | |
STRUCT | STRUCT |
强制转换
语法
CAST(expr AS typename)
CAST 语法用于查询中,以指示表达式的结果类型应转换为其他类型。
示例
CAST(x=1 AS STRING)
如果 x
为 1
,则结果为 "true"
,如果 x
为其他非 NULL
值,则结果为 "false"
,如果 x
为 NULL
,则结果为 NULL
。
在支持的类型之间进行强制转换,如果原始值无法成功映射到目标域,则会导致运行时错误。例如,将 BYTES 强制转换为 STRING 时,如果字节序列不是有效的 UTF-8,则会导致运行时错误。
当将表达式 x
的以下类型强制转换时,将应用以下规则
源 | 目标 | 强制转换 x 时的规则 |
---|---|---|
INT64 | FLOAT64 | 返回一个接近但可能不精确的 FLOAT64 值。 |
FLOAT64 | STRING | 返回一个近似的字符串表示形式。 |
STRING | BYTES | 使用 UTF-8 编码将 STRING 强制转换为 BYTES。例如,当将 STRING "©" 强制转换为 BYTES 时,它将变为一个包含十六进制值 C2 和 A9 的 2 字节序列。 |
BYTES | STRING | 返回 x 作为 UTF-8 STRING 的解释。例如,当将 BYTES 字面量 b'\xc2\xa9' 强制转换为 STRING 时,它将解释为 UTF-8 并变为 Unicode 字符 "©"。如果 x 不是有效的 UTF-8,则会发生错误。 |
ARRAY | ARRAY | 必须是完全相同的 ARRAY 类型。 |
STRUCT | STRUCT | 如果满足以下条件,则允许
|
强制
如果需要匹配函数签名,Beam SQL 会将表达式的结果类型强制转换为另一种类型。例如,如果函数 func() 定义为接受一个 INT64 类型的参数,而表达式用作参数,该表达式具有 FLOAT64 的结果类型,那么在计算 func() 之前,表达式的结果将被强制转换为 INT64 类型。