Beam ZetaSQL 詞彙結構

Beam ZetaSQL 支援標準 SQL 純量資料類型,以及包括陣列、映射和巢狀列的擴充功能。此頁面記錄 Beam ZetaSQL 中支援的 ZetaSQL 資料類型。

資料類型屬性

下表包含資料類型屬性以及每個屬性適用的資料類型

屬性描述適用於
可為 NullNULL 是一個有效值。所有資料類型,但以下例外
  • ARRAY 不能為 NULL
  • NULL ARRAY 元素無法持久化到表格。
  • 查詢無法處理 NULL ARRAY 元素。
可排序可在 ORDER BY 子句中使用。除了以下類型之外的所有資料類型
  • ARRAY
  • STRUCT
可群組通常可以出現在以下的運算式中
GROUP BYDISTINCTPARTITION BY
但是,PARTITION BY 運算式不能包含
浮點類型 FLOATDOUBLE


除了以下類型之外的所有資料類型
  • ARRAY
  • STRUCT
  • FLOAT64
可比較相同類型的值可以互相比較。所有資料類型,但以下例外

不支援 ARRAY 比較。



STRUCT 的相等比較是逐欄位按欄位順序支援的。欄位名稱會被忽略。不支援小於和大於比較。





所有支援比較的類型都可以在 JOIN 條件中使用。請參閱聯結類型,以了解聯結條件的說明。

數值類型

數值類型包括整數類型和浮點類型。

整數類型

整數是不具有小數部分的數值。

名稱儲存大小範圍
INT648 位元組-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

浮點類型

浮點值是具有小數部分的近似數值。

名稱儲存大小描述
FLOAT648 位元組雙精度(近似)十進位值。

布林類型

名稱描述
BOOL布林值以關鍵字 TRUEFALSE 表示(不區分大小寫)。

字串類型

名稱描述
STRING可變長度字元(Unicode)資料。

輸入 STRING 值必須使用 UTF-8 編碼,而輸出 STRING 值將使用 UTF-8 編碼。其他編碼(如 CESU-8 和 Modified UTF-8)不會被視為有效的 UTF-8。

所有作用於 STRING 值的函數和運算子都是作用於 Unicode 字元而不是位元組。例如,當諸如 SUBSTRLENGTH 之類的函數應用於 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]

時區用於剖析時間戳記或格式化時間戳記以進行顯示。時間戳記值本身不儲存特定的時區。字串格式的時間戳記可以包含時區。當未明確指定時區時,將使用預設時區 UTC。

時區

時區以以下兩種標準格式之一的字串表示

與協調世界時 (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 有兩個欄位 yz,它們都是 64 位元整數。
STRUCT<inner_array ARRAY<INT64>>一個包含名為 inner_array 的陣列的 STRUCT,該陣列持有 64 位元整數元素。

STRUCT 的有限比較

STRUCT 可以使用等號運算子直接比較

請注意,這些直接的等式比較會依序比較 STRUCT 的欄位,並忽略任何欄位名稱。 如果您想要比較具有相同名稱的 STRUCT 欄位,則可以直接比較個別欄位。