翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Amazon での PartiQL を使用した Ion のクエリ QLDB
重要
サポート終了通知: 既存のお客様は、07/31/2025 のサポート終了QLDBまで Amazon を使用できます。詳細については、「Amazon Ledger QLDB を Amazon Aurora Postgre に移行するSQL
Amazon でデータをクエリするときQLDBは、PartiQL 形式でステートメントを記述しますが、Amazon Ion 形式で結果QLDBを返します。PartiQL は とのSQL互換性が意図されていますが、Ion は の拡張ですJSON。そのため、クエリステートメントでのデータの表記方法と、クエリ結果の表示方法に構文上の違いが生じます。
このセクションでは、 QLDBコンソールまたはQLDBシェル を使用して PartiQL ステートメントを手動で実行するための基本的な構文とセマンティクスについて説明します。
ヒント
PartiQL クエリをプログラムで実行する場合、ベストプラクティスはパラメータ化されたステートメントを使用することです。ステートメントで疑問符 (?
) をバインド変数プレースホルダーとして使用して、これらの構文ルールを回避できます。この方法は、よりセキュアで効率的でもあります。
詳細については、「ドライバーの開始方法」の以下のチュートリアルを参照してください。
-
Java: クイックスタートチュートリアル | クックブックリファレンス
-
.NET: クイックスタートチュートリアル | クックブックリファレンス
-
Go: クイックスタートチュートリアル | クックブックリファレンス
-
Node.js: クイックスタートチュートリアル | クックブックリファレンス
-
Python: クイックスタートチュートリアル | クックブックリファレンス
構文とセマンティクス
QLDB コンソールまたはシェルを使用して Ion QLDB データをクエリする場合、PartiQL の基本的な構文とセマンティクスは次のとおりです。
- 大文字と小文字の区別
-
フィールド名、テーブル名、台帳名を含むすべてのQLDBシステムオブジェクト名では、大文字と小文字が区別されます。
- 文字列値
-
Ion では、二重引用符 (
"..."
) は文字列を表します。 PartiQL では、一重引用符 (
'...'
) は文字列を表します。 - 記号と識別子
-
Ion では、一重引用符 (
'...'
) は記号を表します。Ion のシンボルのサブセットは識別子と呼ばれ、引用符で囲まれていないテキストで表されます。 PartiQL では、二重引用符 (
"..."
) は、引用符で囲まれた PartiQL 識別子 (テーブル名として使用される予約語など) を表します。引用符で囲まれていないテキストは、通常の PartiQL 識別子 (予約語ではないテーブル名など) を表します。 - Ion リテラル
-
すべての Ion リテラル値は、PartiQL ステートメントでバックティック (
`...`
) で表すことができます。 - フィールド名
-
Ion フィールド名は、大文字と小文字が区別される記号です。PartiQL では、DMLステートメント内のフィールド名を一重引用符で表すことができます。これは、PartiQL の
cast
関数を使用して記号を定義する場合の省略形です。また、バックティックを使用してリテラルの Ion 記号を示すよりも直感的です。
リテラル
PartiQL クエリ言語のリテラルは、次のように Ion データ型に対応します。
- スカラー
-
PartiQL と Ion の型マッピング セクションの説明に従って、該当する場合は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 式は異なる Ion 値に評価されます。
'foo'
`foo`
パスナビゲーション
データ操作言語 (DML) またはクエリステートメントを記述する場合、パスステップを使用してネストされた構造内のフィールドにアクセスできます。PartiQL は、親構造のフィールド名にアクセスするためのドット表記をサポートしています。以下の例では、親 Vehicle
の Model
フィールドにアクセスしています。
Vehicle.Model
リストの特定の要素にアクセスするには、角かっこ演算子を使用してゼロから始まる序数を指定します。以下の例では、序数 2
を使用して SecondaryOwners
の要素にアクセスしています。つまり、これはリストの 3 番目の要素です。
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 仕様