

# 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 命令。`SELECT` 支持以下 ANSI 标准子句：


+ `SELECT` list
+ `FROM` 子句 
+ `WHERE` 子句
+ `LIMIT` 子句

**注意**  
Amazon S3 Select 查询目前不支持子查询或联接。

## SELECT list
<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**  
**示例：**  
*示例 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 子句
<a name="s3-select-sql-reference-where"></a>

`WHERE` 子句遵循以下语法：

```
WHERE condition
```

`WHERE` 子句根据 `condition` 筛选行。condition 是具有布尔结果的表达式。只有 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` 的行的第 *N* 列，其中 *`N`* 是列位置。位置计数从 1 开始。例如，第一列名为 `_1`，第二列名为 `_2`。

  您可以通过 `_N` 或 `alias._N` 引用列。例如，`_2` 和 `myAlias._2` 都是有效的，都可用于引用 `SELECT` 列表中的列和 `WHERE` 子句。
+ **Column Headers (列标头)** – 对于具有标头行的 CSV 格式的对象，可在 `SELECT` 列表和 `WHERE` 子句中使用这些标头。尤其在传统 SQL 的 `SELECT` 和 `WHERE` 子句表达式中，可以通过 `alias.column_name` 或 `column_name` 引用列。

### JSON
<a name="s3-select-sql-reference-attribute-access-json"></a>
+ **Document (文档)** – 可将 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"}
  ```

## 标头和属性名称的区分大小写
<a name="s3-select-sql-reference-case-sensitivity"></a>

借助 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` 的标头或属性和另一个包含 `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) 带有指定列标头和对于查询请求将 `FileHeaderInfo` 设置为 `"Use"` 的 CSV 格式的 Amazon S3 对象；或 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` | 范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 的 8 字节有符号整数。 | `100000` | 
| `string` | UTF8 编码的长度可变的字符串。原定设置限制为 1 个字符。最大字符限制为 2,147,483,647。 | `'xyz'` | 
| `float` | 8 字节浮点数。 | `CAST(0.456 AS FLOAT)` | 
| `decimal`, `numeric` |  Base-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 Select 运行 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` 表达式以在查询中将 `New York City` 替换为 `Big Apple`。将所有其他城市名称替换为 `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` 按顺序评估参数并返回第一个非未知值，即第一个非空或非缺失值。此函数无法传播空值和缺失值。

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

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

### 参数
<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 )
```

### 参数
<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 )
```

### 参数
<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 )
```

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

*`date_part`*   
指定要修改的日期部分。这可能是以下值之一：  
+ 年
+ 个月
+ day
+ 小时
+ minute
+ 秒

 *`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 )
```

### 参数
<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 )
```

### 参数
<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 )
```

### 参数
<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_cn/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 )
```

### 参数
<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()
```

### 参数
<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 )
```

### 参数
<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 )
```

### 参数
<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 ] )
```

### 参数
<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 )
```

### 参数
<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 )
```

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

 **`string`**   
对其执行函数的目标字符串。

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

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