Amazon Simple Storage Service
開発者ガイド (API バージョン 2006-03-01)

SELECT コマンド

Amazon S3 Select および Glacier Select は、SELECT SQL コマンドのみをサポートします。次の ANSI スタンダードの句は、SELECT 用にサポートされています。

  • SELECT リスト

  • FROM

  • WHERE

  • LIMIT 句 (Amazon S3 Select のみ)

注記

Amazon S3 Select および Glacier Select クエリでは、現在サブクエリや結合はサポートされていません。

SELECT リスト

SELECT リストは、クエリに返させる列、関数、および式を指定します。このリストは、クエリの出力を表しています。

SELECT * SELECT projection [ AS column_alias | column_alias ] [, ...]

* (アスタリスク) を使用した最初の形式では、WHERE 句を通過したすべての行がそのまま返されます。2 番目の形式では、各列にユーザー定義の出力スカラー式 projection のある行が作成されます。

FROM 句

Amazon S3 Select および Glacier Select では、FROM 句の以下の形式がサポートされています。

FROM table_name FROM table_name alias FROM table_name AS alias

ここで、table_nameS3Object のいずれか (Amazon S3 Select の場合) または ARCHIVEOBJECT (Glacier Select の場合) となり、クエリ中のアーカイブを指しています。従来のリレーショナルデータベースから移行したユーザーは、これをテーブルに対する複数のビューを含むデータベーススキーマとして考えることができます。

スタンダード SQL に従って、FROM 句は WHERE 句でフィルタリングされ SELECT リストで射影される行を作成します。

Amazon S3 Select に格納されている JSON オブジェクトでは、次の形式の FROM 句も使用することができます。

FROM S3Object[*].path FROM S3Object[*].path alias FROM S3Object[*].path AS alias

この形式の FROM 句を使用すると、JSON オブジェクト内の配列またはオブジェクトから選択できます。以下のいずれかの形式で path を指定できます。

  • 名前 (オブジェクト内): .name または ['name']

  • インデックス (配列内): [index]

  • ワイルドカード (オブジェクト内): .*

  • ワイルドカード (配列内): [*]

注記

  • この形式の FROM 句は JSON オブジェクトに対してのみ機能します。

  • ワイルドカードは常に少なくとも 1 つのレコードを発行します。レコードが一致しない場合、Amazon S3 Select は値 MISSING を発行します。出力のシリアル化中 (クエリが完了した後)、Amazon S3 Select は MISSING 値を空のレコードに置き換えます。

  • 集約関数 (AVGCOUNTMAXMIN、および SUM) は、MISSING 値をスキップします。

  • エイリアスを指定せずにワイルドカードを使用する場合は、パスの最後の要素を使用して行を参照できます。たとえば、クエリ SELECT price FROM S3Object[*].books[*].price を使用して、ブックのリストからすべての価格を選択できます。パスが名前ではなくワイルドカードで終わる場合は、値 _1 を使用して行を参照できます。例えば、SELECT price FROM S3Object[*].books[*].price の代わりにクエリ SELECT _1.price FROM S3Object[*].books[*] を使用できます。

  • Amazon S3 Select は常に JSON ドキュメントをルートレベルの値の配列として扱います。したがって、クエリ対象の JSON オブジェクトにルート要素が 1 つしかない場合でも、FROM 句は S3Object[*] で始める必要があります。ただし、互換性の理由から、パスを含めない場合は、Amazon S3 Select ではワイルドカードを省略できます。そのため、完全な句 FROM S3Object は、FROM S3Object[*] as S3Object と同等です。パスを含める場合は、ワイルドカードも使用する必要があります。つまり、FROM S3Object および FROM S3Object[*].path は両方有効な句ですが、FROM S3Object.path は有効な句ではありません。

例:

例 #1

この例では、以下のデータセットとクエリを使用した結果を示しています。

{ "Rules": [ {"id": "id-1", "condition": "x < 20"}, {"condition": "y > x"}, {"id": "id-2", "condition": "z = DEBUG"} ] }, { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"id-1"}, {}, {"id":"id-2"}, {}

Amazon S3 Select は、以下の理由で次の結果を生成します。

  • {"id":"id-1"} – S3Object[0].Rules[0].id が一致を生成します。

  • {} – S3Object[0].Rules[1].id がレコードと一致しなかったため、Amazon S3 Select が MISSING を出力しました。これは、出力のシリアル化中に空のレコードに変更され返されます。

  • {"id":"id-2"} – S3Object[0].Rules[2].id が一致を生成します。

  • {} – S3Object[1] が Rules で一致しなかったため、Amazon S3 Select が MISSING を出力しました。これは、出力のシリアル化中に空のレコードに変更され返されます。

一致が見つからないときに Amazon S3 Select が空のレコードを返さないようにするには、MISSING という値をテストします。次のクエリは前のクエリと同じ結果を返しますが、空の値は省略されています。

SELECT id FROM S3Object[*].Rules[*].id WHERE id IS NOT MISSING
{"id":"id-1"}, {"id":"id-2"}

例 #2

この例では、以下のデータセットとクエリを使用した結果を示しています。

{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "AWS S3" }, { "created": "936864000", "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ], "owner": "User" }
SELECT d.dir_name, d.files FROM S3Object[*] d
{ "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ] }, { "dir_name": "other_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": "my stuff" }, { "name": "backup" } ] }
SELECT _1.dir_name, _1.owner FROM S3Object[*]
{ "dir_name": "important_docs", "owner": "AWS S3" }, { "dir_name": "other_docs", "owner": "User" }

WHERE 句

WHERE 句は、この構文に従います。

WHERE condition

WHERE 句は condition に基づいて行をフィルタリングします。condition は、ブール型の結果を持つ式です。condition の結果が TRUE である行のみが結果で返されます。

LIMIT 句 (Amazon S3 Select のみ)

LIMIT 句は、この構文に従います。

LIMIT number

LIMIT 句により、に基づいてクエリで返されるレコードの数を制限できます。

注記

Glacier Select は LIMIT 句をサポートしていません。

属性アクセス

SELECT および WHERE 句は、クエリ中のファイルが CSV 形式であるか JSON 形式にあるかによって、以下のセクションのいずれかのメソッドを使用してレコードデータを参照できます。

CSV

  • 列名 – 列名が _N である、行の N 番目の列を参照できます。N が列位置です。位置カウントは 1 から始まります。たとえば、最初の列名は _1 で、2 番目の列名は _2 です。

    列は _N または alias._N として参照できます。たとえば、_2myAlias._2 はどちらも SELECT リストおよび WHERE 句の列を参照するのに有効な方法です。

  • 列ヘッダー – ヘッダー行を持つ CSV 形式のオブジェクトの場合、ヘッダーは SELECT リストおよび WHERE 句で利用できます。特に、従来の SQL では、SELECT および WHERE 句の式内で、alias.column_name または column_name で列を参照できます。

JSON (Amazon S3 Select のみ)

  • ドキュメント – JSON ドキュメントのフィールドは alias.name としてアクセスできます。ネストされたフィールドにもアクセスできます (例: alias.name1.name2.name3)。

  • リスト[] 演算子で、ゼロベースのインデックスを使用して JSON リストの要素にアクセスできます。たとえば、リストの 2 番目の要素に alias[1] としてアクセスできます。リスト要素へのアクセスは、alias.name1.name2[1].name3 としてフィールドと結合できます。

  • 例: この JSON オブジェクトをサンプルデータセットとして考えます。

    {"name": "Susan Smith", "org": "engineering", "projects": [ {"project_name":"project1", "completed":false}, {"project_name":"project2", "completed":true} ] }

    例 #1

    以下のクエリは次の結果を返します。

    Select s.name from S3Object s
    {"name":"Susan Smith"}

    例 #2

    以下のクエリは次の結果を返します。

    Select s.projects[0].project_name from S3Object s
    {"project_name":"project1"}

ヘッダー/属性名の大文字と小文字の区別

Amazon S3 Select および Glacier Select では、二重引用符を使用して、列ヘッダー (CSV オブジェクトの場合) および属性 (JSON オブジェクトの場合) の大文字と小文字を区別することを指定できます。二重引用符がない場合、オブジェクトヘッダー/属性の大文字と小文字は区別されません。あいまいな場合はエラーがスローされます。

次の例は、1) 指定された列ヘッダーを持ち、クエリリクエストに対して FileHeaderInfo が「Use」に設定されている CSV 形式の Amazon S3 または Glacier オブジェクト、または 2) 指定された属性を持つ JSON 形式の Amazon S3 オブジェクトのいずれかです。

例 #1: クエリ中のオブジェクトには「NAME」というヘッダー/属性があります。

  • 次の式は、オブジェクトから正しく値を返します (引用符なし: 大文字と小文字を区別しない):

    SELECT s.name from S3Object s
  • 次の式は、400 エラー MissingHeaderName を返します (引用符あり: 大文字と小文字を区別する):

    SELECT s."name" from S3Object s

例 #2: クエリ中の Amazon S3 オブジェクトには「NAME」という 1 つのヘッダー/属性と、「name」という別のヘッダー/属性があります。

  • 次の式は 400 エラー AmbiguousFieldName を返します (引用符なし: 大文字と小文字を区別しないが、2 つの一致がある):

    SELECT s.name from S3Object s
  • 次の式は、オブジェクトから正しく値を返します (引用符あり: 大文字と小文字を区別するため、あいまいさを解決する)。

    SELECT s."NAME" from S3Object s

ユーザー定義の用語としての予約キーワードの使用

Amazon S3 Select および Glacier Select には、オブジェクトのコンテンツのクエリに使用される SQL 式を実行するために必要な予約キーワードのセットがあります。予約キーワードには、関数名、データ型、演算子などが含まれます。場合によっては、列ヘッダーのようなユーザー定義の用語 (CSV ファイルの場合) または属性 (JSON オブジェクトの場合) が、予約キーワードと競合する可能性があります。その場合は、二重引用符を使用して、予約キーワードと競合するユーザー定義の用語を意図的に使用していることを示す必要があります。そうしないと、400 解析エラーが発生します。

予約キーワードの詳細なリストについては、「予約キーワード」を参照してください。

次の例は、1) 指定された列ヘッダーを持ち、クエリリクエストに対して FileHeaderInfo が「Use」に設定されている CSV 形式の Amazon S3 または Glacier オブジェクト、または 2) 指定された属性を持つ JSON 形式の Amazon S3 オブジェクトのいずれかです。

例: クエリ中のオブジェクトに、予約キーワードである「CAST」いうヘッダー/属性があります。

  • 次の式は、オブジェクトから正しく値を返します (引用符あり: ユーザー定義のヘッダー/属性を使用する):

    SELECT s."CAST" from S3Object s
  • 次の式では、400 解析エラーが発生します (引用符なし: 予約キーワードと競合する):

    SELECT s.CAST from S3Object s

スカラー式

WHERE 句および SELECT リスト内では、スカラー値を返す式である SQL スカラー式を持つことができます。それには以下の形式があります。

  • literal

    SQL リテラル。

  • column_reference

    column_name または alias.column_name 形式の列の参照。

  • unary_op

    unary_op 単項は SQL 単項演算子です。

  • binary_op

    binary_op は SQL バイナリ演算子です。

  • func_name

    func_name は、呼び出すスカラー関数名です。

  • [ NOT ] BETWEEN AND

  • LIKE [ ESCAPE ]