在亞馬遜 QLDB 中使用 PartiQL 查詢離子 - Amazon Quantum Ledger Database (Amazon QLDB)

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在亞馬遜 QLDB 中使用 PartiQL 查詢離子

當您在亞馬遜 QLDB 中查詢資料時,您會以 PartiQL 格式撰寫陳述式,但 QLDB 會以亞馬遜離子格式傳回結果。PartiQL 的目的是與 SQL 兼容,而離子是 JSON 的擴展。這會導致您在查詢陳述式中註記資料的方式與查詢結果顯示方式之間的語法差異。

本節說明使用 QLDB 主控台或 QLDB 殼層手動執行 PartiQL 陳述式的基本語法和語意。

提示

當您以程式設計方式執行 PartiQL 查詢時,最佳做法是使用參數化陳述式。您可以在陳述式中使用問號 (?) 做為繫結變數預留位置,以避免這些語法規則。這也更加安全和高效。

若要進一步了解,請參閱開始使用驅動程式中的下列教學課程:

語法與語義

當使用 QLDB 主控台或 QLDB 外殼查詢離子資料時,以下是 PartiQL 的基本語法和語意:

區分大小寫

所有 QLDB 系統物件名稱 (包括欄位名稱、資料表名稱和分類帳名稱) 都區分大小寫。

字串值

在 Ion 中,雙引號("...")表示一個字符串

在 PartiQL 中,單引號 ('...') 表示一個字符串。

符號和標識符

在 Ion 中,單引號 ('...') 表示符號。Ion 中的符號的子集稱為標識符由未加引號的文本表示。

在 PartiQL 中,雙引號 ("...") 表示帶引號的 PartiQL 識別碼,例如用來做為資料表名稱的保留字。未加引號的文字代表一般的 PartiQL 識別碼,例如不是保留字的資料表名稱。

Ion 常值

任何離子文字都可以在 PartiQL 語句中用反引號(`...`)表示。

欄位名稱

Ion 欄位名稱區分大小寫的符號。PartiQL 可讓您在 DML 陳述式中使用單引號來表示欄位名稱。這是使用 PartiQLcast 函數定義符號的速記替代方法。它也比使用反引號來表示文字離子符號更直觀。

文字

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

在這裡,@字符在技術上是可選的。但它明確表明你想要結OwnersVehicleRegistration,而不是名為的不同集合Owners(如果存在的話)。

PartiQL 規格

如需 PartiQL 查詢語言的詳細資訊,請參閱 PartiQL 規格