Beam ZetaSQL 詞彙結構
Beam ZetaSQL 支援標準 SQL 純量資料類型,以及包括陣列、映射和巢狀列的擴充功能。此頁面記錄 Beam ZetaSQL 中支援的 ZetaSQL 資料類型。
資料類型屬性
下表包含資料類型屬性以及每個屬性適用的資料類型
屬性 | 描述 | 適用於 |
---|---|---|
可為 Null | 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> | 具有單個未命名 64 位元整數欄位的簡單 STRUCT。 |
STRUCT<x STRUCT<y INT64, z INT64>> | 一個 STRUCT,其中包含一個名為 x 的巢狀 STRUCT。STRUCT x 有兩個欄位 y 和 z ,它們都是 64 位元整數。 |
STRUCT<inner_array ARRAY<INT64>> | 一個包含名為 inner_array 的陣列的 STRUCT,該陣列持有 64 位元整數元素。 |
STRUCT 的有限比較
STRUCT 可以使用等號運算子直接比較
- 等於 (
=
) - 不等於 (
!=
或<>
) - [
NOT
]IN
請注意,這些直接的等式比較會依序比較 STRUCT 的欄位,並忽略任何欄位名稱。 如果您想要比較具有相同名稱的 STRUCT 欄位,則可以直接比較個別欄位。