Amazon QLDB での PartiQL による Ion のクエリ - Amazon Quantum Ledger Database (Amazon QLDB)

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon QLDB での PartiQL による Ion のクエリ

Amazon QLDB でデータをクエリする場合、ステートメントは PartiQL 形式で記述されますが、結果は Amazon Ion で返されます。PartiQL は SQL と互換性を持つようになっていますが、Ion は JSON の拡張機能です。そのため、クエリステートメントでのデータの表記方法と、クエリ結果の表示方法に構文上の違いが生じます。

このセクションでは、QLDB コンソールまたは QLDB シェルを使用して PartiQL ステートメントを手動で実行するための基本的な構文とセマンティクスについて説明します。

ヒント

PartiQL クエリをプログラムで実行する場合、ベストプラクティスはパラメータ化されたステートメントを使用することです。ステートメントで疑問符 (?) をバインド変数プレースホルダーとして使用して、これらの構文ルールを回避できます。この方法は、よりセキュアで効率的でもあります。

詳細については、「ドライバーの開始方法」の以下のチュートリアルを参照してください。

構文とセマンティクス

QLDB コンソールまたは QLDB シェルを使用して Ion データをクエリする場合の、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 は、親構造のフィールド名にアクセスするためのドット表記をサポートしています。以下の例では、親 VehicleModel フィールドにアクセスしています。

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 仕様」を参照してください。