转换函数

Cloud Spanner SQL 支持以下转换函数。这些数据类型转换是显式的,但某些转换是隐式的。您可以在此处详细了解隐式和显式转换。

CAST 概览

CAST(expression AS typename)

说明

类型转换语法在查询中使用,用于指示表达式的结果类型应转换成其他某种类型。

使用 CAST 时,如果 Cloud Spanner SQL 无法执行类型转换,则查询可能会失败。如果您想使自己的查询避免这些类型的错误,则可以使用 SAFE_CAST

如果受支持的类型之间的类型转换未从原始值成功地映射到目标域,则会引发运行时错误。例如,如果字节序列不是有效的 UTF-8 字符,则将 BYTES 类型转换为 STRING 类型会导致运行时错误。

示例

如果 x1,则以下查询的结果为 "true";如果 x 为任何其他非 NULL 值,则结果为 "false";如果 xNULL,则结果为 NULL

CAST(x=1 AS STRING)

CAST AS ARRAY

CAST(expression AS ARRAY<element_type>)

说明

Cloud Spanner SQL 支持类型转换为 ARRAY。expression 参数可表示以下数据类型的表达式:

  • ARRAY

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
ARRAY ARRAY 两者必须是完全相同的 ARRAY 类型。

CAST AS BOOL

CAST(expression AS BOOL)

说明

Cloud Spanner SQL 支持类型转换为 BOOL。expression 参数可表示以下数据类型的表达式:

  • INT64
  • BOOL
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
INT64 BOOL 如果 x0,则返回 FALSE;否则返回 TRUE
STRING BOOL 如果 x"true",则返回 TRUE;如果 x"false",则返回 FALSE
x 的所有其他值均无效且抛出错误,而不会转换为 BOOL。
转换为 BOOL 类型时,STRING 类型不区分大小写。

CAST AS BYTES

CAST(expression AS BYTES)

说明

Cloud Spanner SQL 支持类型转换为 BYTES。expression 参数可表示以下数据类型的表达式:

  • BYTES
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
STRING BYTES STRING 通过 UTF-8 编码转换为 BYTES。例如,在转换为 BYTES 时,字符串“©”会转为一个包含十六进制值 C2 和 A9 的 2 字节序列。

CAST AS DATE

CAST(expression AS DATE)

说明

Cloud Spanner SQL 支持类型转换为 DATE。expression 参数可表示以下数据类型的表达式:

  • STRING
  • TIMESTAMP

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
STRING DATE 字符串转换为日期时,字符串必须遵循所支持的日期字面量格式,但与时区无关。如果字符串表达式无效或其表示的日期超出了所支持的最小/最大范围,则出现错误。
TIMESTAMP DATE 如果从时间戳转换为日期,则实际自默认时区起截断时间戳。

CAST AS FLOAT64

CAST(expression AS FLOAT64)

说明

Cloud Spanner SQL 支持类型转换为浮点类型。expression 参数可表示以下数据类型的表达式:

  • INT64
  • FLOAT64
  • NUMERIC
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
INT64 FLOAT64 返回一个接近但可能不精确的浮点值。
NUMERIC FLOAT64 NUMERIC 类型将转换为最接近的浮点数,可能有一定的精度损失。
STRING FLOAT64 以浮点值的形式返回 x,将其解释为具有与有效的浮点字面量相同的形式。也支持从 "[+,-]inf" 转换为 [,-]Infinity、从 "[+,-]infinity" 转换为 [,-]Infinity 以及从 "[+,-]nan" 转换为 NaN。转换不区分大小写。

CAST AS INT64

CAST(expression AS INT64)

说明

Cloud Spanner SQL 支持类型转换为整数类型。expression 参数可表示以下数据类型的表达式:

  • INT64
  • FLOAT64
  • NUMERIC
  • BOOL
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
FLOAT64 INT64 返回最接近的整数值。
中间数(例如 1.5 或 -0.5)向远离 0 的方向舍入。
BOOL INT64 如果 xTRUE,则返回 1;否则返回 0
STRING INT64 十六进制字符串可以转换为整数。例如,0x123291,或 -0x123-291

示例

如果您使用十六进制字符串 (0x123),可以将这些字符串的类型转换为整数:

SELECT '0x123' as hex_value, CAST('0x123' as INT64) as hex_to_int;

+-----------+------------+
| hex_value | hex_to_int |
+-----------+------------+
| 0x123     | 291        |
+-----------+------------+
SELECT '-0x123' as hex_value, CAST('-0x123' as INT64) as hex_to_int;

+-----------+------------+
| hex_value | hex_to_int |
+-----------+------------+
| -0x123    | -291       |
+-----------+------------+

CAST AS NUMERIC

CAST(expression AS NUMERIC)

说明

Cloud Spanner SQL 支持类型转换为 NUMERIC。expression 参数可表示以下数据类型的表达式:

  • INT64
  • FLOAT64
  • NUMERIC
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
FLOAT64 NUMERIC 浮点数将向远离 0 方向按中间数舍入。如果对 NaN+inf-inf 进行类型转换,则系统会返回错误。如果对 NUMERIC 范围以外的值进行类型转换,则系统会返回溢出错误。
STRING NUMERIC STRING 中包含的数字字面量不得超出 NUMERIC 类型的最大精度或范围,否则将发生错误。如果小数点后的位数超过 9 位,则生成的 NUMERIC 值会向远离 0 方向按中间数舍入,从而在小数点后保留 9 位数。

CAST AS STRING

CAST(expression AS STRING)

说明

Cloud Spanner SQL 支持类型转换为 STRING。expression 参数可表示以下数据类型的表达式:

  • INT64
  • FLOAT64
  • NUMERIC
  • BOOL
  • BYTES
  • DATE
  • TIMESTAMP
  • STRING

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
FLOAT64 STRING 返回一个近似的字符串表示形式。
BOOL STRING 如果 xTRUE,则返回 "true";否则返回 "false"
BYTES STRING 返回解释为 UTF-8 STRING 类型的 x
例如,在转换为 STRING 类型时,BYTES 类型的字面量 b'\xc2\xa9' 会解释为 UTF-8 字符并且转为 Unicode 字符“©”。
如果 x 不是有效的 UTF-8 字符,则引发错误。
DATE STRING 日期类型转换为字符串与时区无关,并采用 YYYY-MM-DD 形式。
TIMESTAMP STRING 时间戳类型转换为字符串时,使用默认时区 America/Los_Angeles 解释时间戳。所生成的亚秒位数取决于亚秒部分中尾随零的数量:CAST 函数将截取 0、3 或 6 位数。

示例

SELECT CAST(CURRENT_DATE() AS STRING) AS current_date

+---------------+
| current_date  |
+---------------+
| 2021-03-09    |
+---------------+

CAST AS STRUCT

CAST(expression AS STRUCT)

说明

Cloud Spanner SQL 支持类型转换为 STRUCT。expression 参数可表示以下数据类型的表达式:

  • STRUCT

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
STRUCT STRUCT 仅在满足以下条件时可用:
  1. 这两个 STRUCT 的字段数量相同。
  2. 原始 STRUCT 字段类型可显式转换为相应的目标 STRUCT 字段类型(由字段顺序定义,而不是由字段名称定义)。

CAST AS TIMESTAMP

CAST(expression AS TIMESTAMP)

说明

Cloud Spanner SQL 支持类型转换为 TIMESTAMP。expression 参数可表示以下数据类型的表达式:

  • STRING
  • TIMESTAMP

转换规则

发件人 目标类型 x 进行类型转换时适用的规则
STRING TIMESTAMP 字符串转换为时间戳时,string_expression 必须遵循所支持的时间戳字面量格式,否则将出现运行时错误。string_expression 本身可能包含时区。
如果 string_expression 中存在时区,则转换时使用该时区,否则使用默认时区 America/Los_Angeles。如果字符串少于 6 位数,则将其隐式加宽。
如果 string_expression 无效,其亚秒位数超过 6 位数(即精度高于微秒),或者所表示的时间超出了支持的时间戳范围,则会引发错误。
DATE TIMESTAMP 如果从日期转换为时间戳,则从默认时区 America/Los_Angeles 的午夜(一天之始)起解释 date_expression

示例

以下示例将字符串格式的时间戳转换为时间戳:

SELECT CAST("2020-06-02 17:00:53.110+00:00" AS TIMESTAMP) AS as_timestamp

-- Results depend upon where this query was executed.
+-------------------------+
| as_timestamp            |
+-------------------------+
| 2020-06-03T00:00:53.11Z |
+-------------------------+

SAFE_CAST

SAFE_CAST(expression AS typename)

说明

使用 CAST 时,如果 Cloud Spanner SQL 无法执行类型转换,则查询可能会失败。例如,以下查询会引发错误:

SELECT CAST("apple" AS INT64) AS not_a_number;

如果您想保护自己的查询,避免这些类型的错误,您可以使用 SAFE_CASTSAFE_CAST 基本等同于 CAST,唯一的差别就在于前者返回 NULL,而非引发错误。

SELECT SAFE_CAST("apple" AS INT64) AS not_a_number;

+--------------+
| not_a_number |
+--------------+
| NULL         |
+--------------+

如果将字节转换为字符串,您还可以使用 SAFE_CONVERT_BYTES_TO_STRING。任何无效的 UTF-8 字符都会替换为 Unicode 替换字符 U+FFFD。如需了解详情,请参阅 SAFE_CONVERT_BYTES_TO_STRING

其他转换函数

您可以在文档的其他地方详细了解以下转换函数:

转换函数 发件人 To
ARRAY_TO_STRING ARRAY STRING
DATE 各种数据类型 DATE
FROM_BASE32 STRING BYTES
FROM_BASE64 STRING BYTES
FROM_HEX STRING BYTES
PARSE_DATE STRING DATE
PARSE_TIMESTAMP STRING TIMESTAMP
SAFE_CONVERT_BYTES_TO_STRING BYTES STRING
STRING TIMESTAMP STRING
TIMESTAMP 各种数据类型 TIMESTAMP
TO_BASE32 BYTES STRING
TO_BASE64 BYTES STRING
TO_HEX BYTES STRING