Beam ZetaSQL 词法结构
Beam ZetaSQL 支持标准 SQL 标量数据类型,以及包括数组、映射和嵌套行在内的扩展。此页面记录了 Beam ZetaSQL 中支持的 ZetaSQL 数据类型。
数据类型属性
下表包含数据类型属性以及每个属性适用的数据类型
属性 | 描述 | 适用范围 |
---|---|---|
可空 | NULL 是一个有效值。 | 所有数据类型,以下情况除外
|
可排序 | 可以在 ORDER BY 子句中使用。 | 所有数据类型,以下情况除外
|
可分组 | 通常可以出现在以下表达式之后GROUP BY 、DISTINCT 或 PARTITION BY 。但是, PARTITION BY 表达式不能包含浮点数类型 FLOAT 和 DOUBLE 。 | 所有数据类型,以下情况除外
|
可比较 | 相同类型的值可以相互比较。 | 所有数据类型,以下情况除外 不支持 ARRAY 比较。
|
数值类型
数值类型包括整数类型和浮点数类型。
整数类型
整数是没有小数部分的数值。
名称 | 存储大小 | 范围 |
---|---|---|
INT64 | 8 字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
浮点数类型
浮点数是带有小数部分的近似数值。
名称 | 存储大小 | 描述 |
---|---|---|
FLOAT64 | 8 字节 | 双精度 (近似) 十进制值。 |
布尔类型
名称 | 描述 |
---|---|
BOOL | 布尔值用关键字 TRUE 和 FALSE 表示(不区分大小写)。 |
字符串类型
名称 | 描述 |
---|---|
STRING | 可变长度字符 (Unicode) 数据。 |
输入 STRING 值必须为 UTF-8 编码,输出 STRING 值将为 UTF-8 编码。其他编码,如 CESU-8 和 Modified UTF-8 不被视为有效的 UTF-8。
所有对 STRING 值进行操作的函数和运算符都作用于 Unicode 字符而不是字节。例如,当函数 SUBSTR
和 LENGTH
应用于 STRING 输入时,这些函数计算 Unicode 字符,而不是字节。比较定义在 Unicode 字符上。小于和 ORDER BY
的比较按字符逐个比较,较低的 Unicode 代码点被视为较低的字符。
字节类型
名称 | 描述 |
---|---|
BYTES | 可变长度二进制数据。 |
STRING 和 BYTES 是不同的类型,不能互换使用。STRING 和 BYTES 之间的强制转换强制执行字节使用 UTF-8 编码。
时间戳类型
注意:SQL 的 TIMESTAMP
精度为毫秒。如果 TIMESTAMP
字段具有亚毫秒精度,SQL 将抛出 IllegalArgumentException
。
名称 | 描述 | 范围 |
---|---|---|
TIMESTAMP | 表示一个绝对的时间点,具有毫秒精度。 | 0001-01-01 00:00:00 到 9999-12-31 23:59:59.999 UTC。 |
时间戳表示一个绝对的时间点,独立于任何时区或约定,如夏令时。
规范格式
YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDD]][time zone]
YYYY
:四位数年份[M]M
:一位或两位数月份[D]D
:一位或两位数日期( |T)
:一个空格或一个T
分隔符[H]H
:一位或两位数小时(有效值从 00 到 23)[M]M
:一位或两位数分钟(有效值从 00 到 59)[S]S
:一位或两位数秒(有效值从 00 到 59)[.DDD]
:最多三位小数位(即最多毫秒精度)[时区]
:表示时区的字符串。有关详细信息,请参阅 时区 部分。
时区用于解析时间戳或格式化时间戳以供显示。时间戳值本身不存储特定时区。字符串格式的时间戳可能包含时区。如果未明确指定时区,则使用默认时区 UTC。
时区
时区使用以下两种规范格式之一的字符串表示
- 相对于协调世界时 (UTC) 的偏移量,或表示 UTC 的字母
Z
- tz 数据库 中的时区名称
相对于协调世界时 (UTC) 的偏移量
偏移量格式
(+|-)H[H][:M[M]]
Z
示例
-08:00
-8:15
+3:00
+07:30
-7
Z
使用此格式时,时区与时间戳的其余部分之间不允许有空格。
2014-09-27 12:30:00.45-8:00
2014-09-27T12:30:00.45Z
时区名称
时区名称来自 tz 数据库。有关不太全面但更简单的参考,请参阅维基百科上的 tz 数据库时区列表。
格式
continent/[region/]city
示例
America/Los_Angeles
America/Argentina/Buenos_Aires
使用时区名称时,名称与时间戳的其余部分之间需要空格
2014-09-27 12:30:00.45 America/Los_Angeles
请注意,即使在一年中的某个时间段内,并非所有时区名称都是可互换的,即使它们恰好报告了相同的时间。例如,America/Los_Angeles
在夏令时期间与 UTC-7:00
报告相同的时间,但在夏令时以外期间与 UTC-8:00
报告相同的时间。
如果未指定时区,则使用默认时区值。
闰秒
时间戳只是从 1970-01-01 00:00:00 UTC 开始的偏移量,假设每分钟正好有 60 秒。闰秒不作为存储时间戳的一部分表示。
如果您的输入包含在秒字段中使用 “:60” 来表示闰秒的值,则该闰秒在转换为时间戳值时不会被保留。相反,该值将被解释为在下一分钟的秒字段中为 “:00” 的时间戳。
闰秒不影响时间戳计算。所有时间戳计算都是使用 Unix 风格的时间戳完成的,这些时间戳不反映闰秒。闰秒只能通过测量实际时间的函数来观察。在这些函数中,当出现闰秒时,时间戳秒可能被跳过或重复。
数组类型
名称 | 描述 |
---|---|
ARRAY | 零个或多个任何非 ARRAY 类型的元素的有序列表。 |
ARRAY 是零个或多个非 ARRAY 值元素的有序列表。不允许使用 ARRAY 的 ARRAY。生成 ARRAY 的 ARRAY 的查询将返回错误。相反,必须使用 SELECT AS STRUCT
结构在 ARRAY 之间插入 STRUCT。
空 ARRAY 和 NULL
ARRAY 是两个不同的值。ARRAY 可以包含 NULL
元素。
声明 ARRAY 类型
ARRAY 类型使用尖括号 (<
和 >
) 声明。ARRAY 元素的类型可以任意复杂,但 ARRAY 不能直接包含另一个 ARRAY。
格式
ARRAY<T>
示例
类型声明 | 含义 |
---|---|
ARRAY<INT64> | 简单的 64 位整数 ARRAY。 |
ARRAY<STRUCT<INT64, INT64>> | 一个 STRUCT 的 ARRAY,每个 STRUCT 包含两个 64 位整数。 |
ARRAY<ARRAY<INT64>> (不支持) | 这是一个无效的类型声明,这里只是为了防止您查找如何创建多级 ARRAY。ARRAY 不能直接包含 ARRAY。相反,请参阅下一个示例。 |
ARRAY<STRUCT<ARRAY<INT64>>> | 64 位整数的 ARRAY 的 ARRAY。请注意,两个 ARRAY 之间有一个 STRUCT,因为 ARRAY 不能直接包含其他 ARRAY。 |
结构类型
名称 | 描述 |
---|---|
STRUCT | 包含有序字段的容器,每个字段都具有类型(必需)和字段名称(可选)。 |
声明 STRUCT 类型
STRUCT 类型使用尖括号 (<
和 >
) 声明。STRUCT 元素的类型可以是任意复杂的。
格式
STRUCT<T>
示例
类型声明 | 含义 |
---|---|
STRUCT<INT64> | 一个简单的 STRUCT,包含一个未命名的 64 位整数字段。 |
STRUCT<x STRUCT<y INT64, z INT64>> | 一个 STRUCT,包含一个名为 x 的嵌套 STRUCT。STRUCT x 有两个字段,y 和 z ,它们都是 64 位整数。 |
STRUCT<inner_array ARRAY<INT64>> | 一个 STRUCT,包含一个名为 inner_array 的 ARRAY,它保存 64 位整数元素。 |
STRUCT 的有限比较
STRUCT 可以使用等式运算符直接比较
- 等于 (
=
) - 不等于 (
!=
或<>
) - [
NOT
]IN
注意,这些直接等式比较会按顺序比较 STRUCT 的字段,而忽略任何字段名称。如果您想比较 STRUCT 中名称相同的字段,可以将各个字段直接进行比较。