SQL 文を実行してオブジェクトに対する操作を実行し、実行結果を取得します。
使用上の注意
オブジェクトに対する読み取り権限が付与されている必要があります。
SQL 文が正しく実行された場合は、HTTP ステータスコード 206 が返されます。 SQL 文が無効であるか、既存のオブジェクトと一致しない場合は、HTTP ステータスコード 400 が返されます。
SelectObject 操作の呼び出し時にスキャンされるオブジェクトのサイズに基づいて課金されます。 詳細については、「データ処理料金」をご参照ください。
リクエスト構文
この操作では、CSV オブジェクトと JSON オブジェクトに対して次のリクエスト構文をサポートしています。
CSV オブジェクトのリクエスト構文
POST /object?x-oss-process=csv/select HTTP/1.1 HOST: BucketName.oss-cn-hangzhou.aliyuncs.com Date: time GMT Content-Length: ContentLength Content-MD5: MD5Value Authorization: Signature <?xml version="1.0" encoding="UTF-8"?> <SelectRequest> <Expression>Base64-encoded SQL statement. Example: c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU=</Expression> <InputSerialization> <CompressionType>None|GZIP</CompressionType> <CSV> <FileHeaderInfo> NONE|IGNORE|USE </FileHeaderInfo> <RecordDelimiter>Base64-encoded character</RecordDelimiter> <FieldDelimiter>Base64-encoded character</FieldDelimiter> <QuoteCharacter>Base64-encoded character</QuoteCharacter> <CommentCharacter>Base64-encoded character</CommentCharacter> <Range>line-range=start-end|split-range=start-end</Range> <AllowQuotedRecordDelimiter>true|false</AllowQuotedRecordDelimiter> </CSV> </InputSerialization> <OutputSerialization> <CSV> <RecordDelimiter>Base64-encoded character</RecordDelimiter> <FieldDelimiter>Base64-encoded character</FieldDelimiter> </CSV> <KeepAllColumns>false|true</KeepAllColumns> <OutputRawData>false|true</OutputRawData> <EnablePayloadCrc>true</EnablePayloadCrc> <OutputHeader>false</OutputHeader> </OutputSerialization> <Options> <SkipPartialDataRecord>false</SkipPartialDataRecord> <MaxSkippedRecordsAllowed> max allowed number of records skipped // スキップが許可されているレコードの最大数 </MaxSkippedRecordsAllowed> </Options> </SelectRequest>JSON オブジェクトのリクエスト構文
POST /object?x-oss-process=json/select HTTP/1.1 HOST: BucketName.oss-cn-hangzhou.aliyuncs.com Date: time GMT Content-Length: ContentLength Content-MD5: MD5Value Authorization: Signature <?xml version="1.0" encoding="UTF-8"?> <SelectRequest> <Expression> Base64-encoded SQL statement. Example: c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU= // Base64 エンコードされた SQL 文。例: c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU= </Expression> <InputSerialization> <CompressionType>None|GZIP</CompressionType> <JSON> <Type>DOCUMENT|LINES</Type> <Range> line-range=start-end|split-range=start-end // line-range=start-end|split-range=start-end </Range> <ParseJsonNumberAsString> true|false // true|false </ParseJsonNumberAsString> </JSON> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter> Base64 of record delimiter // レコード区切り文字の Base64 </RecordDelimiter> </JSON> <OutputRawData>false|true</OutputRawData> <EnablePayloadCrc>true</EnablePayloadCrc> </OutputSerialization> <Options> <SkipPartialDataRecord> false|true // false|true </SkipPartialDataRecord> <MaxSkippedRecordsAllowed> max allowed number of records skipped // スキップが許可されているレコードの最大数 </MaxSkippedRecordsAllowed> </Options> </SelectRequest>
リクエスト要素
要素 | タイプ | 説明 |
SelectRequest | コンテナー | SelectObject リクエストを格納するコンテナー。 子ノード: Expression、InputSerialization、OutputSerialization 親ノード: なし |
Expression | 文字列 | Base64 エンコードされた SQL 文。 子ノード: なし 親ノード: SelectRequest |
InputSerialization | コンテナー | オプション。この要素は、入力シリアル化パラメーターを指定します。 子ノード: CompressionType、CSV、JSON 親ノード: SelectRequest |
OutputSerialization | コンテナー | オプション。この要素は、出力シリアル化パラメーターを指定します。 子ノード: CSV、JSON、OutputRawData 親ノード: SelectRequest |
CSV(InputSerialization) | コンテナー | オプション。この要素は、CSV オブジェクトがクエリされる際の入力シリアル化パラメーターを指定します。 子ノード: FileHeaderInfo、RecordDelimiter、FieldDelimiter、QuoteCharacter、CommentCharacter、Range 親ノード: InputSerialization |
CSV(OutputSerialization) | コンテナー | オプション。この要素は、CSV オブジェクトがクエリされる際の出力シリアル化パラメーターを指定します。 子ノード: RecordDelimiter、FieldDelimiter 親ノード: OutputSerialization |
JSON(InputSerialization) | コンテナー | 子ノード: Type、Range、ParseJsonNumberAsString 親ノード: InputSerialization |
JSON(OutputSerialization) | コンテナー | 子ノード: RecordDelimiter 親ノード: OutputSerialization |
Type | 列挙型 | 親ノード: JSON (入力) |
OutputRawData | ブール値 | オプション。この要素は、生データをエクスポートするかどうかを指定します。デフォルト値: false。 子ノード: なし 親ノード: OutputSerialization 説明
|
CompressionType | 列挙型 | オブジェクトの圧縮タイプ。有効な値: None と GZIP。 子ノード: なし 親ノード: InputSerialization |
FileHeaderInfo | 列挙型 | オプション。この要素は、CSV オブジェクトに関するヘッダー情報を指定します。 有効な値:
子ノード: なし 親ノード: CSV (入力) |
RecordDelimiter | 文字列 | オプション。この要素は、Base64 エンコードされた改行を指定します。デフォルト値: 子ノード: なし 親ノード: CSV (入力と出力) と JSON (出力) |
FieldDelimiter | 文字列 | オプション。この要素は、CSV オブジェクトの列を区切るために使用する区切り文字を指定します。この要素の値は Base64 エンコードされている必要があります。デフォルト値: 子ノード: なし 親ノード: CSV (入力と出力) |
QuoteCharacter | 文字列 | オプション。この要素は、CSV オブジェクトで使用する Base64 エンコードされた引用符を指定します。デフォルト値: 子ノード: なし 親ノード: CSV (入力) |
CommentCharacter | 文字列 | 親ノード: CSV (入力) |
Range | 文字列 | オプション。この要素は、クエリ範囲を指定します。次のクエリメソッドがサポートされています。 説明 Range に基づいてクエリされるオブジェクトには、SelectMeta を作成する必要があります。
start パラメーターと end パラメーターは包含的です。上記の 2 つのパラメーターは、range get の range パラメーターと同じフォーマットを使用します。 このパラメーターは、オブジェクトが CSV フォーマットである場合、または JSON タイプが LINES である場合にのみ使用できます。 子ノード: なし 親ノード: CSV (入力) と JSON (出力) |
KeepAllColumns | bool | オプション。この要素は、CSV オブジェクトのすべての列をレスポンスに含めるかどうかを指定します。デフォルト値: false。SELECT 句に含まれる列のみが値を含みます。レスポンスの列は、列番号の昇順にソートされます。例:
KeepAllColumns を true に設定し、CSV オブジェクトに 6 つの列が含まれている場合、上記の SELECT 句に対して次の結果が返されます。 1 列目の値,,,,5 列目の値,\n 子ノード: なし 親ノード: OutputSerialization (CSV) |
EnablePayloadCrc | bool | 各フレームの検証のための CRC-32 値。クライアントは各ペイロードの CRC-32 値を計算し、含まれている CRC-32 値と比較してデータの整合性を検証できます。 子ノード: なし 親ノード: OutputSerialization |
Options | コンテナー | その他のオプションパラメーター。 子ノード: SkipPartialDataRecord と MaxSkippedRecordsAllowed 親ノード: SelectRequest |
OutputHeader | bool | CSV オブジェクトに関するヘッダー情報をレスポンスの先頭に含めるかどうかを指定します。 デフォルト値: false。 子ノード: なし 親ノード: OutputSerialization |
SkipPartialDataRecord | bool | データが欠落している行を無視するかどうかを指定します。このパラメーターを false に設定すると、OSS はエラーを報告せずに欠落している列の値を null として処理して、SQL 文の式を計算します。このパラメーターを true に設定すると、データを含まない行はスキップされます。スキップされた行の数がスキップできる最大行数を超えた場合、OSS はエラーを報告し、データの処理を停止します。 デフォルト値: false。 子ノード: なし 親ノード: Options |
MaxSkippedRecordsAllowed | Int | スキップできる行の最大数。行が SQL 文で指定されたタイプと一致しない場合、または行の 1 つ以上の列が欠落していて SkipPartialDataRecord の値が true の場合、行はスキップされます。スキップされた行の数がこのパラメーターの値を超えた場合、OSS はエラーを報告し、データの処理を停止します。 説明 CSV オブジェクトの行のフォーマットが正しくない場合、このフォーマットエラーにより CSV オブジェクトの解析が正しく行われない可能性があるため、OSS はデータの処理を停止し、エラーを報告します。たとえば、行の列に連続した奇数個の引用符が含まれている場合などです。このパラメーターを使用して、不規則なデータに対する許容範囲を変更できますが、無効な CSV オブジェクトに対して設定することはできません。 デフォルト値: 0。 子ノード: なし 親ノード: Options |
ParseJsonNumberAsString | bool | JSON オブジェクトの整数と浮動小数点数を文字列として解析するかどうかを指定します。JSON オブジェクトの浮動小数点数の精度は、数値が解析されると低下します。生データを保持したい場合は、このパラメーターを true に設定することをお勧めします。解析された数値を計算で使用するには、SQL の CAST 関数を使用して、解析されたデータを INT、DOUBLE、DECIMAL などの必要なタイプに変換できます。 デフォルト値: false。 子ノード: なし 親ノード: JSON |
AllowQuotedRecordDelimiter | bool | CSV オブジェクトに引用符 (") で囲まれた改行を含めることができるかどうかを指定します。 たとえば、列の値が "abc\ndef" で、\n が改行である場合、このパラメーターを true に設定します。このパラメーターを false に設定すると、SelectObject 操作を呼び出してリクエストヘッダーで範囲を指定し、より効率的なマルチパートクエリを実行できます。 デフォルト値: true。 子ノード: なし 親ノード: InputSerialization |
レスポンス本文
レスポンスに含まれる HTTP ステータスコードが 4xx の場合、リクエストは SQL 構文チェックに合格しなかったか、リクエストにエラーが含まれています。この場合、返されるエラーメッセージの本文のフォーマットは、GetObject リクエストで返されるエラーメッセージと同じです。
レスポンスに含まれる HTTP ステータスコードが 5xx の場合、内部サーバーエラーが発生しています。この場合、返されるエラーメッセージの本文のフォーマットは、GetObject リクエストで返されるエラーメッセージと同じです。
操作が成功した場合、HTTP ステータスコード 206 が返されます。
ヘッダー x-oss-select-output-raw の値が true の場合、フレームベースのデータを除くオブジェクトデータが返されます。クライアントは、GetObject 操作と同じ方法でデータを取得できます。
x-oss-select-output-raw の値が false の場合、結果はフレームとして返されます。
フレームは、
Version|Frame-Type | Payload Length | Header Checksum | Payload | Payload Checksum<1 byte><--3 bytes--><---4 bytes----><-------4 bytes--><variable><----4bytes---------->フォーマットで返されます。説明フレームの Checksum の値は CRC-32 です。フレーム内のすべての整数はビッグエンディアンです。現在、Version の値は 1 です。
フレームタイプ
次の表は、SelectObject でサポートされている 3 つのフレームタイプについて説明しています。
フレームタイプ | 値 | ペイロードフォーマット | 説明 |
データフレーム | 8388609 | offset | data<-8 bytes><---variable-> | SelectObject リクエストに対して返されるデータ。offset パラメーターの値は、現在のスキャン位置 (ファイルヘッダーからのオフセット) を示す 8 ビット整数です。このパラメーターは、操作の進捗状況を報告するために使用されます。 |
連続フレーム | 8388612 | offset<----8 bytes--> | 操作の進捗状況を報告し、HTTP 接続を維持するために使用されるフレーム。クエリリクエストに対して 5 秒以内にデータが返されない場合、連続フレームが返されます。 |
終了フレーム | 8388613 | offset | total scanned bytes | http status code | error message<--8bytes-><--8bytes---------><----4 bytes--------><-variable------> | 終了フレームは、スキャンされたバイト数や発生した可能性のあるエラーメッセージなど、操作の最終状態を返すために使用されます。
|
サンプルリクエスト
次のサンプルリクエストは、CSV オブジェクトと JSON オブジェクトに対して SelectObject を呼び出すために使用されます。
CSV オブジェクトのサンプルリクエスト
POST /oss-select/bigcsv_normal.csv?x-oss-process=csv%2Fselect HTTP/1.1 Date: Fri, 25 May 2018 22:11:39 GMT Content-Type: Authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e User-Agent: aliyun-sdk-dotnet/2.8.0.0(windows 16.7/16.7.0.0/x86;4.0.30319.42000) Content-Length: 748 Expect: 100-continue Connection: keep-alive Host: host name <?xml version="1.0"?> <SelectRequest> <Expression>c2VsZWN0IGNvdW50KCopIGZyb20gb3Nzb2JqZWN0IHdoZXJlIF80ID4gNDU= </Expression> <InputSerialization> <Compression>None</Compression> <CSV> <FileHeaderInfo>Ignore</FileHeaderInfo> <RecordDelimiter>Cg==</RecordDelimiter> <FieldDelimiter>LA==</FieldDelimiter> <QuoteCharacter>Ig==</QuoteCharacter> <CommentCharacter>Iw==</CommentCharacter/> </CSV> </InputSerialization> <OutputSerialization> <CSV> <RecordDelimiter>Cg==</RecordDelimiter> <FieldDelimiter>LA==</FieldDelimiter> <QuoteCharacter>Ig==</QuoteCharacter> </CSV> <KeepAllColumns>false</KeepAllColumns> <OutputRawData>false</OutputRawData> </OutputSerialization> </SelectRequest>JSON オブジェクトのサンプルリクエスト
POST /oss-select/sample_json.json?x-oss-process=json%2Fselect HTTP/1.1 Host: host name Accept-Encoding: identity User-Agent: aliyun-sdk-python/2.6.0(Darwin/16.7.0/x86_64;3.5.4) Accept: */* Connection: keep-alive date: Mon, 10 Dec 2018 18:28:11 GMT authorization: OSS4-HMAC-SHA256 Credential=LTAI********************/20250417/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=content-length,Signature=a7c3554c729d71929e0b84489addee6b2e8d5cb48595adfc51868c299c0c218e Content-Length: 317 <SelectRequest> <Expression>c2VsZWN0ICogZnJvbSBvc3NvYmplY3Qub2JqZWN0c1sqXSB3aGVyZSBwYXJ0eSA9ICdEZW1vY3JhdCc= </Expression> <InputSerialization> <JSON> <Type>DOCUMENT</Type> </JSON> </InputSerialization> <OutputSerialization> <JSON> <RecordDelimiter>LA==</RecordDelimiter> </JSON> </OutputSerialization> <Options /> </SelectRequest>
SQL 文の正規表現
この例では、SELECT select-list from table where_opt limit_opt は SQL 文の正規表現を示しています。
次のキーワードは変更できません: SELECT と where。
select_list: column name // 列名
| column index (Example: _1, _2. column index applies only to CSV objects.) // 列インデックス (例: _1, _2。列インデックスは CSV オブジェクトにのみ適用されます。)
| json path (Example: s.contacts.firstname. json path applies only to JSON objects.) // json パス (例: s.contacts.firstname。json パスは JSON オブジェクトにのみ適用されます。)
| function(column index | column name) // 関数 (列インデックス | 列名)
| function(json_path) (applies only to JSON objects.) // 関数 (json_path) (JSON オブジェクトにのみ適用されます。)
| select_list AS alias // select_list AS エイリアス次の関数がサポートされています: AVG、SUM、MAX、MIN、COUNT、CAST (型変換関数)。COUNT の後にはアスタリスク (*) のみ指定できます。
table: OSSOBJECT // OSSOBJECT
| OSSOBJECT json_path (applies only to JSON objects.) // OSSOBJECT json_path (JSON オブジェクトにのみ適用されます。)
If you want to perform operations on CSV objects, you must use the OSSOBJECT table. If you want to perform operations on JSON objects including DOCUMENT and LINES type objects, you can specify json_path after OSSOBJECT. // CSV オブジェクトに対して操作を実行する場合は、OSSOBJECT テーブルを使用する必要があります。DOCUMENT タイプと LINES タイプのオブジェクトを含む JSON オブジェクトに対して操作を実行する場合は、OSSOBJECT の後に json_path を指定できます。
json_path: ['string '] (The quotation marks that are used to enclose a string can be deleted if the string does not include a space or an asterisk (*). In this case, ['string '] is equivalent to .'string '.) // ['string '] (文字列を囲む引用符は、文字列にスペースまたはアスタリスク (*) が含まれていない場合は削除できます。この場合、['string '] は .'string ' と同等です。)
| [n] (indicates the nth element in an array. The value of n is counted from 0.) // [n] (配列の n 番目の要素を示します。n の値は 0 からカウントされます。)
| [*] (indicates a child element in an array or object.) // [*] (配列またはオブジェクトの子要素を示します。)
| .'string ' (The quotation marks that are used to enclose a string can be deleted if the string does not include a space or an asterisk (*).) // .'string ' (文字列を囲む引用符は、文字列にスペースまたはアスタリスク (*) が含まれていない場合は削除できます。)
| json_path jsonpath (You can concatenate multiple elements in a json path such as [n].property1.attributes[*].) // json_path jsonpath ([n].property1.attributes[*] などの json パスの複数の要素を連結できます。)Where_opt:
| WHERE expr
expr:
| literal value // リテラル値
| column name // 列名
| column index // 列インデックス
| json path (applies only to JSON objects.) // json パス (JSON オブジェクトにのみ適用されます。)
| expr op expr
| expr OR expr
| expr AND expr
| expr IS NULL
| expr IS NOT NULL
| (column name | column index | json path) IN (value1, value2, ...) // (列名 | 列インデックス | json パス) IN (value1, value2, ...)
| (column name | column index | json path) NOT in (value1, value2, ...) // (列名 | 列インデックス | json パス) NOT in (value1, value2, ...)
| (column name | column index | json path) between value1 and value2 // (列名 | 列インデックス | json パス) between value1 and value2
| NOT (expr)
| expr op expr
| (expr)
| cast (column index |column name | json path | literal as INT|DOUBLE|) // cast (列インデックス | 列名 | json パス | リテラル as INT|DOUBLE|)op: 次の演算子を含みます:
>、<、>=、<=、! =、=、,、LIKE、+、-、*、/、%、||。cast: CAST 関数を使用して、列のデータをあるタイプから別のタイプに変換できます。
集約関数と limit の組み合わせ:
Select avg(cast(_1 as int)) from ossobject limit 100。上記の文は、最初の 100 行の最初の列の平均値を計算します。SelectObject 操作では集約関数に対して 1 行のみが返されるため、この関数は MySQL でサポートされている文とは異なります。したがって、出力データサイズには制限が設定されていません。SelectObject を呼び出すと、集約操作の前に limit 操作が実行されます。
SQL 文の制限
SQL 文には次の制限が適用されます。
UTF-8 でエンコードされたテキストオブジェクトと、GZIP 形式で圧縮された UTF-8 テキストオブジェクトのみがサポートされています。GZIP オブジェクトの deflate 形式はサポートされていません。
SQL 文を使用する場合、クエリできるオブジェクトは 1 つだけです。次の句はサポートされていません: JOIN、ORDER BY、GROUP BY、HAVING。
WHERE 句に集約条件を含めることはできません。たとえば、WHERE max(cast(age as int)) > 100 などの句は許可されていません。
SQL 文には最大 1,000 列を指定できます。SQL 文の列名は最大 1,024 バイトの長さにすることができます。
LIKE 句では最大 5 つのワイルドカード (%) がサポートされています。パーセント記号 (%) とアスタリスク (*) は、ゼロ個以上の文字を示すワイルドカードです。SQL LIKE 句では ESCAPE キーワードがサポートされており、パーセント記号 (%)、アスタリスク (*)、疑問符 (?) などの特殊文字を通常の文字列に変換するために使用されます。
IN 句では最大 1,024 の定数がサポートされています。
SELECT の後に指定される Projection は、列名、CSV 列インデックス (_1 や _2 など)、集約関数、または CAST 関数にすることができます。select _1 + _2 from ossobject など、その他の式はサポートされていません。
CSV オブジェクトの最大列サイズと最大行サイズは 256 KB です。
FROM の後に指定される JSON パスは、最大サイズが 512 KB の JSON ノードをサポートします。パスには最大 10 レベルを含めることができ、配列には最大 5,000 要素を含めることができます。SELECT と WHERE の後に指定されるフィールドは、FROM の後に指定される JSON パスに対応するノードからのものである必要があります。
JSON オブジェクトの SQL 文では、SELECT 式または WHERE 式に配列ワイルドカード ([*]) を含めることはできません。配列ワイルドカード ([*]) は、FROM の後に指定される JSON パスにのみ含めることができます。たとえば、select s.contacts[*] from ossobject s ではなく、select * from ossobject.contacts[*] を使用できます。
SQL 文の最大サイズは 16 KB です。WHERE の後には最大 20 の式を追加できます。各文は最大 10 レベルと 100 の集約操作をサポートします。
データエラー処理
次のセクションでは、データエラーの処理に使用される一般的な方法について説明します。
CSV オブジェクトの一部の行に一部の列が欠落している。
SkipPartialDataRecord が指定されていないか、false に設定されている場合、OSS は欠落している列の値を null として処理することにより、SQL 文の式を計算します。
SkipPartialDataRecord が true に設定されている場合、OSS は一部の列が欠落している行を無視します。この場合、MaxSkippedRecordsAllowed が指定されていないか、スキップされた行の数よりも小さい値に設定されている場合、OSS は HTTP ステータスコード 400 を送信するか、終了フレームに HTTP ステータスコード 400 を含めることによってエラーを報告します。
SQL 文
select _1, _3 from ossobjectが実行され、CSV オブジェクトの行のデータが "John, Company A" であるとします。SkipPartialDataRecord が false に設定されている場合、"John,\n" が返されます。
SkipPartialDataRecord が true に設定されている場合、この行はスキップされます。
JSON オブジェクトに一部のキーが欠落している。
一部の JSON オブジェクトは、SQL 文で指定されたキーを除外する場合があります。
SkipPartialDataRecord が指定されていないか、false に設定されている場合、OSS は欠落しているキーを null として処理することにより、SQL 文の式を計算します。
SkipPartialDataRecord が true に設定されている場合、OSS は JSON ノードのデータをスキップします。この場合、MaxSkippedRecordsAllowed が指定されていないか、スキップされた行の数よりも小さい値に設定されている場合、OSS は HTTP ステータスコード 400 を送信するか、終了フレームに HTTP ステータスコード 400 を含めることによってエラーを報告します。
SQL 文
select s.firstName, s.lastName , s.age from ossobject.contacts[*] sが実行され、JSON ノードの値が {"firstName":"John", "lastName":"Smith"} であるとします。SkipPartialDataRecord が指定されていないか、false に設定されている場合、{"firstName":"John", "lastName":"Smith"} が返されます。
SkipPartialDataRecord が true に設定されている場合、この行はスキップされます。
説明JSON オブジェクトのリクエストで返されるデータのキーについては、出力 JSON オブジェクトは LINES のみ可能です。出力の Key 値は、次のルールに基づいて返されます。
SQL 文
select * from ossobject…が実行されるとします。* が JSON オブジェクト ({...}) に対応する場合、JSON オブジェクトが返されます。* が文字列または配列に対応する場合、文字列または配列は DummyKey _1 として返されます。select * from ossobject.Age s where s = 5が使用され、{"Age":5} が使用されている場合、* に対応する値 5 は JSON オブジェクトではないため、{"_1":5} が返されます。SQL 文select * from ossobject s where s.Age = 5が実行されると、* に対応する {"Age":5} が返されます。SQL 文で select * を使用せず、列を指定する場合、返されるコンテンツは
{"{Column 1}": Value, "{Column 2}": Value...}形式になります。{Column n} は、次の方法で生成できます。SELECT 句で列のエイリアスが指定されている場合、エイリアスが有効になります。
列名が JSON オブジェクトのキーである場合、このキーが出力キー値として使用されます。
列が JSON 配列の要素または集約関数である場合、列名の前にシリアル番号 (1 から始まる) とアンダースコア (_) を付けて出力キー値とします。
{"contacts":{"Age":35, "Children":["child1", "child2", "child3"]}} が使用されているとします。
SQL 文
select s.contacts.Age, s.contacts.Children[0] from ossobjectsが実行されると、Age は入力 JSON オブジェクトのキーになり、Children[0] は Children 配列の最初の要素を示し、出力コンテンツの 2 番目の列になります。この場合、{"Age":35, "_2":"child1"} が返されます。SQL 文
select max(cast(s.Age as int)) from ossobject.contacts sが実行され、選択された列が集約関数である場合、列には出力で _1 とそのシリアル番号がプレフィックスとして付けられます。この場合、{"_1":35} が返されます。SQL 文
select s.contacts.Age, s.contacts.Children[0] as firstChild from ossobjectで列のエイリアスが指定されている場合、{"Age":35, "firstChild":"child1"} が返されます。
JSON オブジェクトと SQL 文に一致するキーは大文字と小文字が区別されます。たとえば、"select s. Age" と "select s. age" は異なります。
CSV オブジェクトの一部の列のデータ型が、SQL 文で指定されたデータ型と一致しない。
CSV オブジェクトの行のデータ型が SQL 文で指定された型と一致しない場合、行はスキップされます。スキップされた行の数が MaxSkippedRecordsAllowed の値を超えると、OSS はデータの処理を停止し、HTTP ステータスコード 400 を返します。
SQL 文
select _1, _3 from ossobject where _3 > 5が実行されるとします。CSV オブジェクトの行の値がJohn, Company A, To be hiredの場合、行の 3 番目の列は整数型ではないため、この行はスキップされます。JSON オブジェクトに一部のキーのデータ型が、SQL 文で指定されたデータ型と一致しない。
SQL 文
select s.name from ossobject s where s.aliren_age > 5が実行されるとします。JSON ノードの値が{"Name":"John", "Career_age": To be hired}の場合、このノードはスキップされます。
サポートされている時間形式
次の表に、時間形式を指定せずにタイムスタンプに変換できる形式を示します。たとえば、cast('20121201' as timestamp) 文字列は、2012 年 12 月 1 日のタイムスタンプとして自動的に解析されます。
形式 | 説明 |
YYYYMMDD | 年 月 日 |
YYYY/MM/DD | 年/月/日 |
DD/MM/YYYY/ | 日/月/年 |
YYYY-MM-DD | 年-月-日 |
DD-MM-YY | 日-月-年 |
DD.MM.YY | 日. 月. 年 |
HH:MM:SS.mss | 時:分:秒. ミリ秒 |
HH:MM:SS | 時:分:秒 |
HH MM SS mss | 時 分 秒 ミリ秒 |
HH.MM.SS.mss | 時. 分. 秒. ミリ秒 |
HHMM | 時 分 |
HHMMSSmss | 時 分 秒 ミリ秒 |
YYYYMMDD HH:MM:SS.mss | 年 月 日 時:分:秒. ミリ秒 |
YYYY/MM/DD HH:MM:SS.mss | 年/月/日 時:分:秒. ミリ秒 |
DD/MM/YYYY HH:MM:SS.mss | 日/月/年 時:分:秒. ミリ秒 |
YYYYMMDD HH:MM:SS | 年 月 日 時:分:秒 |
YYYY/MM/DD HH:MM:SS | 年/月/日 時:分:秒 |
DD/MM/YYYY HH:MM:SS | 日/月/年 時:分:秒 |
YYYY-MM-DD HH:MM:SS.mss | 年-月-日 時:分:秒. ミリ秒 |
DD-MM-YYYY HH:MM:SS.mss | 日-月-年 時:分:秒. ミリ秒 |
YYYY-MM-DD HH:MM:SS | 年-月-日 時:分:秒 |
YYYYMMDDTHH:MM:SS | 年 月 日 T 時:分:秒 |
YYYYMMDDTHH:MM:SS.mss | 年 月 日 T 時:分:秒. ミリ秒 |
DD-MM-YYYYTHH:MM:SS.mss | 日-月-年 T 時:分:秒. ミリ秒 |
DD-MM-YYYYTHH:MM:SS | 日-月-年 T 時:分:秒 |
YYYYMMDDTHHMM | 年 月 日 T 時 分 |
YYYYMMDDTHHMMSS | 年 月 日 T 時 分 秒 |
YYYYMMDDTHHMMSSMSS | 年 月 日 T 時 分 秒 ミリ秒 |
ISO8601-0 | 年-月-日 T 時:分+時:分、または 年-月-日 T 時:分-時:分 "+" は、現在のタイムゾーンの現地時間が標準 UTC 時間よりも遅いことを示します。"-" は、現在のタイムゾーンの現地時間が標準 UTC 時間よりも早いことを示します。この形式では、ISO8601-0 を使用できます。 |
ISO8601-1 | 年-月-日 T 時:分+時:分、または 年-月-日 T 時:分-時:分 "+" は、現在のタイムゾーンの現地時間が標準 UTC 時間よりも遅いことを示します。"-" は、現在のタイムゾーンの現地時間が標準 UTC 時間よりも早いことを示します。この形式では、ISO8601-1 を使用できます。 |
CommonLog | 例: 28/Feb/2017:12:30:51 +0700 |
RFC822 | 例: Tue, 28 Feb 2017 12:30:51 GMT |
?D/?M/YY | 日/月/年。日と月は 1 桁または 2 桁にすることができます。 |
?D/?M/YY ?H:?M | 日/月/年/時:分。日、月、時、分は 1 桁または 2 桁にすることができます。 |
?D/?M/YY ?H:?M:?S | 日/月/年/時:分:秒。日、月、時、分、秒は 1 桁または 2 桁にすることができます。 |
次の表に、エラーが発生する可能性のある形式を示します。これらの形式の文字列を使用する場合は、時間形式を指定する必要があります。たとえば、cast('20121201' as timestamp format 'YYYYDDMM') ステートメントは、文字列 20121201 を 2012 年 1 月 12 日として誤って解析します。
形式 | 説明 |
YYYYDDMM | 年 日 月 |
YYYY/DD/MM | 年/日/月 |
MM/DD/YYYY | 月/日/年 |
YYYY-DD-MM | 年-日-月 |
MM-DD-YYYY | 月-日-年 |
MM.DD.YYYY | 月. 日. 年 |
エラーコード
SelectObject は、次の方法でエラーコードを返します。
HTTP ステータスコードがレスポンスヘッダーに含まれ、エラーコードがレスポンス本文に含まれます。これは他の OSS リクエストと同じです。この方法で返されるエラーコードは、無効な SQL 文やデータエラーなどの入力エラーが発生したことを示します。
エラーコードがレスポンス本文の終了フレームに含まれます。この方法で返されるエラーコードは、データが正しくないか、SQL 文で指定されたデータ型と一致しないことを示します。たとえば、SQL 文で型が整数に設定されている列に文字列が存在する場合などです。この場合、データの一部が処理され、HTTP ステータスコード 206 と処理されたデータがクライアントに送信されます。
InvalidCSVLine などのエラーコードは、CSV オブジェクト内のエラー行の位置に基づいて、レスポンスヘッダーの HTTP ステータスコードとして、または終了フレームのステータスコードとして返すことができます。
エラーコード | 説明 | HTTP ステータスコード | 終了フレームの HTTP ステータスコード |
InvalidSqlParameter | 指定された SQL パラメーターが存在しないため返されるエラーメッセージ。 リクエストの SQL 文が null であるか、SQL 文のサイズが上限を超えているか、SQL 文が Base64 エンコードされていません。 | 400 | なし |
InvalidInputFieldDelimiter | 入力 CSV オブジェクトに無効な列区切り文字が含まれているため返されるエラーメッセージ。 パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 1 バイトを超えています。 | 400 | なし |
InvalidInputRecordDelimiter | 入力 CSV オブジェクトに無効な行区切り文字が含まれているため返されるエラーメッセージ。パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 2 バイトを超えています。 | 400 | なし |
InvalidInputQuote | 入力 CSV オブジェクトに無効な引用符が含まれているため返されるエラーメッセージ。パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 1 バイトを超えています。 | 400 | なし |
InvalidOutputFieldDelimiter | 出力 CSV オブジェクトに無効な列区切り文字が含まれているため返されるエラーメッセージ。パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 1 バイトを超えています。 | 400 | なし |
InvalidOutputRecordDelimiter | 出力 CSV オブジェクトに無効な行区切り文字が含まれているため返されるエラーメッセージ。パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 2 バイトを超えています。 | 400 | なし |
UnsupportedCompressionFormat | Compression パラメーターの値が NONE または GZIP ではないため返されるエラーメッセージ。値は大文字と小文字が区別されません。 | 400 | なし |
InvalidCommentCharacter | CSV オブジェクトに無効なコメント文字が含まれているため返されるエラーメッセージ。パラメーターが Base64 エンコードされていないか、パラメーターがデコードされた後のパラメーターのサイズが 1 バイトを超えています。 | 400 | なし |
InvalidRange | Range パラメーターに line-range= または split-range= がプレフィックスとして付いていないか、範囲値が Range の HTTP 標準に準拠していないため返されるエラーメッセージ。 | 400 | なし |
DecompressFailure | Compression の値が GZIP で、オブジェクトを解凍できないため返されるエラーメッセージ。 | 400 | なし |
InvalidMaxSkippedRecordsAllowed | MaxSkippedRecordsAllowed の値が整数ではないため返されるエラーメッセージ。 | 400 | なし |
SelectCsvMetaUnavailable | Range パラメーターが指定されているときに、オブジェクトに CSV Meta が含まれていないため返されるエラーメッセージ。最初に CreateSelectObjectMeta 操作を呼び出してください。 | 400 | なし |
InvalidTextEncoding | オブジェクトが UTF-8 エンコードされていないため返されるエラーメッセージ。 | 400 | なし |
InvalidOSSSelectParameters | EnablePayloadCrc パラメーターと OutputRawData パラメーターが true に設定されているため返されるエラーメッセージ。これにより競合が発生します。 | 400 | なし |
InternalError | OSS システムエラーが発生したため返されるエラーメッセージ。 | 500 または 206 | 500 またはなし |
SqlSyntaxError | Base64 デコードされた SQL 文の構文が無効であるため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxInCount | SQL IN 句に含まれる値の数が 1,024 を超えているため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxColumnNameLength | 列名のサイズが 1,024 バイトを超えているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidColumnIndex | SQL 文の列インデックスが 1 バイト未満または 1,000 バイトを超えているため返されるエラーメッセージ。 | 400 | なし |
SqlAggregationOnNonNumericType | 数値以外の列で集約関数が使用されているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidAggregationOnTimestamp | タイムスタンプ列で SUM または AVG 集約関数が使用されているため返されるエラーメッセージ。 | 400 | なし |
SqlValueTypeOfInMustBeSame | SQL IN 句に異なる型の値が含まれているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidEscapeChar | SQL LIKE 句に疑問符 (?)、パーセント記号 (%)、アスタリスク (*) などの無効なエスケープ文字が指定されているため返されるエラーメッセージ。 | 400 | なし |
SqlOnlyOneEscapeCharIsAllowed | SQL LIKE 句のエスケープ文字のサイズが 1 バイトを超えているため返されるエラーメッセージ。 | 400 | なし |
SqlNoCharAfterEscapeChar | SQL LIKE 句のエスケープ文字の後に文字が指定されていないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidLimitValue | SQL Limit 句の後に指定された数値が 1 未満であるため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxWildCardCount | SQL LIKE 句のアスタリスク (*) またはパーセント記号 (%) の数が上限を超えているため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxConditionCount | SQL WHERE 句の条件式の数が上限を超えているため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxConditionDepth | SQL WHERE 句の条件ツリーの深さが上限を超えているため返されるエラーメッセージ。 | 400 | なし |
SqlOneColumnCastToDifferentTypes | SQL 文に CAST 関数が含まれているため、列が異なる型に変換されているため返されるエラーメッセージ。 | 400 | なし |
SqlOperationAppliedToDifferentTypes | SQL 文で異なる型の 2 つのオブジェクトに演算子が使用されているため返されるエラーメッセージ。たとえば、_col1 > 3 の col1 が文字列の場合、このエラーコードが返されます。 | 400 | なし |
SqlInvalidColumnName | SQL 文で使用されている列名が CSV オブジェクトのヘッダーに含まれていないため返されるエラーメッセージ。 | 400 | なし |
SqlNotSupportedTimestampFormat | SQL CAST 句で指定されたタイムスタンプ形式がサポートされていないため返されるエラーメッセージ。 | 400 | なし |
SqlNotMatchTimestampFormat | SQL CAST 句で指定されたタイムスタンプ形式がタイムスタンプ文字列と一致しないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidTimestampValue | SQL CAST 句でタイムスタンプ形式が指定されておらず、指定された文字列をタイムスタンプに変換できないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidLikeOperand | SQL LIKE 句で左側の列名またはインデックスが指定されていないか、左側に指定された列が文字列型ではないか、LIKE 句の右側の列が文字列型であるため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidMixOfAggregationAndColumn | SQL SELECT 句に、集約関数と非集約関数の両方の列名とインデックスが含まれているため返されるエラーメッセージ。 | 400 | なし |
SqlExceedsMaxAggregationCount | SQL SELECT 句に含まれる集約関数の数が上限を超えているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidMixOfStarAndColumn | 同じ SQL 文にアスタリスク (*)、列名、列インデックスが含まれているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidKeepAllColumnsWithAggregation | SQL 文に集約関数が含まれており、KeepAllColumns パラメーターが true に設定されているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidKeepAllColumnsWithDuplicateColumn | SQL 文に繰り返される列名または列インデックスが含まれており、KeepAllColumns パラメーターが true に設定されているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidSqlAfterAnalysis | SQL 文が複雑で、解析された SQL 文がサポートされていないため返されるエラーメッセージ。 | 400 | なし |
InvalidArithmeticOperand | SQL 文に、数値以外の定数または列に対して実行される算術演算が含まれているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidAndOperand | SQL 文の AND 演算子で結合された式がブール型ではないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidOrOperand | SQL 文の OR 演算子で結合された式がブール型ではないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidNotOperand | SQL 文の NOT 演算子で結合された式がブール型ではないため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidIsNullOperand | SQL 文で、定数に対して実行される IS NULL 演算子ベースの操作が指定されているため返されるエラーメッセージ。 | 400 | なし |
SqlComparerOperandTypeMismatch | SQL 文で、異なる型の 2 つのオブジェクトに対して実行される比較演算子ベースの操作が指定されているため返されるエラーメッセージ。 | 400 | なし |
SqlInvalidConcatOperand | SQL 文に、連結演算子 (||) で結合された 2 つの定数が含まれているため返されるエラーメッセージ。 | 400 | なし |
SqlUnsupportedSql | SQL 文が複雑で、生成された SQL プランのサイズが上限を超えているため返されるエラーメッセージ。 | 400 | なし |
HeaderInfoExceedsMaxSize | SQL 文で指定されたヘッダー情報のサイズが上限を超えているため返されるエラーメッセージ。 | 400 | なし |
OutputExceedsMaxSize | 出力の行のサイズが上限を超えているため返されるエラーメッセージ。 | 400 | なし |
InvalidCsvLine | CSV オブジェクトの行が無効であるか、行のサイズが上限を超えているか、スキップされた行の数が MaxSkippedRecordsAllowed の値を超えているため返されるエラーメッセージ。 | 400 または 206 | 400 またはなし |
NegativeRowIndex | SQL 文の配列インデックスの値が負の数であるため返されるエラーメッセージ。 | 400 | なし |
ExceedsMaxNestedColumnDepth | SQL 文の JSON オブジェクトのネストレベルの数が上限を超えているため返されるエラーメッセージ。 | 400 | なし |
NestedColumnNotSupportInCsv | SQL 文に、ピリオド (.) を含むネストされた列または角かっこ ([]) を含む配列が含まれているため返されるエラーメッセージ。上記の文字は、CSV オブジェクトの SQL 文ではサポートされていません。 | 400 | なし |
TableRootNodeOnlySupportInJson | JSON オブジェクトの From ossobject の後にルートノードパスが指定されていないため返されるエラーメッセージ。 | 400 | なし |
JsonNodeExceedsMaxSize | JSON オブジェクトのルートノードのサイズが上限を超えているため返されるエラーメッセージ。 | 400 または 206 | 400 またはなし |
InvalidJsonData | JSON データの形式が正しくないため返されるエラーメッセージ。 | 400 または 206 | 400 またはなし |
ExceedsMaxJsonArraySize | JSON オブジェクトのルートノードの配列の要素数が上限を超えているため返されるエラーメッセージ。 | 400 または 206 | 400 またはなし |
WildCardNotAllowed | JSON オブジェクトの SQL SELECT 句または SQL WHERE 句でアスタリスク (*) を使用できないため返されるエラーメッセージ。たとえば、 | 400 | なし |
JsonNodeExceedsMaxDepth | JSON オブジェクトのルートノードの深さが上限を超えているため返されるエラーメッセージ。 | 400 または 206 | 400 またはなし |
ossutil
SelectObject 操作に対応する ossutil コマンドについては、「select-object」をご参照ください。