本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 Amazon 中使用 PartiQL 查詢離子 QLDB
重要
支援結束通知:現有客戶將能夠使用 Amazon,QLDB直到 2025 年 7 月 31 日終止支援為止。有關更多詳細信息,請參閱將 Amazon QLDB 分類帳遷移到 Amazon Aurora 郵政. SQL
當您在 Amazon 中查詢數據時QLDB,您可以使用 PartiQL 格式編寫語句,但會以 Amazon 離子格式QLDB返回結果。PartiQL 的目的是要SQL兼容,而離子則是. JSON 這會導致您在查詢陳述式中註記資料的方式與查詢結果顯示方式之間的語法差異。
本節說明使用QLDB主控台或命令介面手動執行 PartiQL 陳述式的基本語法和語意。QLDB
提示
語法和語義
當使用主QLDB控台或QLDB命令介面查詢離子資料時,以下是 PartiQL 的基本語法和語意:
- 區分大小寫
-
所有QLDB系統物件名稱 (包括欄位名稱、資料表名稱和分類帳名稱) 都區分大小寫。
- 字串值
-
在 Ion 中,雙引號(
"..."
)表示一個字符串。 在 PartiQL 中,單引號 (
'...'
) 表示一個字符串。 - 符號和標識符
-
在 Ion 中,單引號 (
'...'
) 表示符號。Ion 中的符號的子集稱為標識符由未加引號的文本表示。 在 PartiQL 中,雙引號 (
"..."
) 表示帶引號的 PartiQL 識別碼,例如用來做為資料表名稱的保留字。未加引號的文字代表一般的 PartiQL 識別碼,例如不是保留字的資料表名稱。 - 離子文字
-
任何離子文字都可以在 PartiQL 語句中用反引號(
`...`
)表示。 - 欄位名稱
-
離子欄位名稱是區分大小寫的符號。PartiQL 可讓您在陳述式中使用單引號來表示欄位名稱。DML這是使用 PartiQL
cast
函數定義符號的速記替代方法。它也比使用反引號來表示文字離子符號更直觀。
文字
PartiQL 查詢語言的常值對應於離子資料類型,如下所示:
- 标量
-
如果適用,請遵循SQL語法,如分部离子类型映射章節中所述。例如:
-
5
-
'foo'
-
null
-
- 结构
-
也被稱為元組或許多格式和其他數據模型的對象。
由花括號(
{...}
)表示,用逗號分隔的struct
元素。-
{ 'id' : 3, 'arr': [1, 2] }
-
- 清單
-
也稱為陣列。
由方括號(
[...]
)表示,列表元素用逗號分隔。-
[ 1, 'foo' ]
-
- 包裝袋
-
在 PartiQL 中無序集合。
由雙角括號(
<<...>>
)表示,包元素用逗號分隔。在中QLDB,桌子可以被認為是一個袋子。不過,包包不能以巢狀方式嵌套在表格中的文件中。-
<< 1, 'foo' >>
-
範例
以下是具有各種 Ion 類型之INSERT
陳述式的語法範例。
INSERT INTO VehicleRegistration VALUE { 'VIN' : 'KM8SRDHF6EU074761', --string 'RegNum' : 1722, --integer 'State' : 'WA', 'City' : 'Kent', 'PendingPenaltyTicketAmount' : 130.75, --decimal 'Owners' : { --nested struct 'PrimaryOwner' : { 'PersonId': '294jJ3YUoH1IEEm8GSabOs' }, 'SecondaryOwners' : [ --list of structs { 'PersonId' : '1nmeDdLo3AhGswBtyM1eYh' }, { 'PersonId': 'IN7MvYtUjkp1GMZu0F6CG9' } ] }, 'ValidFromDate' : `2017-09-14T`, --Ion timestamp literal with day precision 'ValidToDate' : `2020-06-25T` }
反引号
PartiQL 完全涵蓋了所有 Ion 數據類型,因此您可以在不使用反引號的情況下編寫任何語句。但是在某些情況下,這種 Ion 字面語法可以使您的語句更清晰,更簡潔。
例如,要插入帶有 Ion 時間戳記和符號值的文檔,您可以僅使用純粹的 PartiQL 語法編寫以下語句。
INSERT INTO myTable VALUE { 'myTimestamp': to_timestamp('2019-09-04T'), 'mySymbol': cast('foo' as symbol) }
這是相當詳細的,所以相反,你可以使用反引號來簡化你的語句。
INSERT INTO myTable VALUE { 'myTimestamp': `2019-09-04T`, 'mySymbol': `foo` }
您也可以將整個結構包含在反引號中,以節省更多的按鍵動作。
INSERT INTO myTable VALUE `{ myTimestamp: 2019-09-04T, mySymbol: foo }`
重要
字符串和符號是在 PartiQL 不同的類。這意味著即使它們具有相同的文本,它們也不相等。例如,下列 PartiQL 運算式會評估為不同的離子值。
'foo'
`foo`
路徑導覽
撰寫資料操作語言 (DML) 或查詢陳述式時,您可以使用路徑步驟存取巢狀結構中的欄位。PartiQL 支援點符號來存取父結構的欄位名稱。下列範例會存取父項的Model
欄位Vehicle
。
Vehicle.Model
要訪問列表的特定元素,可以使用方括號運算符來表示從零開始的序數。下列範例會SecondaryOwners
使用的序號存取的2
元素。換句話說,這是列表的第三個元素。
SecondaryOwners[2]
鋸齒
QLDB支持開放的內容和模式。因此,當您存取陳述式中的特定欄位時,確保獲得預期結果的最佳方式就是使用別名。例如,如果您沒有指定明確的別名,則系統會為您的FROM
來源產生隱含的別名。
SELECT VIN FROM Vehicle
--is rewritten to
SELECT Vehicle.VIN FROM Vehicle AS Vehicle
但是,對於字段名稱衝突,結果是不可預測的。如果文件內的巢狀結構中VIN
存在另一個名為的欄位,則此查詢傳回的VIN
值可能會讓您感到驚訝。最佳做法是改寫下列陳述式。此查詢宣告v
為範圍在Vehicle
資料表上的別名。AS
關鍵字是可選的。
SELECT v.VIN FROM Vehicle [ AS ] v
在文件內的巢狀集合中進行路徑分析時,別名特別有用。例如,下列陳述式宣告o
為範圍超過集合VehicleRegistration.Owners
的別名。
SELECT o.SecondaryOwners FROM VehicleRegistration AS r, @r.Owners AS o
在這裡,@
字符在技術上是可選的。但它明確表明你想要結Owners
構VehicleRegistration
,而不是名為的不同集合Owners
(如果存在的話)。
PartiQL 規格
如需有關 PartiQL 查詢語言的詳細資訊,請參閱 PartiQL