本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
SELECT command
重要
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。進一步了解
Amazon S3 Select 僅支援 SQL SELECT
命令。支援下列 ANSI 標準子句SELECT
:
-
SELECT
清單 -
FROM
子句 -
WHERE
子句 -
LIMIT
子句
注意
Amazon S3 Select 查詢目前不支援子查詢或聯結。
SELECT 列出
SELECT
清單會指出您要查詢傳回的欄位、函數及表達式。清單查詢的輸出。
SELECT * SELECT
projection1
AScolumn_alias_1
,projection2
AScolumn_alias_2
第一個具 *
(星號) 的 SELECT
表單會傳回已通過 WHERE
子句的每個資料列。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 物件。 -
萬用字元一律至少會發出一個記錄。如果沒有相符的記錄,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 物件只有一個根元素,子
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
TRUE
的資料列。
LIMIT 子句
LIMIT
子句遵循此語法:
LIMIT
number
此 LIMIT
子句會限制您希望查詢而根據
傳回的記錄數量。number
屬性存取
SELECT
和 WHERE
子句可以使用下列各節中其中一種方法來參考記錄資料,具體取決於要查詢的檔案是 CSV 還是 JSON 格式。
CSV
-
資料欄編號 – 您可以參考資料欄名稱為 的資料列第 N 欄
_
,其中N
是資料欄位置。位置計算從 1 開始。例如,第一個欄位名稱為N
_1
,而第二個欄位名稱為_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 清單中的元素。例如,您可以存取元素的第二個清單做為
。您可以將存取清單元素與欄位相結合,例如,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) 具有指定資料欄標頭的 CSV 格式 Amazon S3 物件,以及"Use"
針對查詢請求FileHeaderInfo
設定為 的 ;或 2) 具有指定屬性的 JSON 格式 Amazon S3 物件。
範例 #1:正在受到查詢的物件有標頭或屬性 NAME
。
-
以下運算式成功將值從物件傳回。因為沒有引號,所以查詢不區分大小寫。
SELECT s.name from S3Object s
-
以下運算式產生 400 錯誤
MissingHeaderName
。因為有引號,所以查詢區分大小寫。SELECT s."name" from S3Object s
範例 #2:要查詢的 Amazon S3 物件內含一個標頭或屬性 NAME
和另一個標頭或屬性 name
。
-
以下運算式產生 400 錯誤
AmbiguousFieldName
。因為沒有引號,所以查詢不區分大小寫,但有兩個相符項目,因此會擲回錯誤。SELECT s.name from S3Object s
-
以下運算式成功將值從物件傳回。因為有引號,所以查詢區分大小寫,因此沒有歧義。
SELECT s."NAME" from S3Object s
使用預留關鍵字做為使用者定義的條件
Amazon S3 Select 有一組保留關鍵字,用於執行用於查詢物件內容的 SQL 表達式。預留關鍵字包含函數名稱、資料類型、運算子,以此類推。在某些情況下,使用者定義的術語,例如資料欄標頭 (適用於 CSV 檔案) 或屬性 (適用於 JSON 物件),可能會與預留關鍵字衝突。當發生這種情況,您必須使用雙引號特別表示您使用的是會與預留關鍵字衝突的使用者定義條件。否則將會發生 400 剖析錯誤。
對於預留關鍵字的完整清單,請參閱 保留的關鍵字。
下列範例為 1) 具有指定欄標頭的 CSV 格式 Amazon S3 物件,"Use"
以及針對查詢請求FileHeaderInfo
設定為 ,或 2) 具有指定屬性的 JSON 格式 Amazon S3 物件。
範例:正受到查詢的物件有名為 CAST
的標頭或屬性,這是預留的關鍵字。
-
以下運算式成功將值從物件傳回。由於查詢中使用引號,所以 S3 Select 會使用使用者定義的標頭或屬性。
SELECT s."CAST" from S3Object s
-
以下運算式會產生 400 剖析錯誤。由於查詢中未使用引號,因此
CAST
與保留關鍵字發生衝突。SELECT s.CAST from S3Object s
純量表達式
在WHERE
子句和SELECT
清單中,您可以具有 SQL 純量運算式,這些運算式是傳回純量值的運算式。其格式如下:
-
常值
SQL 文字。
-
column_reference
對表單
或column_name
中列的引用。alias
.column_name
-
unary_op
expression
在這種情況下,
是單SQL unary 運算子。unary_op
-
expression
binary_op
expression
在此情況下,
是 SQL 二進位運算子。binary_op
-
func_name
在此情況下,
是要叫用的純量函數。func_name
-
expression
[ NOT ] BETWEEN
expression
AND
expression
-
expression
LIKE
[expression
ESCAPE
]expression