转换规则

转换包括但不限于类型转换、强制转换和超类型。

  • 类型转换属于显式转换,使用 CAST() 函数。
  • 强制转换属于隐式转换,BigQuery 在下述条件下会自动执行此转换。
  • 超类型是一种可被两个或更多表达式强制转换的常见类型。

此外还存在一些其他转换,它们有自己的函数名称,例如 PARSE_DATE()。如需详细了解这些函数,请参阅转换函数

类型转换和强制转换的对比

下表汇总了 BigQuery 数据类型所有可能的类型转换和强制转换。“强制转换为”列适用于指定数据类型(例如列类型)的所有表达式,也支持对字面量和参数进行强制转换。如需了解详情,请参阅字面量强制转换参数强制转换

原类型 类型转换目标类型 强制转换目标类型
INT64 BOOL
INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
NUMERIC
BIGNUMERIC
FLOAT64
NUMERIC INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
BIGNUMERIC
FLOAT64
BIGNUMERIC INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
FLOAT64
FLOAT64 INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
 
BOOL BOOL
INT64
STRING
 
STRING BOOL
INT64
NUMERIC
BIGNUMERIC
FLOAT64
STRING
BYTES
DATE
DATETIME
TIME
TIMESTAMP
 
BYTES STRING
BYTES
 
DATE STRING
DATE
DATETIME
TIMESTAMP
DATETIME
DATETIME STRING
DATE
DATETIME
TIME
TIMESTAMP
 
TIME STRING
TIME
 
TIMESTAMP STRING
DATE
DATETIME
TIME
TIMESTAMP
 
ARRAY ARRAY  
STRUCT STRUCT  

类型转换

大多数数据类型可以通过 CAST 函数从一种类型转换为另一种类型。在使用 CAST 时,如果 BigQuery 无法执行类型转换,查询就会失败。如果您想使自己的查询避免这些类型的错误,则可以使用 SAFE_CAST。如需详细了解 CASTSAFE_CAST 和其他类型转换函数的规则,请参阅转换函数

强制转换

如果需要匹配函数签名,BigQuery 会将参数表达式的结果类型转换成其他类型。例如,如果函数 func() 定义为采用 FLOAT64 类型的单个参数,并使用表达式作为结果类型为 INT64 的参数,则表达式的结果将强制转换为 FLOAT64 类型,然后再计算 func()

字面量强制转换

BigQuery 支持以下字面量强制转换:

输入数据类型 结果数据类型 备注
STRING 字面量 DATE
DATETIME
TIME
TIMESTAMP

在实际字面量类型不同于相关函数预期的类型时,就需要字面量强制转换。例如,如果函数 func() 接受一个 DATE 参数,则表达式 func("2014-09-27") 有效,因为字符串字面量 "2014-09-27" 强制转换为 DATE

字面量转换会在分析时进行评估,如果输入字面量无法成功转换为目标类型,则引发错误。

参数强制转换

BigQuery 支持以下参数强制转换:

输入数据类型 结果数据类型
STRING 参数 DATE
DATETIME
TIME
TIMESTAMP

如果参数值无法成功强制转换为目标类型,则引发错误。

超类型

超类型是一种可被两个或更多表达式强制转换的常见类型。 超类型用于设置运算(如 UNION ALL)和表达式(如 CASE),它们需要多个带匹配类型的参数。每种类型都有一个或多个超类型,包括其本身,后者定义了其超类型集。

输入类型 超类型
BOOL BOOL
INT64 INT64
FLOAT64
NUMERIC
BIGNUMERIC
FLOAT64 FLOAT64
NUMERIC NUMERIC
BIGNUMERIC
FLOAT64
DECIMAL DECIMAL
BIGDECIMAL
FLOAT64
BIGNUMERIC BIGNUMERIC
FLOAT64
BIGDECIMAL BIGDECIMAL
FLOAT64
STRING STRING
DATE DATE
TIME TIME
DATETIME DATETIME
TIMESTAMP TIMESTAMP
BYTES BYTES
STRUCT 具有相同的字段位置类型的 STRUCT。
ARRAY 具有同一元素类型的 ARRAY。
GEOGRAPHY GEOGRAPHY

如果要查找一组输入类型的超类型,请先确定每个输入类型类型的超类型集的交集。如果该集为空,则输入类型没有共同的超类型。如果该集非空,则常见的超类型通常是该数据集中的最具体类型。通常,最特定的类型是具有最大限制域的类型。

示例

输入类型 常见超类型 返回值 备注
INT64
FLOAT64
FLOAT64 FLOAT64 如果对 INT64 和 FLOAT64 应用超类型,则超类型成功,因为它们共享超类型、FLOAT64。
INT64
BOOL
错误 如果对 INT64 和 BOOL 应用超类型,则超类型将失败,因为它们不共享公共超类型。

完全匹配和不完全匹配类型

数字类型可以完全匹配,也可以不完全匹配。对于超类型,如果所有输入类型均为完全匹配类型,则生成的超类型只能是完全匹配类型。

下表包含完全匹配和不完全匹配的数字数据类型的列表。

完全匹配类型 不完全匹配类型
INT64
NUMERIC
BIGNUMERIC
FLOAT64

示例

输入类型 常见超类型 返回值 备注
INT64
FLOAT64
FLOAT64 FLOAT64 如果超类型应用于 INT64 和 DOUBLE,则超类型会成功,因为有完全匹配和不完全匹配的数字类型被超类型。

类型特异性

每种类型都有一个其支持的值域。较窄网域的类型要比较宽网域类型更具体。完全匹配类型比不完全匹配类型更具体,因为不完全匹配类型支持的域值的范围比完全匹配类型更广。例如,INT64FLOAT64 更为具体。

超类型和字面量

字面量的超类型规则比普通表达式更为宽松,并且与隐式强制转换规则一致。当输入类型包括与字面量相关的类型集时,可使用以下算法:

  • 如果集合中已存在非文字量超类型,请找到非字面量常见超类型集。
  • 如果至少有一种可能的超类型,请找到可以隐式强制转换其余字面量类型的最具体类型,然后返回该超类型。否则,则不存在超类型。
  • 如果集仅包含与字面量相关的类型,请计算字面量类型的超类型。
  • 如果所有输入类型都与 NULL 字面量相关,则生成的超类型是 INT64
  • 如果未找到通用超类型,则会引发错误。

示例

输入类型 常见超类型 返回值
INT64 字面量
UINT64 表达式
UINT64 UINT64
TIMESTAMP 表达式
STRING 字面量
TIMESTAMP TIMESTAMP
NULL 字面量
NULL 字面量
INT64 INT64
BOOL 字面量
TIMESTAMP 字面量
错误