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 是保留關鍵字,因此如果不以反引號括起來,則不能用作識別符。

識別符和加上引號的識別符都不區分大小寫,但有一些細微差別。請參閱 大小寫敏感性 以了解更多詳細資訊。

加上引號的識別符具有與字串常值相同的逸出序列,定義如下。

常值

常值表示內建資料類型的常數值。有些資料類型 (但並非所有) 可以表示為常值。

字串和位元組常值

字串和位元組常值都必須加上引號,可以使用單引號 (') 或雙引號 (") 括起來,或者使用三組單引號 (''') 或三組雙引號 (""") 加上三重引號括起來。

加上引號的常值

常值範例描述
加上引號的字串
  • "abc"
  • "it's"
  • 'it\'s'
  • 'Title: "Boy"'
以單引號 (') 括起來的加上引號的字串可以包含未逸出的雙引號 ("),反之亦然。
反斜線 (\) 會引入逸出序列。請參閱下方的「逸出序列」表格。
加上引號的字串不能包含換行符號,即使在前面加上反斜線 (\) 也一樣。

加上三重引號的字串
  • """abc"""
  • '''it's'''
  • '''Title:"Boy"'''
  • '''two
    lines'''
  • '''why\?'''
允許內嵌換行符號和引號,而無需逸出 - 請參閱第四個範例。
反斜線 (\) 會引入逸出序列。請參閱下方的「逸出序列」表格。
不允許在行尾使用尾隨的未逸出反斜線 (\)。
與起始引號匹配的一行中三個未逸出的引號將會結束字串。


原始字串
  • R"abc+"
  • r'''abc+'''
  • R"""abc+"""
  • r'f\(abc,(.*),def\)'
具有原始字串常值前綴 (rR) 的加上引號或三重引號的常值會被解讀為原始/正規表示式字串。
反斜線字元 (\) 不會作為逸出字元。如果反斜線後面跟著另一個字元出現在字串常值內,則這兩個字元都會保留。
原始字串不能以奇數個反斜線結尾。
原始字串對於建構正規表示式非常有用。


前綴字元 (rRbB) 對於加上引號或三重引號的字串是選用的,並且分別表示該字串是原始/正規表示式字串還是位元組序列。例如,b'abc'b'''abc''' 都會被解讀為位元組類型。前綴字元不區分大小寫。

帶有前綴的加上引號的常值

下表列出表示字串常值中非字母數字字元的所有有效逸出序列。此表格中沒有的任何序列都會產生錯誤。

逸出序列描述
\a響鈴
\b退格
\f換頁
\n換行
\r歸位
\tTab
\v垂直 Tab
\\反斜線 (\)
\?問號 (?)
\"雙引號 (")
\'單引號 (')
\`反引號 (`)
\ooo八進位逸出,精確使用三位數 (範圍為 0-7)。解碼為單個 Unicode 字元 (在字串常值中)。
\xhh\Xhh十六進位逸出,精確使用兩位十六進位數字 (0-9 或 A-F 或 a-f)。解碼為單個 Unicode 字元 (在字串常值中)。範例
  • '\x41' == 'A'
  • '\x41B''AB'
  • '\x4' 是錯誤
\uhhhhUnicode 逸出,使用小寫「u」和精確四位十六進位數字。僅在字串常值或識別符中有效。
請注意,不允許範圍 D800-DFFF,因為這些是代理 Unicode 值。
\UhhhhhhhhUnicode 逸出,使用大寫「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;

註解包含由第一個出現的 '/*' 和第一個後續出現的 '*/' 所括住的所有字元,包括換行符號。不支援巢狀註解。第二個範例包含一個巢狀註解,這會使查詢無效。