SELECT コマンド
重要
新規のお客様への Amazon S3 Select の提供は終了しました。Amazon S3 Select をご利用の既存のお客様は、今後も通常どおり使用できます。詳細はこちら
Amazon S3 セレクトは、SELECT
SQL コマンドのみをサポートします。次の ANSI スタンダードの句は、SELECT
用にサポートされています。
-
SELECT
リスト -
FROM
句 -
WHERE
句 -
LIMIT
句
注記
Amazon S3 Select クエリは、現在サブクエリや結合はサポートしていません。
SELECT のリスト
SELECT
リストは、クエリに返させる列、関数、および式を指定します。このリストは、クエリの出力を表しています。
SELECT * SELECT
projection1
AScolumn_alias_1
,projection2
AScolumn_alias_2
*
(アスタリスク) を使用した最初の SELECT
形式では、WHERE
句を通過したすべての行がそのまま返されます。2 番目の SELECT
形式では、列ごとにユーザー定義の出力スカラー式
および projection1
を含む行が作成されます。projection2
FROM 句
Amazon S3 Select では、FROM
句の以下の形式がサポートされています。
FROM
table_name
FROMtable_name alias
FROMtable_name
ASalias
FROM
句の各形式で、table_name
はクエリの対象となる S3Object
です。従来のリレーショナルデータベースから移行したユーザーは、これをテーブルに対する複数のビューを含むデータベーススキーマとして考えることができます。
スタンダード SQL に従って、FROM
句は WHERE
句でフィルタリングされ SELECT
リストで射影される行を作成します。
Amazon S3 Select に格納されている JSON オブジェクトでは、次の形式の FROM
句も使用することができます。
FROM S3Object[*].
path
FROM S3Object[*].path alias
FROM S3Object[*].path
ASalias
この形式の FROM
句を使用すると、JSON オブジェクト内の配列またはオブジェクトから選択できます。以下のいずれかの形式で path
を指定できます。
-
名前 (オブジェクト内):
.
またはname
['
name
'] -
インデックス (配列内):
[
index
] -
ワイルドカード文字 (オブジェクト内):
.*
-
ワイルドカード文字 (配列内):
[*]
注記
-
この形式の
FROM
句は JSON オブジェクトに対してのみ機能します。 -
ワイルドカード文字は常に最低 1 つのレコードを発行します。レコードが一致しない場合、Amazon S3 Select は値
MISSING
を発行します。出力のシリアル化中 (クエリの実行の完了後)、Amazon S3 Select はMISSING
値を空のレコードに置き換えます。 -
集約関数 (
AVG
、COUNT
、MAX
、MIN
、および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": "1"}, {"expr": "y > x"}, {"id": "2", "expr": "z = DEBUG"} ]} { "created": "June 27", "modified": "July 6" }
SELECT id FROM S3Object[*].Rules[*].id
{"id":"1"} {} {"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":"1"} {"id":"2"}
例 2:
この例は、以下のデータセットとクエリを使用した場合の結果を示しています。
{ "created": "936864000", "dir_name": "important_docs", "files": [ { "name": "." }, { "name": ".." }, { "name": ".aws" }, { "name": "downloads" } ], "owner": "Amazon 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":"Amazon S3"} {"dir_name":"other_docs","owner":"User"}
WHERE 句
WHERE
句は、この構文に従います。
WHERE
condition
WHERE
句は
に基づいて行をフィルタリングします。condition は、ブール型の結果を持つ式です。condition の結果が condition
TRUE
である行のみが結果で返されます。
LIMIT 句
LIMIT
句は、この構文に従います。
LIMIT
number
LIMIT
句により、
に基づいてクエリで返されるレコードの数を制限できます。number
属性アクセス
SELECT
句および WHERE
句は、クエリ対象のファイルが CSV 形式であるか JSON 形式にあるかによって、以下のセクションのいずれかのメソッドを使用してレコードデータを参照できます。
CSV
-
列番号 – 行の N 番目の列を参照できます。
_
は列名、N
N
は列位置です。位置カウントは 1 から始まります。たとえば、最初の列名は_1
で、2 番目の列名は_2
です。列は
_
またはN
として参照できます。たとえば、alias
._N
_2
とmyAlias._2
はどちらもSELECT
リストおよびWHERE
句の列を参照するのに有効な方法です。 -
列ヘッダー – ヘッダー行を持つ CSV 形式のオブジェクトの場合、ヘッダーは
SELECT
リストおよびWHERE
句で利用できます。特に、従来の SQL では、SELECT
およびWHERE
句の式内で、
またはalias
.column_name
で列を参照できます。column_name
JSON
-
ドキュメント – 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 では、二重引用符を使用して、列ヘッダー (CSV オブジェクトの場合) および属性 (JSON オブジェクトの場合) の大文字と小文字を区別することを指定できます。二重引用符がない場合、オブジェクトヘッダーおよび属性の大文字と小文字は区別されません。あいまいな場合はエラーがスローされます。
以下の例は、1) 指定された列ヘッダーを持ち、クエリリクエストに対して FileHeaderInfo
が "Use"
に設定されている CSV 形式 の Amazon S3 オブジェクト、または 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 には、オブジェクトのコンテンツのクエリに使用する SQL 式を実行するために必要な予約キーワードのセットがあります。予約キーワードには、関数名、データ型、演算子などが含まれます。場合によっては、列ヘッダー (CSV ファイルの場合) や属性 (JSON オブジェクトの場合) などのユーザー定義の用語が、予約キーワードと競合する可能性があります。その場合は、二重引用符を使用して、予約キーワードと競合するユーザー定義の用語を意図的に使用していることを示す必要があります。そうしないと、400 解析エラーが発生します。
予約キーワードの詳細なリストについては、「予約済みキーワード」を参照してください。
次の例は、1) Amazon S3 オブジェクトが CSV 形式で、指定された列ヘッダーを持ち、クエリリクエストに対して FileHeaderInfo
が "Use"
に設定されているか、2) Amazon S3 オブジェクトが JSON 形式で、指定された属性を持っています。
例: クエリ対象のオブジェクトに、予約キーワードである CAST
という名前のヘッダーまたは属性があります。
-
次の式は、オブジェクトから値を正常に返します。クエリで引用符が使用されているため、S3 Select はユーザー定義のヘッダーまたは属性を使用します。
SELECT s."CAST" from S3Object s
-
次の式は 400 解析エラーを返します。クエリで引用符が使用されていないため、
CAST
は予約キーワードと競合します。SELECT s.CAST from S3Object s
スカラー式
WHERE
句および SELECT
リスト内では、スカラー値を返す式である SQL スカラー式を持つことができます。それには以下の形式があります。
-
literal
SQL リテラル。
-
column_reference
形式が
またはcolumn_name
である列への参照。alias
.column_name
-
unary_op
expression
この場合、
は SQL 単項演算子です。unary_op
-
expression
binary_op
expression
この場合、
は SQL 二項演算子です。binary_op
-
func_name
この場合、
は、呼び出すスカラー関数の名前です。func_name
-
expression
[ NOT ] BETWEEN
expression
AND
expression
-
expression
LIKE
[expression
ESCAPE
]expression