Beam ZetaSQL 詞法結構
Beam ZetaSQL 陳述式由一系列標記組成。標記包含識別符、引號識別符、常值、關鍵字、運算子和特殊字元。標記可以用空白字元 (空格、退格、Tab、換行) 或註解分隔。
識別符
識別符是與欄、表格和其他資料庫物件相關聯的名稱。
有兩種指定識別符的方式:未加上引號或加上引號
- 未加上引號的識別符必須以字母或底線開頭。後續字元可以是字母、數字或底線。
- 加上引號的識別符以反引號 (`) 字元括起來,並且可以包含任何字元,例如空格或符號。但是,加上引號的識別符不能為空。保留關鍵字 只有在以反引號括起來時才能用作識別符。
語法 (以忽略空白的正規表示式語法呈現)
identifier: { quoted_identifier | unquoted_identifier } unquoted_identifier:[A-Za-z_][A-Za-z_0-9]*
quoted_identifier:\`[^\\\`\r\n]
any_escape*\`
any_escape:\\(. | \n | \r | \r\n)
範例
Customers5
_dataField1
ADGROUP
無效的範例
5Customers
_dataField!
GROUP
5Customers
以數字開頭,而不是字母或底線。_dataField!
包含特殊字元「!」,這不是字母、數字或底線。GROUP
是保留關鍵字,因此如果不以反引號括起來,則不能用作識別符。
識別符和加上引號的識別符都不區分大小寫,但有一些細微差別。請參閱 大小寫敏感性 以了解更多詳細資訊。
加上引號的識別符具有與字串常值相同的逸出序列,定義如下。
常值
常值表示內建資料類型的常數值。有些資料類型 (但並非所有) 可以表示為常值。
字串和位元組常值
字串和位元組常值都必須加上引號,可以使用單引號 ('
) 或雙引號 ("
) 括起來,或者使用三組單引號 ('''
) 或三組雙引號 ("""
) 加上三重引號括起來。
加上引號的常值
常值 | 範例 | 描述 |
---|---|---|
加上引號的字串 |
| 以單引號 (' ) 括起來的加上引號的字串可以包含未逸出的雙引號 (" ),反之亦然。反斜線 ( \ ) 會引入逸出序列。請參閱下方的「逸出序列」表格。加上引號的字串不能包含換行符號,即使在前面加上反斜線 ( \ ) 也一樣。 |
加上三重引號的字串 |
| 允許內嵌換行符號和引號,而無需逸出 - 請參閱第四個範例。 反斜線 ( \ ) 會引入逸出序列。請參閱下方的「逸出序列」表格。不允許在行尾使用尾隨的未逸出反斜線 ( \ )。與起始引號匹配的一行中三個未逸出的引號將會結束字串。 |
原始字串 |
| 具有原始字串常值前綴 (r 或 R ) 的加上引號或三重引號的常值會被解讀為原始/正規表示式字串。反斜線字元 ( \ ) 不會作為逸出字元。如果反斜線後面跟著另一個字元出現在字串常值內,則這兩個字元都會保留。原始字串不能以奇數個反斜線結尾。 原始字串對於建構正規表示式非常有用。 |
前綴字元 (r
、R
、b
、B
) 對於加上引號或三重引號的字串是選用的,並且分別表示該字串是原始/正規表示式字串還是位元組序列。例如,b'abc'
和 b'''abc'''
都會被解讀為位元組類型。前綴字元不區分大小寫。
帶有前綴的加上引號的常值
下表列出表示字串常值中非字母數字字元的所有有效逸出序列。此表格中沒有的任何序列都會產生錯誤。
逸出序列 | 描述 |
---|---|
\a | 響鈴 |
\b | 退格 |
\f | 換頁 |
\n | 換行 |
\r | 歸位 |
\t | Tab |
\v | 垂直 Tab |
\\ | 反斜線 (\ ) |
\? | 問號 (? ) |
\" | 雙引號 (" ) |
\' | 單引號 (' ) |
\` | 反引號 (` ) |
\ooo | 八進位逸出,精確使用三位數 (範圍為 0-7)。解碼為單個 Unicode 字元 (在字串常值中)。 |
\xhh 或 \Xhh | 十六進位逸出,精確使用兩位十六進位數字 (0-9 或 A-F 或 a-f)。解碼為單個 Unicode 字元 (在字串常值中)。範例
|
\uhhhh | Unicode 逸出,使用小寫「u」和精確四位十六進位數字。僅在字串常值或識別符中有效。 請注意,不允許範圍 D800-DFFF,因為這些是代理 Unicode 值。 |
\Uhhhhhhhh | Unicode 逸出,使用大寫「U」和精確八位十六進位數字。僅在字串常值或識別符中有效。 請注意,不允許範圍 D800-DFFF,因為這些是代理 Unicode 值。此外,不允許使用大於 10FFFF 的值。 |
整數常值
整數常值是十進位數字 (0 到 9) 的序列,或者是前綴為「0x
」的十六進位值。整數可以用「+
」或「-
」作為前綴,分別表示正值和負值。
範例
123
0xABC
-123
整數常值會被解讀為 INT64
。
浮點數常值
語法選項
[+-]DIGITS.[DIGITS][e[+-]DIGITS]
[DIGITS].DIGITS[e[+-]DIGITS]
DIGITSe[+-]DIGITS
DIGITS
表示一個或多個十進位數字 (0 到 9),而 e
表示指數標記 (e 或 E)。
範例
123.456e-67
.1E4
58.
4e2
包含小數點或指數標記的數值常值會被假設為雙精度類型。
如果值在有效浮點數範圍內,則可以將浮點數常值隱式強制轉換為浮點數類型。
沒有 NaN 或無限大的常值表示形式。
陣列常值
陣列常值是以逗號分隔、以方括號括起來的元素清單。ARRAY
關鍵字是選用的,而明確的元素類型 T 也是選用的。
範例
[1, 2, 3]
['x', 'y', 'xy']
ARRAY[1, 2, 3]
ARRAY<string>['x', 'y', 'xy']
時間戳記常值
語法
TIMESTAMP 'YYYY-[M]M-[D]D [[H]H:[M]M:[S]S[.DDDDDD]] [timezone]'
時間戳記常值包含 TIMESTAMP
關鍵字,以及符合標準時間戳記格式 (以單引號括起來) 的字串常值。
時間戳記常值支援介於 1 年和 9999 年 (含) 之間的範圍。超出此範圍的時間戳記無效。
時間戳記常值可以包含數值後綴,以表示時區
TIMESTAMP '2014-09-27 12:30:00.45-08'
如果沒有這個後綴,則會使用預設時區 UTC。
例如,下列時間戳記表示 2014 年 9 月 27 日下午 12:30,使用時區 UTC
TIMESTAMP '2014-09-27 12:30:00.45'
如需有關時區的詳細資訊,請參閱 時區。
具有標準時間戳記格式的字串常值 (包括具有時區名稱的字串常值) 在預期使用時間戳記運算式的地方使用時,會隱式強制轉換為時間戳記常值。例如,在下列查詢中,字串常值 "2014-09-27 12:30:00.45 America/Los_Angeles"
會強制轉換為時間戳記常值。
SELECT * FROM foo
WHERE timestamp_col = "2014-09-27 12:30:00.45 America/Los_Angeles"
時區
由於時間戳記常值必須對應到時間中的特定點,因此需要時區才能正確解讀常值。如果沒有將時區指定為常值本身的一部分,則會使用由 Beam SQL 實作設定的預設時區值。
時區以標準格式的字串表示,該格式表示與協調世界時間 (UTC) 的偏移量。
格式
(+|-)H[H][:M[M]]
範例
'-08:00'
'-8:15'
'+3:00'
'+07:30'
'-7'
時區也可以使用來自 tz 資料庫的字串時區名稱來表示。如需不完整但更簡單的參考,請參閱 Wikipedia 上的 tz 資料庫時區清單。標準時區名稱的格式為 <洲/[地區/]城市>
,例如 America/Los_Angeles
。
請注意,並非所有時區名稱都是可互換的,即使它們在一年中的特定時間恰好報告相同的時間也是如此。例如,America/Los_Angeles
在夏令時間期間報告的時間與 UTC-7:00
相同,但在夏令時間之外報告的時間與 UTC-8:00
相同。
範例
TIMESTAMP '2014-09-27 12:30:00 America/Los_Angeles'
TIMESTAMP '2014-09-27 12:30:00 America/Argentina/Buenos_Aires'
大小寫敏感性
Beam SQL 遵循這些大小寫敏感性規則
類別 | 區分大小寫? | 注意事項 |
---|---|---|
關鍵字 | 否 | |
函數名稱 | 否 | |
表格名稱 | 請參閱注意事項 | 表格名稱通常不區分大小寫,但在查詢使用區分大小寫表格名稱的資料庫時,表格名稱可能會區分大小寫。 |
欄位名稱 | 否 | |
字串值 | 是 | |
字串比較 | 是 | |
查詢中的別名 | 否 | |
正規表示式匹配 | 請參閱注意事項 | 正規表示式匹配預設為區分大小寫,除非表示式本身指定應為不區分大小寫。 |
LIKE 匹配 | 是 |
保留關鍵字
關鍵字是在 Beam SQL 語言中具有特殊含義的一組符號,並具有以下特性
- 關鍵字不能用作識別符號,除非用反引號 (`) 字元括起來。
- 關鍵字不區分大小寫。
Beam SQL 具有以下保留關鍵字。
ALL AND ANY ARRAY AS ASC ASSERT_ROWS_MODIFIED AT BETWEEN BY CASE CAST COLLATE CONTAINS CREATE CROSS CUBE CURRENT DEFAULT DEFINE DESC DISTINCT ELSE END | ENUM ESCAPE EXCEPT EXCLUDE EXISTS EXTRACT FALSE FETCH FOLLOWING FOR FROM FULL GROUP GROUPING GROUPS HASH HAVING IF IGNORE IN INNER INTERSECT INTERVAL INTO | IS JOIN LATERAL LEFT LIKE LIMIT LOOKUP MERGE NATURAL NEW NO NOT NULL NULLS OF ON OR ORDER OUTER OVER PARTITION PRECEDING PROTO RANGE | RECURSIVE RESPECT RIGHT ROLLUP ROWS SELECT SET SOME STRUCT TABLESAMPLE THEN TO TREAT TRUE UNBOUNDED UNION UNNEST USING WHEN WHERE WINDOW WITH WITHIN |
終止分號
陳述式可以在透過應用程式介面 (API) 提交的查詢字串中使用可選的終止分號 (;
)。某些互動式工具需要陳述式具有終止分號。在包含多個陳述式的請求中,陳述式必須以分號分隔,但最後一個陳述式使用分號是可選的。
註解
註解是剖析器會忽略的字元序列。Beam SQL 支援以下類型的註解。
單行註解
單行註解支援在註解前加上 #
或 --
。
範例
SELECT x FROM T; # x 是一個欄位,T 是一個表格
註解包含從 '#' 字元到行尾的所有字元。
SELECT x FROM T; --x 是一個欄位,T 是一個表格
註解包含從 '--
' 序列到行尾的所有字元。您也可以選擇在 '--
' 後面加上一個空格。
多行註解
多行註解支援使用 /* <註解> */
括住註解。
範例
SELECT x FROM T /* x is a field and T is a table */
WHERE x = 3;
無效範例
SELECT x FROM T /* comment starts here
/* comment ends on this line */
this line is not considered a comment */
WHERE x = 3;
註解包含由第一個出現的 '/*
' 和第一個後續出現的 '*/
' 所括住的所有字元,包括換行符號。不支援巢狀註解。第二個範例包含一個巢狀註解,這會使查詢無效。