Beam ZetaSQL 转换规则

转换包括但不限于强制转换和强制。

下表总结了所有可能的 CAST 和强制。 “强制到”适用于给定数据类型的所有表达式(例如,列)。

源类型CAST 到强制到
INT64INT64
FLOAT64
STRING
FLOAT64
FLOAT64FLOAT64
 
BOOLBOOL
 
STRINGINT64
STRING
BYTES
TIMESTAMP
 
BYTESBYTES
STRING
 
TIMESTAMPSTRING
TIMESTAMP
 
ARRAYARRAY 
STRUCTSTRUCT 

强制转换

语法

CAST(expr AS typename)

CAST 语法用于查询中,以指示表达式的结果类型应转换为其他类型。

示例

CAST(x=1 AS STRING)

如果 x1,则结果为 "true",如果 x 为其他非 NULL 值,则结果为 "false",如果 xNULL,则结果为 NULL

在支持的类型之间进行强制转换,如果原始值无法成功映射到目标域,则会导致运行时错误。例如,将 BYTES 强制转换为 STRING 时,如果字节序列不是有效的 UTF-8,则会导致运行时错误。

当将表达式 x 的以下类型强制转换时,将应用以下规则

目标强制转换 x 时的规则
INT64FLOAT64返回一个接近但可能不精确的 FLOAT64 值。
FLOAT64STRING返回一个近似的字符串表示形式。
STRINGBYTES使用 UTF-8 编码将 STRING 强制转换为 BYTES。例如,当将 STRING "©" 强制转换为 BYTES 时,它将变为一个包含十六进制值 C2 和 A9 的 2 字节序列。
BYTESSTRING返回 x 作为 UTF-8 STRING 的解释。
例如,当将 BYTES 字面量 b'\xc2\xa9' 强制转换为 STRING 时,它将解释为 UTF-8 并变为 Unicode 字符 "©"。
如果 x 不是有效的 UTF-8,则会发生错误。
ARRAYARRAY必须是完全相同的 ARRAY 类型。
STRUCTSTRUCT如果满足以下条件,则允许
  1. 两个 STRUCT 具有相同数量的字段。
  2. 原始 STRUCT 字段类型可以显式强制转换为相应的目标 STRUCT 字段类型(由字段顺序定义,而不是字段名称)。

强制

如果需要匹配函数签名,Beam SQL 会将表达式的结果类型强制转换为另一种类型。例如,如果函数 func() 定义为接受一个 INT64 类型的参数,而表达式用作参数,该表达式具有 FLOAT64 的结果类型,那么在计算 func() 之前,表达式的结果将被强制转换为 INT64 类型。