

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 適用於 Amazon S3 Select 的 SQL 參考
<a name="s3-select-sql-reference"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

此參考包含 Amazon S3 Select 所支援之結構化查詢語言 (SQL) 元素的描述。

**Topics**
+ [

# SELECT 命令
](s3-select-sql-reference-select.md)
+ [

# 資料類型
](s3-select-sql-reference-data-types.md)
+ [

# 運算子
](s3-select-sql-reference-operators.md)
+ [

# 保留的關鍵字
](s3-select-sql-reference-keyword-list.md)
+ [

# SQL 函數
](s3-select-sql-reference-sql-functions.md)

# SELECT 命令
<a name="s3-select-sql-reference-select"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 僅支援 `SELECT` SQL 命令。支援下列 ANSI 標準條款 `SELECT`：


+ `SELECT` 清單
+ `FROM` 子句 
+ `WHERE` 子句
+ `LIMIT` 子句

**注意**  
Amazon S3 Select 查詢目前不支援子查詢或聯結。

## SELECT 清單
<a name="s3-select-sql-reference-select-list"></a>

`SELECT` 清單會指出您要查詢傳回的欄位、函數及表達式。清單查詢的輸出。

```
SELECT *
SELECT projection1 AS column_alias_1, projection2 AS column_alias_2
```

第一個具 `*` (星號) 的 `SELECT` 表單會傳回已通過 `WHERE` 子句的每個資料列。`SELECT` 的第二個表單針對每一欄以使用者定義的輸出純量運算式 **`projection1`** 和 **`projection2`** 來建立資料列。

## FROM 子句
<a name="s3-select-sql-reference-from"></a>

Amazon S3 Select 支援以下形式的 `FROM` 子句：

```
FROM table_name
FROM table_name alias
FROM table_name AS alias
```

在 `FROM` 子句的每種形式中，`table_name` 是正在查詢的 `S3Object`。來自傳統關聯式資料庫的使用者可以將其做為資料庫結構描述，其中包含多個對表格的檢視。

以下標準 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 物件。
萬用字元一律至少會發出一個記錄。如果沒有相符的記錄，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` 則否。

**Example**  
**範例**：  
*範例 \$11*  
此範例顯示使用下列資料集和查詢時的結果：  

```
{ "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"}
```
*範例 \$12*  
此範例顯示使用下列資料集和查詢時的結果：  

```
{ "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 子句
<a name="s3-select-sql-reference-where"></a>

`WHERE` 子句遵循此語法：

```
WHERE condition
```

`WHERE` 子句根據 `condition` 篩選資料列。 條件是具有布林值結果的表達式。僅限當條件評估為在結果中傳回 `TRUE` 的資料列。

## LIMIT 子句
<a name="s3-select-sql-reference-limit"></a>

`LIMIT` 子句遵循此語法：

```
LIMIT number
```

此 `LIMIT` 子句會限制您希望查詢而根據 `number` 傳回的記錄數量。

## 屬性存取
<a name="s3-select-sql-reference-attribute-access"></a>

`SELECT` 和 `WHERE` 子句可以在以下部分使用其中一個方法參閱記錄資料，這取決於受到查詢檔案是否是 CSV 或 JSON 格式。

### CSV
<a name="s3-select-sql-reference-attribute-access-csv"></a>
+ **欄編號** – 您可以提及欄名稱為 `_N` 的某列第 *Nth* 欄，其中 *`N`* 是欄的位置。位置計算從 1 開始。例如，第一個欄位名稱為 `_1`，而第二個欄位名稱為 `_2`。

  您可以提及欄做為 `_N` 或 `alias._N`。例如，`_2` 和 `myAlias._2` 都是在 `SELECT` 清單和 `WHERE` 子句中提及欄的有效方法。
+ **欄標題** – 若 CSV 格式的物件擁有標頭列，則可將標頭用於 `SELECT` 清單和 `WHERE` 子句。尤其是，在 `SELECT` 和 `WHERE` 子句運算式中的傳統 SQL 運算式，您可以透過 `alias.column_name` 或 `column_name` 來提及欄。

### JSON
<a name="s3-select-sql-reference-attribute-access-json"></a>
+ **文件** – 您可存取 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}
      ]
  }
  ```

  *範例 \$11*

  下列查詢會傳回這些結果：

  ```
  Select s.name from S3Object s
  ```

  ```
  {"name":"Susan Smith"}
  ```

  *範例 \$12*

  下列查詢會傳回這些結果：

  ```
  Select s.projects[0].project_name from S3Object s
  ```

  ```
  {"project_name":"project1"}
  ```

## 區分大小寫的標頭和屬性名稱
<a name="s3-select-sql-reference-case-sensitivity"></a>

搭配 Amazon S3 Select，您可以使用雙引號來指出欄標題 (適用於 CSV 物件) 和屬性 (適用於 JSON 物件) 會區分大小寫。如果沒有雙引號、物件標頭和屬性不區分大小寫。在發生模糊時即會拋出錯誤。

以下範例是 1) CSV 格式的 Amazon S3 物件，內含指定欄標頭，且將 `FileHeaderInfo` 設為 `"Use"` 以進行查詢請求；或者 2) 含指定屬性且為 JSON 格式的 Amazon S3 物件。

*範例 \$11：*正在受到查詢的物件有標頭或屬性 `NAME`。
+ 以下運算式成功將值從物件傳回。因為沒有引號，所以查詢不區分大小寫。

  ```
  SELECT s.name from S3Object s
  ```
+ 以下運算式產生 400 錯誤 `MissingHeaderName`。因為有引號，所以查詢區分大小寫。

  ```
  SELECT s."name" from S3Object s
  ```

*範例 \$12：*要查詢的 Amazon S3 物件內含一個標頭或屬性 `NAME` 和另一個標頭或屬性 `name`。
+ 以下運算式產生 400 錯誤 `AmbiguousFieldName`。因為沒有引號，所以查詢不區分大小寫，但有兩個相符項目，因此會擲回錯誤。

  ```
  SELECT s.name from S3Object s
  ```
+ 以下運算式成功將值從物件傳回。因為有引號，所以查詢區分大小寫，因此沒有歧義。

  ```
  SELECT s."NAME" from S3Object s
  ```

## 使用預留關鍵字做為使用者定義的條件
<a name="s3-select-sql-reference-using-keywords"></a>

Amazon S3 Select 有一組預留關鍵字，這些關鍵字是執行用於查詢物件內容的 SQL 運算式所必需的。預留關鍵字包含函數名稱、資料類型、運算子，以此類推。在某些情況下，使用者定義的條件，像是欄標題 (適用於 CSV 檔案) 或屬性 (適用於 JSON 物件) 可能會與預留的關鍵字產生衝突。當發生這種情況，您必須使用雙引號特別表示您使用的是會與預留關鍵字衝突的使用者定義條件。否則將會發生 400 剖析錯誤。

對於預留關鍵字的完整清單，請參閱 [保留的關鍵字](s3-select-sql-reference-keyword-list.md)。

以下範例是 1) CSV 格式的 Amazon S3 物件，內含指定欄標頭，且將 `FileHeaderInfo` 設為 `"Use"` 以進行查詢請求；或者 2) 含指定屬性且為 JSON 格式的 Amazon S3 物件。

*範例：*正受到查詢的物件有名為 `CAST` 的標頭或屬性，這是預留的關鍵字。
+ 以下運算式成功將值從物件傳回。由於查詢中使用引號，所以 S3 Select 會使用使用者定義的標頭或屬性。

  ```
  SELECT s."CAST" from S3Object s
  ```
+ 以下運算式會產生 400 剖析錯誤。由於查詢中未使用引號，因此 `CAST` 與保留關鍵字發生衝突。

  ```
  SELECT s.CAST from S3Object s
  ```

## 純量表達式
<a name="s3-select-sql-reference-scalar"></a>

在 `WHERE` 子句和 `SELECT` 清單內，您可以擁有 SQL *純量表達式*，這是會傳回純量值的表達式。其格式如下：
+ ***`literal`*** 

  SQL 常值。
+ ***`column_reference`*** 

  對表單 `column_name` 或 `alias.column_name` 中列的引用。
+ **`unary_op`** **`expression`** 

  在此情況下，****`unary_op`**** 是一種 SQL 一元運算子。
+ **`expression`** **`binary_op`** ***`expression`*** 

   在此情況下，****`binary_op`**** 是一種 SQL 二元運算子。
+ **`func_name`** 

   在此情況下，**`func_name`** 是要叫用的純量函數。
+ ***`expression`*** `[ NOT ] BETWEEN` ****`expression`**** `AND` ****`expression`****
+ ***`expression`*** `LIKE` ****`expression`**** [ `ESCAPE` ***`expression`*** ]

# 資料類型
<a name="s3-select-sql-reference-data-types"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援數種基本資料類型。

## 資料類型轉換
<a name="s3-select-sql-reference-data-conversion"></a>

如果一般規則是遵循 `CAST` 函數 (如有定義的話)。如果 `CAST` 沒有定義，則所有輸入資料會視為一個字串。在此情況下，必要時您必須將輸入資料轉換為相關資料類型。

如需 `CAST` 函數的詳細資訊，請參閱「[CAST](s3-select-sql-reference-conversion.md#s3-select-sql-reference-cast)」。

## 支援的資料類型
<a name="s3-select-sql-reference-supported-data-types"></a>

Amazon S3 Select 支援下列一組基本資料類型。


|  名稱  |  描述  |  範例  | 
| --- | --- | --- | 
| `bool` | 布林值，`TRUE` 或 `FALSE`。 | `FALSE` | 
| `int`, `integer` | 8 個位元組簽署的整數在從 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的範圍內。 | `100000` | 
| `string` | UTF8 編碼的變數長度字串。預設限制為 1 個字元。字元數上限是 2,147,483,647 個。 | `'xyz'` | 
| `float` | 8 個位元組的浮點數。 | `CAST(0.456 AS FLOAT)` | 
| `decimal`, `numeric` |  以 10 為底數的數字，最大的精確度為 38 (也就是有效數字的上限)，並在 -231 到 231-1 (也就是以 10 為底數的指數) 的範圍內。  當您同時提供兩者時，Amazon S3 Select 會忽略比例和精確度。   | `123.456 ` | 
| `timestamp` |  時間戳記代表特定時間點，始終包含區域位移和任意精確度。 在文字格式中，時間戳記遵循 [W3C 的日期和時間格式](https://www.w3.org/TR/NOTE-datetime)，但時間戳記如果不是最少一整天的精確度，則結尾必須為常值 `T`。允許分數的秒值，至少一位數的精確度和無限最大值。當地時間位移可代表從 UTC 位移小時:分鐘或以常值 `Z` 標註 UTC 的當地時間。時間戳記上需要本機時間位移，日期值則不允許使用時間戳記。  | `CAST('2007-04-05T14:30Z' AS TIMESTAMP)` | 

### 支援的 Parquet 類型
<a name="s3-select-sql-reference-supported-data-types-parquet"></a>

Amazon S3 Select 支援下列 Parquet 類型。
+ `DATE`
+ `DECIMAL`
+ `ENUM`
+ `INT(8)`
+ `INT(16)`
+ `INT(32)`
+ `INT(64)`
+ `LIST`
**注意**  
對於 `LIST` Parquet 類型輸出，Amazon S3 Select 僅支援 JSON 格式。但是，如果查詢將資料限制為簡單值，也可以使用 CSV 格式查詢 `LIST` Parquet 類型。
+ `STRING`
+ `TIMESTAMP` 支援的精確度 (`MILLIS`/`MICROS`/`NANOS`)
**注意**  
不支援儲存為 `INT(96)` 的時間戳記。  
由於 `INT(64)` 類型的範圍，使用 `NANOS` 單位的時間戳記只能代表介於 `1677-09-21 00:12:43` 和 `2262-04-11 23:47:16` 之間的值。超出此範圍的值無法以 `NANOS` 單位表示。

### 將 Parquet 類型對應到 Amazon S3 Select 中的支援資料類型
<a name="s3-select-sql-reference-supported-data-types-parquet-mapping"></a>


| Parquet 類型 | 支援的資料類型 | 
| --- | --- | 
| `DATE` |  `timestamp`  | 
|  `DECIMAL`  |  `decimal`, `numeric`  | 
|  `ENUM`  |  `string`  | 
|  `INT(8)`  |  `int`, `integer`  | 
|  `INT(16)`  | `int`, `integer` | 
| `INT(32)` | `int`, `integer` | 
|  `INT(64)`  |  `decimal`, `numeric`  | 
|  `LIST`  |  清單中的每個 Parquet 類型都會映設到對應的資料類型  | 
|  `STRING`  |  `string`  | 
|  `TIMESTAMP`  |  `timestamp`  | 

# 運算子
<a name="s3-select-sql-reference-operators"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列運算子。

## 邏輯運算子
<a name="s3-select-sql-reference-loical-ops"></a>
+ `AND`
+ `NOT`
+ `OR`

## 比較運算子
<a name="s3-select-sql-reference-compare-ops"></a>
+ `<` 
+ `>` 
+ `<=`
+ `>=`
+ `=`
+ `<>`
+ `!=`
+ `BETWEEN`
+ `IN`例如，。`IN ('a', 'b', 'c')`

  

## 模式比對運算子
<a name="s3-select-sql-reference-pattern"></a>
+ `LIKE`
+ `_` (比對任何字元)
+ `%` (比對任何字元序列)

## 單一運算子
<a name="s3-select-sql-reference-unitary-ops"></a>
+ `IS NULL`
+ `IS NOT NULL`

## 數學運算子
<a name="s3-select-sql-referencemath-ops"></a>

支援加法、減法、乘法、除法和模數，如下所示：
+ \$1
+ -
+ \$1
+ /
+ %

## 運算子優先順序
<a name="s3-select-sql-reference-op-Precedence"></a>

下表顯示運算子優先順序或遞減順序。


|  運算子或元素  |  關聯性 |  必要  | 
| --- | --- | --- | 
| `-`  | 右  | 一元減號  | 
| `*`, `/`, `%`  | 左  | 乘法、減法、模數  | 
| `+`, `-`  | 左  | 加法、減法  | 
| `IN` |  | 設定成員資格  | 
| `BETWEEN` |  | 範圍內含項目  | 
| `LIKE` |  | 字串模式比對  | 
| `<``>` |  | 小於、大於  | 
| `=` | 右  | 等式、指派 | 
| `NOT` | 右 | 邏輯否定  | 
| `AND` | 左 | 邏輯結合  | 
| `OR` | 左 | 邏輯分離  | 

# 保留的關鍵字
<a name="s3-select-sql-reference-keyword-list"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

以下是 Amazon S3 Select 的預留關鍵字清單。這些關鍵字包含執行 SQL 運算式所需的函數名稱、資料類型、運算子等，該運算式會用來查詢物件內容。

```
absolute
action
add
all
allocate
alter
and
any
are
as
asc
assertion
at
authorization
avg
bag
begin
between
bit
bit_length
blob
bool
boolean
both
by
cascade
cascaded
case
cast
catalog
char
char_length
character
character_length
check
clob
close
coalesce
collate
collation
column
commit
connect
connection
constraint
constraints
continue
convert
corresponding
count
create
cross
current
current_date
current_time
current_timestamp
current_user
cursor
date
day
deallocate
dec
decimal
declare
default
deferrable
deferred
delete
desc
describe
descriptor
diagnostics
disconnect
distinct
domain
double
drop
else
end
end-exec
escape
except
exception
exec
execute
exists
external
extract
false
fetch
first
float
for
foreign
found
from
full
get
global
go
goto
grant
group
having
hour
identity
immediate
in
indicator
initially
inner
input
insensitive
insert
int
integer
intersect
interval
into
is
isolation
join
key
language
last
leading
left
level
like
limit
list
local
lower
match
max
min
minute
missing
module
month
names
national
natural
nchar
next
no
not
null
nullif
numeric
octet_length
of
on
only
open
option
or
order
outer
output
overlaps
pad
partial
pivot
position
precision
prepare
preserve
primary
prior
privileges
procedure
public
read
real
references
relative
restrict
revoke
right
rollback
rows
schema
scroll
second
section
select
session
session_user
set
sexp
size
smallint
some
space
sql
sqlcode
sqlerror
sqlstate
string
struct
substring
sum
symbol
system_user
table
temporary
then
time
timestamp
timezone_hour
timezone_minute
to
trailing
transaction
translate
translation
trim
true
tuple
union
unique
unknown
unpivot
update
upper
usage
user
using
value
values
varchar
varying
view
when
whenever
where
with
work
write
year
zone
```

# SQL 函數
<a name="s3-select-sql-reference-sql-functions"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列 SQL 函數。

**Topics**
+ [

# 彙總函數
](s3-select-sql-reference-aggregate.md)
+ [

# 條件函數
](s3-select-sql-reference-conditional.md)
+ [

# 轉換函數
](s3-select-sql-reference-conversion.md)
+ [

# 日期函數
](s3-select-sql-reference-date.md)
+ [

# 字串函數
](s3-select-sql-reference-string.md)

# 彙總函數
<a name="s3-select-sql-reference-aggregate"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列彙總函數。


| 函式 | 引數類型 | 傳回類型 | 
| --- | --- | --- | 
| `AVG(expression)` | `INT`, `FLOAT`, `DECIMAL` | `DECIMAL` 適用於 `INT` 引數，`FLOAT` 適用於浮點數，否則即為相同的引數資料類型。 | 
| `COUNT` |  `-`  | `INT` | 
| `MAX(expression)` | `INT`, `DECIMAL` | 相同的引數類型。 | 
| `MIN(expression)` | `INT`, `DECIMAL` | 相同的引數類型。 | 
| `SUM(expression)` | `INT`, `FLOAT`, `DOUBLE`, `DECIMAL` | `INT` 適用於 `INT` 引數，`FLOAT` 適用於浮點數，否則即為相同的引數資料類型。 | 

## SUM 範例
<a name="s3-select-sql-reference-aggregate-case-examples"></a>

若要彙總 [S3 清查報告](https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html)中資料夾的物件大小總計，請使用 `SUM` 運算式。

下列 S3 清查報告是以 GZIP 壓縮的 CSV 檔案。共有三個欄。
+ 第一欄是 S3 清查報告所用的 S3 儲存貯體 (*`DOC-EXAMPLE-BUCKET`*) 名稱。
+ 第二個欄是物件金鑰名稱，可唯一識別儲存貯體中的物件。

  第一列中的 `example-folder/` 值用於資料夾 `example-folder`。在 Amazon S3 中，當您在儲存貯體建立資料夾時，S3 會建立一個 0 位元組的物件，其索引鍵設定為您提供的資料夾名稱。

  第二列中的 `example-folder/object1` 值是資料夾 `example-folder` 中的物件 `object1`。

  第三列中的 `example-folder/object2` 值是資料夾 `example-folder` 中的物件 `object2`。

  如需 S3 資料夾的詳細資訊，請參閱 [在 Amazon S3 主控台中使用資料夾整理物件](using-folders.md)。
+ 第三欄是以字節為單位的物件大小。

```
"DOC-EXAMPLE-BUCKET","example-folder/","0"
"DOC-EXAMPLE-BUCKET","example-folder/object1","2011267"
"DOC-EXAMPLE-BUCKET","example-folder/object2","1570024"
```

若要使用 `SUM` 運算式來計算資料夾 `example-folder` 的總大小，請使用 Amazon S3 選取執行 SQL 查詢。

```
SELECT SUM(CAST(_3 as INT)) FROM s3object s WHERE _2 LIKE 'example-folder/%' AND _2 != 'example-folder/';
```

查詢結果：

```
3581291
```

# 條件函數
<a name="s3-select-sql-reference-conditional"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列條件函數。

**Topics**
+ [

## CASE
](#s3-select-sql-reference-case)
+ [

## COALESCE
](#s3-select-sql-reference-coalesce)
+ [

## NULLIF
](#s3-select-sql-reference-nullif)

## CASE
<a name="s3-select-sql-reference-case"></a>

`CASE` 運算式是條件式運算式，類似於其他語言中的 `if/then/else` 陳述式。有多個條件時會使用 `CASE` 來指定結果。`CASE` 表達式有兩種類型：簡單和搜尋。

在簡單 `CASE` 運算式中，表達式與值相比較。發現相符時，就套用 `THEN` 子句中指定的動作。未發現相符時，就套用 `ELSE` 子句中的動作。

在搜尋 `CASE` 運算式中，每一個 `CASE` 的評估根據為布林值運算式，而 `CASE` 陳述式會傳回第一個相符的 `CASE`。如果在 `WHEN` 子句之間找不到相符的 `CASE`，就傳回 `ELSE` 子句中的動作。

### 語法
<a name="s3-select-sql-reference-case-syntax"></a>

**注意**  
目前，Amazon S3 Select 不支援 `ORDER BY` 或包含新行的查詢。請務必使用沒有分行符號的查詢。

以下是用來比對條件的簡單 `CASE` 陳述式：

```
CASE expression WHEN value THEN result [WHEN...] [ELSE result] END					
```

以下是用來評估每一個條件的搜尋 `CASE` 陳述式：

```
CASE WHEN boolean condition THEN result [WHEN ...] [ELSE result] END					
```

### 範例
<a name="s3-select-sql-reference-case-examples"></a>

**注意**  
如果您使用 Amazon S3 主控台執行以下範例，並且 CSV 檔案包含標題列，請選擇**排除 CSV 資料的第一行**。

**範例 1：**使用簡單的 `CASE` 運算式在查詢中以 `Big Apple` 替換 `New York City`。以 `other` 取代其他所有城市名稱。

```
SELECT venuecity, CASE venuecity WHEN 'New York City' THEN 'Big Apple' ELSE 'other' END FROM S3Object;
```

查詢結果：

```
venuecity        |   case
-----------------+-----------
Los Angeles      | other
New York City    | Big Apple
San Francisco    | other
Baltimore        | other
...
```

**範例 2：**使用搜尋 `CASE` 運算式以根據個別門票銷售的 `pricepaid` 值來指派群組號碼：

```
SELECT pricepaid, CASE WHEN CAST(pricepaid as FLOAT) < 10000 THEN 'group 1' WHEN CAST(pricepaid as FLOAT) > 10000 THEN 'group 2' ELSE 'group 3' END FROM S3Object;					
```

查詢結果：

```
pricepaid |  case
-----------+---------
12624.00 | group 2
10000.00 | group 3
10000.00 | group 3
9996.00 | group 1
9988.00 | group 1
...
```

## COALESCE
<a name="s3-select-sql-reference-coalesce"></a>

`COALESCE` 依順序評估引數，並傳回第一個非不明值，也就是第一個非空值或非遺失值。此函數不會傳播 null 值和遺失值。

### 語法
<a name="s3-select-sql-reference-coalesce-syntax"></a>

```
COALESCE ( expression, expression, ... )
```

### Parameters
<a name="s3-select-sql-reference-coalesce-parameters"></a>

 *`expression`*   
該函數對其運作的目標運算式。

### 範例
<a name="s3-select-sql-reference-coalesce-examples"></a>

```
COALESCE(1)                -- 1
COALESCE(null)             -- null
COALESCE(null, null)       -- null
COALESCE(missing)          -- null
COALESCE(missing, missing) -- null
COALESCE(1, null)          -- 1
COALESCE(null, null, 1)    -- 1
COALESCE(null, 'string')   -- 'string'
COALESCE(missing, 1)       -- 1
```

## NULLIF
<a name="s3-select-sql-reference-nullif"></a>

由於有兩個運算式，如果兩個運算式評估為相同的值，則 `NULLIF` 會傳回 `NULL` 值，否則 `NULLIF` 會傳回第一個運算式評估的結果。

### 語法
<a name="s3-select-sql-reference-nullif-syntax"></a>

```
NULLIF ( expression1, expression2 )
```

### Parameters
<a name="s3-select-sql-reference-nullif-parameters"></a>

 `expression1, expression2`   
該函數對其運作的目標運算式。

### 範例
<a name="s3-select-sql-reference-nullif-examples"></a>

```
NULLIF(1, 1)             -- null
NULLIF(1, 2)             -- 1
NULLIF(1.0, 1)           -- null
NULLIF(1, '1')           -- 1
NULLIF([1], [1])         -- null
NULLIF(1, NULL)          -- 1
NULLIF(NULL, 1)          -- null
NULLIF(null, null)       -- null
NULLIF(missing, null)    -- null
NULLIF(missing, missing) -- null
```

# 轉換函數
<a name="s3-select-sql-reference-conversion"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列轉換函數。

**Topics**
+ [

## CAST
](#s3-select-sql-reference-cast)

## CAST
<a name="s3-select-sql-reference-cast"></a>

`CAST` 函數會轉換實體，例如，將評估為單一值的表達式，從一個類型轉換為另一個類型。

### 語法
<a name="s3-select-sql-reference-cast-syntax"></a>

```
CAST ( expression AS data_type )
```

### Parameters
<a name="s3-select-sql-reference-cast-parameters"></a>

 *`expression`*   
一或多個值的組合、運算子以及評估為值的 SQL 函數。

 *`data_type`*   
目標資料類型，例如 `INT` 轉換表達式為。如需支援的資料類型清單，請參閱 [資料類型](s3-select-sql-reference-data-types.md)。

### 範例
<a name="s3-select-sql-reference-cast-examples"></a>

```
CAST('2007-04-05T14:30Z' AS TIMESTAMP)
CAST(0.456 AS FLOAT)
```

# 日期函數
<a name="s3-select-sql-reference-date"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列日期函數。

**Topics**
+ [

## DATE\$1ADD
](#s3-select-sql-reference-date-add)
+ [

## DATE\$1DIFF
](#s3-select-sql-reference-date-diff)
+ [

## EXTRACT
](#s3-select-sql-reference-extract)
+ [

## TO\$1STRING
](#s3-select-sql-reference-to-string)
+ [

## TO\$1TIMESTAMP
](#s3-select-sql-reference-to-timestamp)
+ [

## UTCNOW
](#s3-select-sql-reference-utcnow)

## DATE\$1ADD
<a name="s3-select-sql-reference-date-add"></a>

考量到日期部分、數量和時間戳記，`DATE_ADD` 透過數量更改的日期部分傳回更新的時間戳記。

### 語法
<a name="s3-select-sql-reference-date-add-syntax"></a>

```
DATE_ADD( date_part, quantity, timestamp )
```

### Parameters
<a name="s3-select-sql-reference-date-add-parameters"></a>

*`date_part`*   
指定哪些日期部分要進行修改。此可為下列其中之一：  
+ 年
+ 月
+ 天
+ 小時
+ 分鐘
+ 秒

 *`quantity`*   
此值套用到更新的時間戳記。`quantity` 正值會新增至時間戳記 date\$1part，負值則相減。

 *`timestamp`*   
該函數對其運作的目標時間戳記。

### 範例
<a name="s3-select-sql-reference-date-add-examples"></a>

```
DATE_ADD(year, 5, `2010-01-01T`)                -- 2015-01-01 (equivalent to 2015-01-01T)
DATE_ADD(month, 1, `2010T`)                     -- 2010-02T (result will add precision as necessary)
DATE_ADD(month, 13, `2010T`)                    -- 2011-02T
DATE_ADD(day, -1, `2017-01-10T`)                -- 2017-01-09 (equivalent to 2017-01-09T)
DATE_ADD(hour, 1, `2017T`)                      -- 2017-01-01T01:00-00:00
DATE_ADD(hour, 1, `2017-01-02T03:04Z`)          -- 2017-01-02T04:04Z
DATE_ADD(minute, 1, `2017-01-02T03:04:05.006Z`) -- 2017-01-02T03:05:05.006Z
DATE_ADD(second, 1, `2017-01-02T03:04:05.006Z`) -- 2017-01-02T03:04:06.006Z
```

## DATE\$1DIFF
<a name="s3-select-sql-reference-date-diff"></a>

考量到日期部分和兩個有效的時間戳記，`DATE_DIFF` 會傳回日期部分中的差異。當傳回的值是負整數，而 `date_part` 的 `timestamp1` 值大於 `date_part` 的 `timestamp2` 值。當傳回的值是正整數，而 `date_part` 的 `timestamp1` 值少於 `date_part` 的 `timestamp2` 值。

### 語法
<a name="s3-select-sql-reference-date-diff-syntax"></a>

```
DATE_DIFF( date_part, timestamp1, timestamp2 )
```

### Parameters
<a name="s3-select-sql-reference-date-diff-parameters"></a>

 **`date_part`**   
指定哪些時間戳記的部分要進行比較。如需定義的詳細資訊 `date_part`，請參閱「[DATE\$1ADD](#s3-select-sql-reference-date-add)」。

 **`timestamp1`**   
要比較的第一種時間戳記。

 **`timestamp2`**   
要比較的第二種時間戳記。

### 範例
<a name="s3-select-sql-reference-date-diff-examples"></a>

```
DATE_DIFF(year, `2010-01-01T`, `2011-01-01T`)            -- 1
DATE_DIFF(year, `2010T`, `2010-05T`)                     -- 4 (2010T is equivalent to 2010-01-01T00:00:00.000Z)
DATE_DIFF(month, `2010T`, `2011T`)                       -- 12
DATE_DIFF(month, `2011T`, `2010T`)                       -- -12
DATE_DIFF(day, `2010-01-01T23:00`, `2010-01-02T01:00`) -- 0 (need to be at least 24h apart to be 1 day apart)
```

## EXTRACT
<a name="s3-select-sql-reference-extract"></a>

考量到日期部分和時間戳記，`EXTRACT` 會傳回時間戳記的日期部分值。

### 語法
<a name="s3-select-sql-reference-extract-syntax"></a>

```
EXTRACT( date_part FROM timestamp )
```

### Parameters
<a name="s3-select-sql-reference-extract-parameters"></a>

 **`date_part`**   
指定哪些時間戳記的部分要進行擷取。此可為下列其中之一：  
+ `YEAR`
+ `MONTH`
+ `DAY`
+ `HOUR`
+ `MINUTE`
+ `SECOND`
+ `TIMEZONE_HOUR`
+ `TIMEZONE_MINUTE`

 **`timestamp`**   
該函數對其運作的目標時間戳記。

### 範例
<a name="s3-select-sql-reference-extract-examples"></a>

```
EXTRACT(YEAR FROM `2010-01-01T`)                           -- 2010
EXTRACT(MONTH FROM `2010T`)                                -- 1 (equivalent to 2010-01-01T00:00:00.000Z)
EXTRACT(MONTH FROM `2010-10T`)                             -- 10
EXTRACT(HOUR FROM `2017-01-02T03:04:05+07:08`)             -- 3
EXTRACT(MINUTE FROM `2017-01-02T03:04:05+07:08`)           -- 4
EXTRACT(TIMEZONE_HOUR FROM `2017-01-02T03:04:05+07:08`)    -- 7
EXTRACT(TIMEZONE_MINUTE FROM `2017-01-02T03:04:05+07:08`)  -- 8
```

## TO\$1STRING
<a name="s3-select-sql-reference-to-string"></a>

考量到時間戳記和格式模式，`TO_STRING` 會傳回以指定格式的時間戳記字串呈現。

### 語法
<a name="s3-select-sql-reference-size-syntax"></a>

```
TO_STRING ( timestamp time_format_pattern )
```

### Parameters
<a name="s3-select-sql-reference-size-parameters"></a>

 *`timestamp`*   
該函數對其運作的目標時間戳記。

 *`time_format_pattern`*   
字串，其中包含下列特殊字元的解釋。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonS3/latest/userguide/s3-select-sql-reference-date.html)

### 範例
<a name="s3-select-sql-reference-size-examples"></a>

```
TO_STRING(`1969-07-20T20:18Z`,  'MMMM d, y')                    -- "July 20, 1969"
TO_STRING(`1969-07-20T20:18Z`, 'MMM d, yyyy')                   -- "Jul 20, 1969"
TO_STRING(`1969-07-20T20:18Z`, 'M-d-yy')                        -- "7-20-69"
TO_STRING(`1969-07-20T20:18Z`, 'MM-d-y')                        -- "07-20-1969"
TO_STRING(`1969-07-20T20:18Z`, 'MMMM d, y h:m a')               -- "July 20, 1969 8:18 PM"
TO_STRING(`1969-07-20T20:18Z`, 'y-MM-dd''T''H:m:ssX')           -- "1969-07-20T20:18:00Z"
TO_STRING(`1969-07-20T20:18+08:00Z`, 'y-MM-dd''T''H:m:ssX')     -- "1969-07-20T20:18:00Z"
TO_STRING(`1969-07-20T20:18+08:00`, 'y-MM-dd''T''H:m:ssXXXX')   -- "1969-07-20T20:18:00+0800"
TO_STRING(`1969-07-20T20:18+08:00`, 'y-MM-dd''T''H:m:ssXXXXX')  -- "1969-07-20T20:18:00+08:00"
```

## TO\$1TIMESTAMP
<a name="s3-select-sql-reference-to-timestamp"></a>

給定一個字串，`TO_TIMESTAMP` 將其轉換為時間戳記。`TO_TIMESTAMP` 是 `TO_STRING` 的反轉操作。

### 語法
<a name="s3-select-sql-reference-to-timestamp-syntax"></a>

```
TO_TIMESTAMP ( string )
```

### Parameters
<a name="s3-select-sql-reference-to-timestamp-parameters"></a>

 *`string`*   
該函數對其運作的目標字串。

### 範例
<a name="s3-select-sql-reference-to-timestamp-examples"></a>

```
TO_TIMESTAMP('2007T')                         -- `2007T`
TO_TIMESTAMP('2007-02-23T12:14:33.079-08:00') -- `2007-02-23T12:14:33.079-08:00`
```

## UTCNOW
<a name="s3-select-sql-reference-utcnow"></a>

`UTCNOW` 傳回 UTC 目前時間做為時間戳記。

### 語法
<a name="s3-select-sql-reference-utcnow-syntax"></a>

```
UTCNOW()
```

### Parameters
<a name="s3-select-sql-reference-utcnow-parameters"></a>

`UTCNOW` 未取得參數。

### 範例
<a name="s3-select-sql-reference-utcnow-examples"></a>

```
UTCNOW() -- 2017-10-13T16:02:11.123Z
```

# 字串函數
<a name="s3-select-sql-reference-string"></a>

**重要**  
Amazon S3 Select 不再提供給新客戶。Amazon S3 Select 的現有客戶可以繼續照常使用此功能。[進一步了解](https://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/) 

Amazon S3 Select 支援下列字串函數。

**Topics**
+ [

## CHAR\$1LENGTH, CHARACTER\$1LENGTH
](#s3-select-sql-reference-char-length)
+ [

## LOWER
](#s3-select-sql-reference-lower)
+ [

## SUBSTRING
](#s3-select-sql-reference-substring)
+ [

## TRIM
](#s3-select-sql-reference-trim)
+ [

## UPPER
](#s3-select-sql-reference-upper)

## CHAR\$1LENGTH, CHARACTER\$1LENGTH
<a name="s3-select-sql-reference-char-length"></a>

`CHAR_LENGTH` (或 `CHARACTER_LENGTH`) 計數指定字串內的字元數。

**注意**  
`CHAR_LENGTH` 和 `CHARACTER_LENGTH` 為同義詞。

### 語法
<a name="s3-select-sql-reference-char-length-syntax"></a>

```
CHAR_LENGTH ( string )
```

### Parameters
<a name="s3-select-sql-reference-char-length-parameters"></a>

 *`string`*   
該函數對其運作的目標字串。

### 範例
<a name="s3-select-sql-reference-char-length-examples"></a>

```
CHAR_LENGTH('')          -- 0
CHAR_LENGTH('abcdefg')   -- 7
```

## LOWER
<a name="s3-select-sql-reference-lower"></a>

考量到字串，`LOWER` 將所有大寫字元轉換為小寫字元。任何非大寫的字元則保持不變。

### 語法
<a name="s3-select-sql-reference-lower-syntax"></a>

```
LOWER ( string )
```

### Parameters
<a name="s3-select-sql-reference-lower-parameters"></a>

 **`string`**   
該函數對其運作的目標字串。

### 範例
<a name="s3-select-sql-reference-lower-examples"></a>

```
LOWER('AbCdEfG!@#$') -- 'abcdefg!@#$'
```

## SUBSTRING
<a name="s3-select-sql-reference-substring"></a>

考量到字串、開始索引，與選擇性地長度，`SUBSTRING` 傳回從開始索引到高達字串結尾，或高達提供長度的子字串。

**注意**  
輸入字串的第一種字元索引位置為 1。  
 如果 `start` < 1，沒有指定長度，則索引位置設定為 1。
 如果 `start` < 1，有指定長度，則索引位置設定為 `start + length -1`。
 如果`start + length -1` < 0，則會傳回一個空字串。
 如果 `start + length -1` > = 0，將被傳回從索引位置 1 開始的子字串，長度為 `start + length - 1`。

### 語法
<a name="s3-select-sql-reference-substring-syntax"></a>

```
SUBSTRING( string FROM start [ FOR length ] )
```

### Parameters
<a name="s3-select-sql-reference-substring-parameters"></a>

 **`string`**   
該函數對其運作的目標字串。

 **`start`**   
字串的開始位置。

 **`length`**   
要傳回的子字串長度。如果不存在，請移至字串結尾。

### 範例
<a name="s3-select-sql-reference-substring-examples"></a>

```
SUBSTRING("123456789", 0)      -- "123456789"
SUBSTRING("123456789", 1)      -- "123456789"
SUBSTRING("123456789", 2)      -- "23456789"
SUBSTRING("123456789", -4)     -- "123456789"
SUBSTRING("123456789", 0, 999) -- "123456789" 
SUBSTRING("123456789", 1, 5)   -- "12345"
```

## TRIM
<a name="s3-select-sql-reference-trim"></a>

從字串裁剪字首或字尾字元。要移除的預設字元是空間 (`' '`)。

### 語法
<a name="s3-select-sql-reference-trim-syntax"></a>

```
TRIM ( [[LEADING | TRAILING | BOTH remove_chars] FROM] string )
```

### Parameters
<a name="s3-select-sql-reference-trim-parameters"></a>

 **`string`**   
該函數對其運作的目標字串。

 `LEADING` \$1 `TRAILING` \$1 `BOTH`   
此參數表示裁剪的是字首或字尾字元，或字首和字尾字元兩者。

 **`remove_chars`**   
要移除的一組字元。`remove_chars` 可以是長度 > 1 的字串。此函數會從遭移除之字串的開始或結束時找到的 `remove_chars` 傳回含任何字元的字串。

### 範例
<a name="s3-select-sql-reference-trim-examples"></a>

```
TRIM('       foobar         ')               -- 'foobar'
TRIM('      \tfoobar\t         ')            -- '\tfoobar\t'
TRIM(LEADING FROM '       foobar         ')  -- 'foobar         '
TRIM(TRAILING FROM '       foobar         ') -- '       foobar'
TRIM(BOTH FROM '       foobar         ')     -- 'foobar'
TRIM(BOTH '12' FROM '1112211foobar22211122') -- 'foobar'
```

## UPPER
<a name="s3-select-sql-reference-upper"></a>

考量到字串，`UPPER` 將所有小寫字元轉換為大寫字元。任何非小寫的字元則保持不變。

### 語法
<a name="s3-select-sql-reference-upper-syntax"></a>

```
UPPER ( string )
```

### Parameters
<a name="s3-select-sql-reference-upper-parameters"></a>

 **`string`**   
該函數對其運作的目標字串。

### 範例
<a name="s3-select-sql-reference-upper-examples"></a>

```
UPPER('AbCdEfG!@#$') -- 'ABCDEFG!@#$'
```