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 类型。

