

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。如需詳細資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

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

# SQL 參考
<a name="cm_chap_SQLCommandRef"></a>

透過 Amazon Redshift 即可利用 SQL 有效率地查詢和分析儲存在資料倉儲中的大量資料。SQL 參考涵蓋 SQL 命令、資料類型、函數、運算子等的語法和用法，讓您能夠取得深入分析並作出資料驅動的決策。您可以查看此參考來編寫最佳化的查詢、建立和管理資料庫物件，以及執行複雜的資料轉換。下列參考提供在 Amazon Redshift 環境內使用 SQL 來滿足資料分析需求的完整詳細資訊。

**Topics**
+ [Amazon Redshift SQL](c_redshift-sql.md)
+ [使用 SQL](c_SQL_reference.md)
+ [SQL 命令](c_SQL_commands.md)
+ [SQL 函數參考](c_SQL_functions.md)
+ [保留字](r_pg_keywords.md)

# Amazon Redshift SQL
<a name="c_redshift-sql"></a>

**Topics**
+ [領導節點上所支援的 SQL 函數](c_sql-functions-leader-node.md)
+ [Amazon Redshift 和 PostgreSQL](c_redshift-and-postgres-sql.md)

Amazon Redshift 是以業界標準 SQL 為基礎所建置的，並新增功能，用來管理超大資料集，和支援對這些資料的高效能分析與報告。

**注意**  
單一 Amazon Redshift SQL 陳述式的大小上限為 16 MB。

# 領導節點上所支援的 SQL 函數
<a name="c_sql-functions-leader-node"></a>

某些 Amazon Redshift 查詢會分配到運算節點上執行，其他的查詢則是只在領導節點上執行。

每當查詢參考使用者建立的資料表或系統資料表 (具有 STL 或 STV 字首的資料表，以及具有 SVL 或 SVV 字首的系統畫面) 時，領導節點就會將 SQL 分送到運算節點。查詢如果只參考目錄資料表 (具有 PG 字首的資料表，例如 PG\$1TABLE\$1DEF，儲存於領導節點上)，或是未參考任何資料表，就只會在領導節點上執行。

某些 Amazon Redshift SQL 函數只有在領導者節點上才支援，在運算節點上不支援。使用領導者節點函數的查詢必須完全在領導者節點上執行，而不是在運算節點上，否則會傳回錯誤。

必須只在領導節點上執行的每個函數，其文件包含備註，說明如果函數參考使用者定義的資料表或 Amazon Redshift 系統資料表，將會傳回錯誤。關於只在領導節點上執行的功能，如需功能清單，請參閱 [僅限領導節點函數](c_SQL_functions_leader_node_only.md)。

## 範例
<a name="c_sql-functions-leader-node-examples"></a>

下列範例使用 TICKIT 資料庫為例。如需範例資料庫的詳細資訊，請前往 [範本資料庫](c_sampledb.md)。

**CURRENT\$1SCHEMA**

CURRENT\$1SCHEMA 是只限領導節點的函式。在此範例中，查詢並未參考資料表，因此只會在領導節點上執行。

```
select current_schema();
            
current_schema
---------------
public
```

在下一個範例中，查詢參考了系統目錄資料表，因此只會在領導節點上執行。

```
select * from pg_table_def
where schemaname = current_schema() limit 1;

 schemaname | tablename | column |   type   | encoding | distkey | sortkey | notnull
------------+-----------+--------+----------+----------+---------+---------+---------
 public     | category  | catid  | smallint | none     | t       |       1 | t
```

在下一個範例中，查詢參考了位於運算節點上的 Amazon Redshift 系統資料表，因此會傳回錯誤。

```
select current_schema(), userid from users;

INFO:  Function "current_schema()" not supported.
ERROR:  Specified types or functions (one per INFO message) not supported on Amazon Redshift tables.
```

**SUBSTR**

SUBSTR 也是一個僅限於領導節點函數。在以下範例中，因查詢未參考資料表，所以只會在領導節點上執行。

```
SELECT SUBSTR('amazon', 5);
            
+--------+
| substr |
+--------+
| on     |
+--------+
```

在下列範例中，查詢會參照位於運算節點上的資料表。這會導致錯誤。

```
SELECT SUBSTR(catdesc, 1) FROM category LIMIT 1;
            
ERROR: SUBSTR() function is not supported (Hint: use SUBSTRING instead)
```

若要成功執行先前的查詢，請使用 [SUBSTRING](https://docs.aws.amazon.com/redshift/latest/dg/r_SUBSTRING.html)。

```
SELECT SUBSTRING(catdesc, 1) FROM category LIMIT 1;
            
+---------------------------------+
|            substring            |
+---------------------------------+
| National Basketball Association |
+---------------------------------+
```

**FACTORIAL()**

FACTORIAL() 是僅限於領導節點函數。在以下範例中，因查詢未參考資料表，所以只會在領導節點上執行。

```
SELECT FACTORIAL(5);           

 factorial 
-------------
 120
```

在下列範例中，查詢會參照位於運算節點上的資料表。使用查詢編輯器 v2 執行時，這會導致錯誤。

```
create table t(a int);
insert into t values (5);
select factorial(a) from t;           

ERROR: Specified types or functions (one per INFO message) not supported on Redshift tables.
Info: Function "factorial(bigint)" not supported.
```

# Amazon Redshift 和 PostgreSQL
<a name="c_redshift-and-postgres-sql"></a>

**Topics**
+ [Amazon Redshift 和 PostgreSQL JDBC 和 ODBC](c_redshift-postgres-jdbc.md)
+ [以不同方式建置的功能](c_redshift-sql-implementated-differently.md)
+ [不支援的 PostgreSQL 功能](c_unsupported-postgresql-features.md)
+ [不支援的 PostgreSQL 資料類型](c_unsupported-postgresql-datatypes.md)
+ [不支援的 PostgreSQL 函數](c_unsupported-postgresql-functions.md)

Amazon Redshift 是以 PostgreSQL 為基礎。在設計和開發您的資料倉儲應用程式時，您必須知道 Amazon Redshift 與 PostgreSQL 之間有多項重要的差異。

Amazon Redshift 是專門針對線上分析處理 (OLAP) 和商業智慧 (BI) 應用所設計的，這些應用需要對龐大的資料集進行複雜的查詢。由於 Amazon Redshift 是用來滿足極為不同的需求，因此所使用的專業資料儲存體架構和查詢執行引擎，和 PostgreSQL 實作完全不同。例如，線上交易處理 (OLTP) 應用程式通常將資料儲存在列中，而 Amazon Redshift 則把資料儲存在欄中，並使用專門的資料壓縮編碼來實現最佳記憶體使用和磁碟 I/O。為了提高效能，一些適合較小規模 OLTP 處理的 PostgreSQL 功能 (例如次要索引和高效的單列資料操作操作) 已被省略。

如需 Amazon Redshift 資料倉儲系統架構的詳細說明，請參閱[Amazon Redshift 架構](c_redshift_system_overview.md)。

PostgreSQL 9.x 包含了一些 Amazon Redshift 未支援的功能。此外，Amazon Redshift SQL 和 PostgreSQL 之間有幾項重要的差異，是您必須知道的。本節重點介紹了 Amazon Redshift 和 PostgreSQL 之間的差異，並提供開發資料倉儲的指導方針，以充分善用 Amazon Redshift SQL 實作。

# Amazon Redshift 和 PostgreSQL JDBC 和 ODBC
<a name="c_redshift-postgres-jdbc"></a>

 由於 Amazon Redshift 是以 PostgreSQL 為基礎，因此我們先前建議使用 JDBC4 Postgresql 驅動程式版本 8.4.703 和 psqlODBC 版本 9.x 驅動程式。如果您目前正在使用這些驅動程式，我們建議今後移至新的 Amazon Redshift 專屬驅動程式。如需驅動程式和設定連線的相關資訊，請參閱《Amazon Redshift 管理指南》**中的[適用於 Amazon Redshift 的 JDBC 和 ODBC 驅動程式](https://docs.aws.amazon.com/redshift/latest/mgmt/configuring-connections.html#connecting-drivers)。

使用 JDBC 擷取龐大的資料集時，為避免發生用戶端記憶體不足的錯誤，您可以藉由設定 JDBC 擷取大小的參數，來讓用戶端透過批次方式擷取資料。如需詳細資訊，請參閱[設定 JDBC 擷取大小參數](set-the-JDBC-fetch-size-parameter.md)。

Amazon Redshift 無法辨識 JDBC maxRows 參數。請改為指定 [LIMIT](r_ORDER_BY_clause.md#order-by-clause-limit) 子句來限制結果集。您也可以使用 [OFFSET](r_ORDER_BY_clause.md#order-by-clause-offset) 子句，來跳到結果集中的指定起點。

# 以不同方式建置的功能
<a name="c_redshift-sql-implementated-differently"></a>

許多的 Amazon Redshift SQL 語言元素具有不同的效能特性，而且所使用的語法和語意，也和同等 PostgreSQL 實作非常不同。

**重要**  
請勿假設 Amazon Redshift 和 PostgreSQL 共通的元素具有相同的語意。請務必參考《Amazon Redshift 開發人員指南》**的 [SQL 命令](c_SQL_commands.md)，以了解細微的差異。

一個特別的例子是 [VACUUM](r_VACUUM_command.md) 命令，這是用來清理和重整資料表。VACUUM 具有不同的功能，而且使用與 PostgreSQL 版本不同的一組參數。如需在 Amazon Redshift 中使用 VACUUM 的詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

資料庫管理的功能和工具也經常有所不同。例如，Amazon Redshift 會維持一組系統資料表和檢視，這些項目提供關於系統運作狀況的資訊。如需詳細資訊，請參閱[SYS 監控檢視](serverless_views-monitoring.md)。

下列清單包含了一些 SQL 功能的範例，這些功能在 Amazon Redshift 中以不同的方式建置。
+  [CREATE TABLE](r_CREATE_TABLE_NEW.md) 

  Amazon Redshift 不支援資料表空間、資料表分割、繼承和某些限制。CREATE TABLE 的 Amazon Redshift 實作可讓您定義資料表的排序與分佈演算法，以實現最佳化的平行處理。

  Amazon Redshift Spectrum 支援使用 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 命令來分割資料表。
+  [ALTER TABLE](r_ALTER_TABLE.md) 

  僅支援 ALTER COLUMN 動作的子集。

  ADD COLUMN 支援在每個 ALTER TABLE 陳述式中只新增一欄。
+  [COPY](r_COPY.md) 

  Amazon Redshift COPY 是高度專門的命令，可用來從 Amazon S3 儲存貯體和 Amazon DynamoDB 資料表載入資料，以便於自動壓縮作業的進行。如需詳細資訊，請參閱 [在 Amazon Redshift 中載入資料](t_Loading_data.md) 區段和 COPY 指令參考。
+  [VACUUM](r_VACUUM_command.md) 

  VACUUM 所使用的參數完全不同。例如，PostgreSQL 中的預設 VACUUM 操作，只會回收空間，以供重複使用；但是，Amazon Redshift 中預設的 VACUUM 操作為 VACUUM FULL，這項操作會回收磁碟空間，並將所有列重新排序。
+ 在比較字串值時，會忽略 VARCHAR 值中多餘的空格。如需詳細資訊，請參閱[多餘空格的意義](r_Character_types.md#r_Character_types-significance-of-trailing-blanks)。

# 不支援的 PostgreSQL 功能
<a name="c_unsupported-postgresql-features"></a>

在 Amazon Redshift 中不支援下列的 PostgreSQL 功能。

**重要**  
請勿假設 Amazon Redshift 和 PostgreSQL 共通的元素具有相同的語意。請務必參考《Amazon Redshift 開發人員指南》**的 [SQL 命令](c_SQL_commands.md)，以了解細微的差異。
+ 不支援查詢工具 *psql*。支援 [Amazon Redshift RSQL](https://docs.aws.amazon.com/redshift/latest/mgmt/rsql-query-tool.html) 用戶端。
+ 資料表分割 (範圍與列表分割)
+ 資料表空間
+ Constraints
  + 唯一
  + 外部索引鍵
  + 主索引鍵
  + 檢查限制
  + 排除限制

  允許唯一、主索引鍵和外部索引鍵的限制，但這些只是參考資訊。系統不會強制執行這些限制，不過查詢規劃器會使用這些限制。
+ 繼承
+ PostgreSQL 系統欄

  Amazon Redshift SQL 不會隱含地定義系統欄。但是，下列 PostgreSQL 系統欄的名稱不能做為使用者定義欄的名稱使用：`oid`、`tableoid`、`xmin`、`cmin`、`xmax`、`cmax` 和 `ctid`。如需詳細資訊，請參閱 [https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html](https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html)。
+ 索引
+ Window 函式中的 NULLS 子句
+ 定序

  Amazon Redshift 不支援地區特定或使用者定義的定序句。請參閱 [定序序列](c_collation_sequences.md)。
+ 值表達式
  + 註標表達式
  + 陣列建構子
  + 列建構子
+ 觸發
+ 外部資料管理 (SQL/MED)
+ 資料表函式
+ 做為常數表使用的 VALUES 清單
+ 序列
+ 全文檢索搜尋
+ RULE 和 TRIGGER 許可。

  當您執行 GRANT ALL 或 REVOKE ALL 時，Amazon Redshift 會授予或撤銷這些許可，但 RULE 和 TRIGGER 許可是否存在，並不會對承授者的存取許可造成任何影響。

# 不支援的 PostgreSQL 資料類型
<a name="c_unsupported-postgresql-datatypes"></a>

一般而言，如果查詢嘗試使用不支援的資料類型 (包括明確或隱含轉換)，將會傳回錯誤。不過，使用不支援資料類型的某些查詢，將可在領導節點上執行，但無法在運算節點上執行。請參閱 [領導節點上所支援的 SQL 函數](c_sql-functions-leader-node.md)。

 如需支援的資料類型清單，請參閱 [資料類型](c_Supported_data_types.md)。

在 Amazon Redshift 中不支援下列的 PostgreSQL 資料類型。
+ 陣列
+ BIT、BIT VARYING
+ BYTEA
+ 複合類型
+ 列舉類型
+ 幾何類型 (Amazon Redshift 的幾何類型實作與 PostgreSQL 不同)
+ HSTORE
+ JSON
+ 網路位址類型
+ 數值類型
  + SERIAL、BIGSERIAL、SMALLSERIAL
  + MONEY
+ 物件識別碼類型
+ 虛擬類型
+ 範圍類型
+ 特殊字元類型
  + "char" - 單位元組的內部類型 (其中名為 char 的資料類型會用引號括住)。
  + name - 物件名稱的內部類型。

  如需這些類型的相關資訊，請參閱 PostgreSQL 文件中的 [Special Character Types](https://www.postgresql.org/docs/8.0/datatype-character.html)。
+ 文字搜尋類型
+ TXID\$1SNAPSHOT
+ UUID
+ XML

# 不支援的 PostgreSQL 函數
<a name="c_unsupported-postgresql-functions"></a>

許多未排除的函式具有不同的語意或用法。例如，某些支援的函式只會在領導節點上執行。此外，某些不支援的函式在領導節點上執行時，不會傳回錯誤。這些函數在某些情況中不會傳回錯誤的事實，不應視為 Amazon Redshift 支援這些函數。

**重要**  
請勿假設 Amazon Redshift 和 PostgreSQL 共通的元素具有相同的語意。請務必參考《Amazon Redshift 資料庫開發人員指南》**的 [SQL 命令](c_SQL_commands.md)，以了解細微的差異。

 如需詳細資訊，請參閱[領導節點上所支援的 SQL 函數](c_sql-functions-leader-node.md)。

在 Amazon Redshift 中不支援下列的 PostgreSQL 函數。
+ 存取權限查詢函式
+ 建議鎖函式
+ 彙總函數
  + STRING\$1AGG()
  + ARRAY\$1AGG()
  + EVERY()
  + XML\$1AGG()
  + CORR()
  + COVAR\$1POP()
  + COVAR\$1SAMP()
  + REGR\$1AVGX()、REGR\$1AVGY()
  + REGR\$1COUNT()
  + REGR\$1INTERCEPT()
  + REGR\$1R2()
  + REGR\$1SLOPE()
  + REGR\$1SXX()、REGR\$1SXY()、REGR\$1SYY()
+ 陣列函數和運算子
+ 備份控制函式
+ 註解資訊函式
+ 資料庫物件位置函式
+ 資料庫物件大小函式
+ 日期/時間函式與運算子
  + CLOCK\$1TIMESTAMP()
  + JUSTIFY\$1DAYS()、JUSTIFY\$1HOURS()、JUSTIFY\$1INTERVAL()
  + PG\$1SLEEP()
  + TRANSACTION\$1TIMESTAMP()
+ ENUM 支援函式
+ 幾何函式與運算子
+ 通用檔案存取函式
+ IS DISTINCT FROM
+ 網路位址函式與運算子
+ 數學函式
  + DIV()
  + SETSEED()
  + WIDTH\$1BUCKET()
+ 結果集傳回函式
  + GENERATE\$1SERIES()
  + GENERATE\$1SUBSCRIPTS()
+ 範圍函式與運算子
+ 復原控制函式
+ 復原資訊函式
+ ROLLBACK TO SAVEPOINT 函式
+ 結構描述可見性查詢函式
+ 伺服器發訊函式
+ 快照同步函式
+ 序列處理函式
+ 字串函數
  + BIT\$1LENGTH()
  + OVERLAY()
  + CONVERT()、CONVERT\$1FROM()、CONVERT\$1TO()
  + ENCODE()
  + FORMAT()
  + QUOTE\$1NULLABLE()
  + REGEXP\$1MATCHES()
  + REGEXP\$1SPLIT\$1TO\$1ARRAY()
  + REGEXP\$1SPLIT\$1TO\$1TABLE()
+ 系統目錄資訊函式
+ 系統資訊函數
  + CURRENT\$1CATALOG CURRENT\$1QUERY()
  + INET\$1CLIENT\$1ADDR()
  + INET\$1CLIENT\$1PORT()
  + INET\$1SERVER\$1ADDR() INET\$1SERVER\$1PORT()
  + PG\$1CONF\$1LOAD\$1TIME()
  + PG\$1IS\$1OTHER\$1TEMP\$1SCHEMA()
  + PG\$1LISTENING\$1CHANNELS()
  + PG\$1MY\$1TEMP\$1SCHEMA()
  + PG\$1POSTMASTER\$1START\$1TIME()
  + PG\$1TRIGGER\$1DEPTH()
  + SHOW VERSION()
+ 文字搜尋函式與運算子
+ 異動 ID 與快照函式
+ 觸發函數
+ XML 函式

# 使用 SQL
<a name="c_SQL_reference"></a>

**Topics**
+ [SQL 參考慣例](c_SQL_reference_conventions.md)
+ [基本元素](c_Basic_elements.md)
+ [表達式](r_expressions.md)
+ [條件](r_conditions.md)

SQL 語言包含指令與函式，可用來操作資料庫與資料庫物件。此語言也會針對資料類型、表達式和常值的使用，來強制執行規則。

# SQL 參考慣例
<a name="c_SQL_reference_conventions"></a>

本節針對在 SQL 參考章節中所說明的 SQL 表達式、指令與函式，說明撰寫其語法時所使用的慣例。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_SQL_reference_conventions.html)

# 基本元素
<a name="c_Basic_elements"></a>

**Topics**
+ [名稱與識別碼](r_names.md)
+ [文字](r_Literals.md)
+ [Null](r_Nulls.md)
+ [資料類型](c_Supported_data_types.md)
+ [定序序列](c_collation_sequences.md)

本節針對資料庫物件名稱、常值、null 及資料類型，說明了使用的規則。

# 名稱與識別碼
<a name="r_names"></a>

名稱可用來識別資料庫物件，包括資料表和資料欄，以及使用者和密碼。*名稱*和*識別碼*這兩個詞可互換使用。識別碼有兩種：標準識別碼和引號 (或區隔) 識別碼。識別碼必須只能包含 UTF-8 可列印字元。標準識別碼和區隔識別碼中的 ASCII 字母，應區分大小寫，而且在資料庫中轉換為小寫。在查詢結果中，欄的名稱預設會以小寫傳回。若要以大寫傳回欄的名稱，請將 [describe\$1field\$1name\$1in\$1uppercase](r_describe_field_name_in_uppercase.md) 組態參數設定為 **true**。

## 標準識別碼
<a name="r_names-standard-identifiers"></a>

標準 SQL 識別碼需遵守一套規則，而且必須：
+ 開頭為 ASCII 單位元組字母字元、底線字元或 UTF-8 多位元組字元 (長度 2 到 4 位元組)。
+ 後續的字元可以是 ASCII 單位元組字母字元、底線字元、金額符號或 UTF-8 多位元組字元 (長度 2 到 4 位元組)。
+ 讓長度介於 1 到 127 個位元組之間，不包括區隔識別碼的引號。
+ 不包含引號和空格。
+ 不能是保留的 SQL 關鍵字。

## 區隔識別碼
<a name="r_names-delimited-identifiers"></a>

區隔識別碼 (也稱為引號識別碼) 是以雙引號 (") 開頭和結尾。如果使用區隔識別碼，則每次參考該物件，都必須使用雙引號。除了雙引號本身以外，識別碼可包含任何標準 UTF-8 可列印字元。因此，您可以建立欄或資料表的名稱，其中包含無效字元，例如空格或百分比符號。

區隔識別碼中的 ASCII 字母，應區分大小寫，並且轉換為小寫。若要在字串中使用雙引號，必須在其前面加上另一個雙引號字元。

## 區分大小寫的識別碼
<a name="r_names-case-sensitive-identifiers"></a>

區分大小寫的識別碼 (也稱為混合大小寫識別碼) 可以同時包含大寫和小寫字母。若要使用區分大小寫的識別碼，您可以將組態 `enable_case_sensitive_identifier` 設定為 `true`。您可以為叢集或工作階段設定此組態。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[預設參數值](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-parameter-groups.html#default-param-group-values)和[enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md)。

## 系統欄名稱
<a name="r_names-system-column-names"></a>

下列 PostgreSQL 系統欄名稱不能做為使用者定義欄的欄名稱使用。如需詳細資訊，請參閱 [https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html](https://www.postgresql.org/docs/8.0/static/ddl-system-columns.html)。
+ `oid`
+ `tableoid`
+ `xmin`
+ `cmin`
+ `xmax`
+ `cmax`
+ `ctid`

## 範例
<a name="r_names-examples"></a>

下表顯示區隔識別碼的範例、產生的輸出和說明：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_names.html)

若要建立名為 group 的資料表，而且此資料表包含名為 this "is it" 的欄：

```
create table "group" (
"This ""IS IT""" char(10));
```

下列的查詢會傳回相同的結果：

```
select "This ""IS IT"""
from "group";

this "is it"
--------------
(0 rows)
```

```
select "this ""is it"""
from "group";

this "is it"
--------------
(0 rows)
```

下列的完整 `table.column` 語法，也會傳回相同的結果：

```
select "group"."this ""is it"""
from "group";

this "is it"
--------------
(0 rows)
```

下列的 CREATE TABLE 命令會建立資料欄名稱中有一條斜線的資料表：

```
create table if not exists city_slash_id(
                  "city/id" integer not null,
                  state char(2) not null);
```

# 文字
<a name="r_Literals"></a>

常值或常數是固定的資料值，由一系列的字元或數值常數構成。Amazon Redshift 支援多種類型的常值，包括：
+ 整數的數值常值、小數和符點數。如需詳細資訊，請參閱[整數常值與浮點字面值](r_numeric_literals201.md)。
+ 字元常值，也稱為字串、字元字串或字元常數
+ 日期時間 (datetime) 與間隔常值，搭配 datetime 資料類型使用。如需詳細資訊，請參閱[日期、時間和時間戳記常值](r_Date_and_time_literals.md)及[間隔資料類型和常值](r_interval_data_types.md)。

# Null
<a name="r_Nulls"></a>

如果列所在的欄遺漏、未知或不適用，則此欄為 null 值，或是包含 null。Null 可以出現在任何資料類型的欄位中，而且不受主索引鍵或 NOT NULL 限制的限制。Null 不等於 0 值，也不等於空字串。

任何包含 null 的數學表達式，所求得的結果一律為 null。給予 null 引數或運算元時，所有運算子都會傳回 null。

若要檢定 null，請使用比較條件 IS NULL 和 IS NOT NULL。由於 null 代表缺少資料，因此 null 不等於任何值，也不等於另一個 null。

# 資料類型
<a name="c_Supported_data_types"></a>

**Topics**
+ [多位元組字元](#c_Supported_data_types-multi-byte-characters)
+ [數值類型](r_Numeric_types201.md)
+ [字元類型](r_Character_types.md)
+ [日期時間 (Datetime) 類型](r_Datetime_types.md)
+ [布林值 (Boolean) 類型](r_Boolean_type.md)
+ [HLLSKETCH 類型](r_HLLSKTECH_type.md)
+ [SUPER 類型](r_SUPER_type.md)
+ [VARBYTE 類型](r_VARBYTE_type.md)
+ [類型相容性與轉換](#r_Type_conversion)

Amazon Redshift 所儲存或擷取的每個值，都具有資料類型，而資料類型具有一組固定的相關屬性。資料類型會在資料表建立時宣告，用來限制欄或引數可包含的一組值。

下表列出您可以在 Amazon Redshift 中使用的資料類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_Supported_data_types.html)

**注意**  
如需 "char" (請注意，char 會用引號括住) 等不支援資料類型的相關資訊，請參閱[不支援的 PostgreSQL 資料類型](c_unsupported-postgresql-datatypes.md)。

## 多位元組字元
<a name="c_Supported_data_types-multi-byte-characters"></a>

VARCHAR 資料類型支援最多 4 個位元組的 UTF-8 多位元組字元，不支援 5 個位元組或更長的字元。若要針對包含多位元組字元的 VARCHAR 資料欄，計算其大小，請將字元數乘以每個字元的位元組數。例如，如果字串包含 4 個中文字，而每個字的長度是 3 個位元組，那麼您將需要使用 VARCHAR(12) 資料欄來儲存這個字串。

VARCHAR 資料類型不支援下列無效的 UTF-8 碼位：

`0xD800 – 0xDFFF` (位元組序列：`ED A0 80` - `ED BF BF`)

CHAR 資料類型不支援多位元組字元。

# 數值類型
<a name="r_Numeric_types201"></a>

**Topics**
+ [整數類型](#r_Numeric_types201-integer-types)
+ [DECIMAL 或 NUMERIC 類型](#r_Numeric_types201-decimal-or-numeric-type)
+ [關於使用 128 位元 DECIMAL 或 NUMERIC 資料欄的備註](#r_Numeric_types201-notes-about-using-128-bit-decimal-or-numeric-columns)
+ [浮點類型](#r_Numeric_types201-floating-point-types)
+ [數值的計算](r_numeric_computations201.md)
+ [整數常值與浮點字面值](r_numeric_literals201.md)
+ [數值類型範例](r_Examples_with_numeric_types201.md)

數值資料類型包括整數、小數和符點數。

## 整數類型
<a name="r_Numeric_types201-integer-types"></a>

使用 SMALLINT、INTEGER 和 BIGINT 資料類型來儲存各種範圍的整數。您不能儲存超出每種類型允許範圍的值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Numeric_types201.html)

## DECIMAL 或 NUMERIC 類型
<a name="r_Numeric_types201-decimal-or-numeric-type"></a>

使用 DECIMAL 或 NUMERIC 資料類型，以*使用者定義的精確度*來儲存數值。DECIMAL 和 NUMERIC 關鍵字可互換使用。在本文件中，*小數*是此資料類型的首選用詞。*數值*一詞通常是用來指稱整數、小數和浮點資料類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Numeric_types201.html)

藉由指定 *precision* 和 *scale*，來定義資料表中的 DECIMAL 欄：

```
decimal(precision, scale)
```

 *precision*   
整個值中有效位數的總數：小數點兩邊的位數數量。例如，數字 `48.2891` 的精確度 (有效位數) 為 6，小數位數為 4。如果未指定，預設的精確度為 18，最高精確度為 38。  
 如果在輸入值中，小數點左邊的位數數目，超過資料欄的精確度減去其小數位數，就無法將此值複製 (或插入或更新) 到資料欄中。此規則適用於超出資料欄定義範圍之外的任何值。例如，`numeric(5,2)` 欄的值，其允許的範圍為 `-999.99` 到 `999.99`。

 *scale*   
數值小數部分中，位於小數點右邊的小數位數數目。整數的小數位數為 0。在資料欄的規格中，小數位數的值必須小於或等於精確度的值。如果未指定，預設的小數位數為 0，最大的小數位數為 37。  
如果載入資料表的輸入值，其小數位數大於資料欄的小數位數，則此值會四捨五入至指定的小數位數。例如，SALES 資料表中的 PRICEPAID 資料欄為 DECIMAL(8,2) 資料欄。如果將 DECIMAL(8,4) 值插入 PRICEPAID 資料欄，會將此值四捨五入為 2 個小數位數。  

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 不過，從資料表所選取值的明確轉換結果，不會四捨五入。

**注意**  
可以插入 DECIMAL(19,0) 資料欄的正數值上限為 `9223372036854775807` (263 -1)。負數值上限為 `-9223372036854775808`。例如，如果試圖插入數值 `9999999999999999999` (19 個 9)，將會造成溢位錯誤。無論小數點的位置何在，Amazon Redshift 可以表示為 DECIMAL 數值的最大字串是 `9223372036854775807`。例如，可以載入 DECIMAL(19,18) 資料欄的最大值為 `9.223372036854775807`。  
這些規則是因為具有 19 個或更少有效位數有效位數的 DECIMAL 值會在內部儲存為 8 位元組整數，而具有 20 到 38 位有效位數的 DECIMAL 值則儲存為 16 位元組整數。

## 關於使用 128 位元 DECIMAL 或 NUMERIC 資料欄的備註
<a name="r_Numeric_types201-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

除非您確定應用程式需要該精確度，否則請勿任意指派最大有效位數給 DECIMAL 欄。128 位元值使用的磁碟空間是 64 位元值的兩倍，而且可能會減慢查詢執行時間。

## 浮點類型
<a name="r_Numeric_types201-floating-point-types"></a>

使用 REAL 和 DOUBLE PRECISION 資料類型，以*可變精確度*來儲存數值。這些是*不精確*的類型，代表某些數值會以近似值儲存，因此在儲存和傳回特定值時，可能會造成些微的出入。如果您需要精確的儲存和計算 (例如貨幣金額)，請使用 DECIMAL 資料類型。

REAL 代表遵循二進位浮點數運算之 IEEE 標準 754 的單精確度浮點格式。它具有大約 6 位數的精確度，並且範圍約為 1E-37 到 1E\$137。您也可以將此資料類型指定為 FLOAT4。

DOUBLE PRECISION 代表遵循二進位浮點數運算之 IEEE 標準 754 的雙精確度浮點格式。它具有大約 15 位數的精確度，並且範圍約為 1E-307 到 1E\$1308。您也可以將此資料類型指定為 FLOAT 或 FLOAT8。

除了普通的數值之外，浮點類型還有幾個特殊值。在 SQL 中使用這些值時，請使用單引號：
+ `NaN` - 非數字。
+ `Infinity`— 無窮大
+ `-Infinity`— 負無窮大

例如，要在資料表 `customer_activity` 的欄 `day_charge` 中插入非數字，請執行以下 SQL：

```
insert into customer_activity(day_charge) values('NaN');
```

# 數值的計算
<a name="r_numeric_computations201"></a>

在本文中，*計算*是指二進位數學運算：加、減、乘和除。本節說明這些運算預期的傳回類型，以及使用 DECIMAL 資料類型時，用來決定精確度與小數位數的特定公式。

在查詢處理作業期間計算數值時，可能會遇到無法進行計算的情況，而且查詢會傳回數值溢位錯誤。您也可能會遇到計算值的小數位數改變或出乎意料的情況。針對某些運算，您可以使用明確轉換 (類型提升) 或 Amazon Redshift 設定參數，來解決這些問題。

關於使用 SQL 函式進行類似計算的結果，詳細資訊請參閱 [彙總函數](c_Aggregate_Functions.md)。

## 計算的傳回類型
<a name="r_numeric_computations201-return-types-for-computations"></a>

根據 Amazon Redshift 中所支援的一組數值資料類型，下表顯示了加法、減法、乘法和除法運算預期的傳回類型。表格左側的第一欄代表計算中的第一個運算元，最上面的列代表第二個運算元。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_numeric_computations201.html)

## 計算出 DECIMAL 結果的精確度和小數位數
<a name="r_numeric_computations201-precision-and-scale-of-computed-decimal-results"></a>

下表顯示摘要，說明在數學運算傳回 DECIMAL 結果時，用來計算結果精確度和小數位數的規則。在這個表格中，`p1` 和 `s1` 代表計算式中第一個運算元的精確度和小數位數，`p2` 和 `s2` 代表第二個運算元的精確度和小數位數。(無論這些計算如何，結果的最高精確度為 38、結果的最大小數位數為 38。) 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_numeric_computations201.html)

例如，SALES 資料表中的 PRICEPAID 和 COMMISSION 資料欄都是 DECIMAL(8,2) 資料欄。如果將 PRICEPAID 除以 COMMISSION (或反過來)，會如下套用公式：

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

下列的計算是一般規則，適用於針對 DECIMAL 數值的運算 (使用 UNION、INTERSECT 和 EXCEPT 等集合運算子，或 COALESCE 和 DECODE 等函式)，計算出結果的精確度和小數位數：

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

例如，包含一個 DECIMAL(7,2) 資料欄的 DEC1 資料表，會與包含一個 DECIMAL(15,3) 資料欄的 DEC2 資料表聯結，以產生 DEC3 資料表。DEC3 的結構描述顯示，其資料欄會變成 NUMERIC(15,3) 資料欄。

```
create table dec3 as select * from dec1 union select * from dec2;
```

結果 

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'dec3';

column |     type      | encoding | distkey | sortkey 
-------+---------------+----------+---------+---------
c1     | numeric(15,3) | none     | f       | 0
```

在上述的範例中，會如下套用公式：

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## 關於除法運算的備註
<a name="r_numeric_computations201-notes-on-division-operations"></a>

如果是除法運算，除以 0 的情況會傳回錯誤。

在計算出精確度和小數位數之後，會套用 100 個小數位數的限制。如果計算結果的小數位數大於 100，除的結果會如下設定小數位數：
+ 精確度 = ` precision - (scale - max_scale)` 
+ 擴展 = ` max_scale ` 

如果計算出的精確度大於最高精確度 (38)，則精確度會降低為 38，而小數位數會變成下列算式的結果：`max((38 + scale - precision), min(4, 100))`

## 溢位狀況
<a name="r_numeric_computations201-overflow-conditions"></a>

會針對所有數值運算檢查溢位。具有 19 個 (含) 以下有效位數 (精確度) 的 DECIMAL 資料，會儲存為 64 位元整數。具有 19 個 (含) 以上有效位數 (精確度) 的 DECIMAL 資料，會儲存為 128 位元整數。所有 DECIMAL 數值的最高精確度為 38、最大小數位數為 37。當數值超出這些限值時，會出現溢位錯誤，這會同時發生於中間的和最終的結果集：
+ 當特定資料值不符合轉換函式所要求的精確度或指定的小數位數時，明確轉換作業會產生執行時期的溢位錯誤。例如，您無法從 SALES 資料表中的 PRICEPAID 資料欄 (DECIMAL(8,2) 資料欄) 轉換所有的數值，然後傳回 DECIMAL(7,3) 結果：

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  由於 PRICEPAID 資料欄中的*某些*較大的數值無法轉換，因此發生了這項錯誤。
+ 在乘法運算所產生的結果中，其小數位數是每個運算元小數位數的總和。例如，如果兩個運算元都有 4 個小數位數，結果的小數位數是 8 個，使得小數點的左邊只有 10 個位數。因此，在將兩個都擁有大量小數位數的大數值相乘時，就會相當容易產生溢位狀況。

  下列範例會導致溢位錯誤。

  ```
  SELECT CAST(1 AS DECIMAL(38, 20)) * CAST(10 AS DECIMAL(38, 20));
  ERROR: 128 bit numeric data overflow (multiplication)
  ```

  您可以使用除法而不是乘法來解決溢位錯誤。使用以下範例除以 1 除以原始除數。

  ```
  SELECT CAST(1 AS DECIMAL(38, 20)) / (1 / CAST(10 AS DECIMAL(38, 20)));
  +----------+
  | ?column? |
  +----------+
  | 10       |
  +----------+
  ```

## INTEGER 和 DECIMAL 類型的數值計算
<a name="r_numeric_computations201-numeric-calculations-with-integer-and-decimal-types"></a>

當計算式中的其中一個運算元具有 INTEGER 資料類型，而另一個運算元為 DECIMAL，INTEGER 運算元會隱含轉換為 DECIMAL：
+ INT2 (SMALLINT) 會轉換為 DECIMAL(5,0) 
+ INT4 (INTEGER) 會轉換為 DECIMAL(10,0) 
+ INT8 (BIGINT) 會轉換為 DECIMAL(19,0) 

例如，如果將 DECIMAL(8,2) 資料欄 SALES.COMMISSION 乘以 SMALLINT 資料欄 SALES.QTYSOLD，此計算式會進行如下的轉換：

```
DECIMAL(8,2) * DECIMAL(5,0)
```

# 整數常值與浮點字面值
<a name="r_numeric_literals201"></a>

表示數字的常值或常數，可以是整數或浮點數。

## 整數常值
<a name="r_numeric_literals201-integer-literals"></a>

整數常值是數字 0 – 9 的序列，在數字前面可以選擇性地加上正號 (\$1) 或負號 (-)。

## 語法
<a name="r_numeric_literals201-synopsis"></a>

```
[ + | - ] digit ...
```

## 範例
<a name="r_numeric_literals201-examples"></a>

有效的整數包括下列範例：

```
23
-555
+17
```

## 浮點字面值
<a name="r_numeric_literals201-floating-point-literals"></a>

浮點字面值 (也稱為小數、數值或分數常值) 是數字的序列，可包含小數點，以及選擇性的包含指數標記。

## 語法
<a name="r_numeric_literals201-synopsis2"></a>

```
[ + | - ] digit ... [ . ] [ digit ...]
[ e | E [ + | - ] digit ... ]
```

## 引數
<a name="r_numeric_literals201-arguments"></a>

e \$1 E  
e 或 E 代表該數字是以科學記號指定。

## 範例
<a name="r_numeric_literals201-examples2"></a>

有效的浮點字面值包括下列範例：

```
3.14159
-37.
2.0e19
-2E-19
```

# 數值類型範例
<a name="r_Examples_with_numeric_types201"></a>



## CREATE TABLE 陳述式
<a name="r_Examples_with_numeric_types201-create-table-statement"></a>

下列的 CREATE TABLE 陳述式示範不同數值資料類型的宣告：

```
create table film (
film_id integer,
language_id smallint,
original_language_id smallint,
rental_duration smallint default 3,
rental_rate numeric(4,2) default 4.99,
length smallint,
replacement_cost real default 25.00);
```

## 試圖插入超出範圍的整數
<a name="r_Examples_with_numeric_types201-attempt-to-insert-an-integer-that-is-out-of-range"></a>

下列的範例試圖將 33000 這個值插入 SMALLINT 資料欄。

```
insert into film(language_id) values(33000);
```

SMALLINT 的範圍是 -32768 到 \$132767，因此 Amazon Redshift 會傳回錯誤。

```
An error occurred when executing the SQL command:
insert into film(language_id) values(33000)

ERROR: smallint out of range [SQL State=22003]
```

## 將小數值插入整數資料欄
<a name="r_Examples_with_numeric_types201-insert-a-decimal-value-into-an-integer-column"></a>

下列的範例將小數值插入 INT 資料欄。

```
insert into film(language_id) values(1.5);
```

會插入此數值，但四捨五入為整數值 2。

## 成功地插入小數，因為其小數位數已經過四捨五入
<a name="r_Examples_with_numeric_types201-insert-a-decimal-that-succeeds-because-its-scale-is-rounded"></a>

下列的範例所插入的小數值，具有高於資料欄的精確度。

```
insert into film(rental_rate) values(35.512);
```

在此例中，將 `35.51` 這個值插入了資料欄。

## 試圖插入超出範圍的小數值
<a name="r_Examples_with_numeric_types201-attempt-to-insert-a-decimal-value-that-is-out-of-range"></a>

在此例中，`350.10` 這個值超出範圍。在 DECIMAL 資料欄中，數值的位數等於該資料欄的有效位數 (精確度) 減掉其小數位數 (RENTAL\$1RATE 資料欄為 4 減掉 2)。換句話說，`DECIMAL(4,2)` 資料欄允許的範圍是 `-99.99` 到 `99.99`。

```
insert into film(rental_rate) values (350.10);
ERROR:  numeric field overflow
DETAIL:  The absolute value is greater than or equal to 10^2 for field with precision 4, scale 2.
```

## 將可變精確度的值插入 REAL 資料欄
<a name="r_Examples_with_numeric_types201-insert-variable-precision-values-into-a-real-column"></a>

下列的範例將可變精確度的值插入 REAL 資料欄。

```
insert into film(replacement_cost) values(1999999.99);

insert into film(replacement_cost) values(1999.99);

select replacement_cost from film;

+------------------+
| replacement_cost |
+------------------+
| 2000000          |
| 1999.99          |
+------------------+
```

`1999999.99` 值會轉換為 `2000000`，以符合 `REAL` 欄的精確度要求。數值 `1999.99` 會依原狀載入。

# 字元類型
<a name="r_Character_types"></a>

**Topics**
+ [儲存與範圍](#r_Character_types-storage-and-ranges)
+ [CHAR 或 CHARACTER](#r_Character_types-char-or-character)
+ [VARCHAR 或 CHARACTER VARYING](#r_Character_types-varchar-or-character-varying)
+ [NCHAR 與 NVARCHAR 類型](#r_Character_types-nchar-and-nvarchar-types)
+ [TEXT 與 BPCHAR 類型](#r_Character_types-text-and-bpchar-types)
+ [多餘空格的意義](#r_Character_types-significance-of-trailing-blanks)
+ [字元類型範例](r_Examples_with_character_types.md)

字元資料類型包括 CHAR (字元) 和 VARCHAR (可變長度字元)。

## 儲存與範圍
<a name="r_Character_types-storage-and-ranges"></a>

CHAR 和 VARCHAR 資料類型是以字元組而非字元來定義。CHAR 資料欄只能包含單位元組字元，因此 CHAR(10) 資料欄可包含最大長度為 10 位元組的字串。VARCHAR 可包含多位元組字元，每個字元最多 4 個位元組。例如，VARCHAR(12) 資料欄可包含 12 個單位元組的字元、6 個 2 位元組的字元、4 個 3 位元組的字元，或是 3 個 4 位元組的字元。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Character_types.html)

**注意**  
CREATE TABLE 語法支援字元資料類型的 MAX 關鍵字。例如：  

```
create table test(col1 varchar(max));
```
對於 CHAR，MAX 將資料欄寬度定義為 4096 個位元組。  
對於 VARCHAR，MAX 在 CREATE TABLE 陳述式中將資料欄寬度定義為 65，535 個位元組。對於記憶體內操作，VARCHAR(MAX) 最多支援 16，000，000 個位元組。

## CHAR 或 CHARACTER
<a name="r_Character_types-char-or-character"></a>

使用 CHAR 或 CHARACTER 資料欄來儲存固定長度的字串。這些字串會用空格填充，因此 CHAR(10) 資料欄一律會佔 10 個位元組的儲存空間。

```
char(10)
```

 未指定長度規格的 CHAR 資料欄，會變成 CHAR(1) 資料欄。

## VARCHAR 或 CHARACTER VARYING
<a name="r_Character_types-varchar-or-character-varying"></a>

使用 VARCHAR 或 CHARACTER VARYING 資料欄，來儲存具有固定限制的可變長度字串。這些字串並未使用空格填充，因此，VARCHAR(120) 資料欄最多可包含 120 個單位元組的字元、60 個 2 位元組的字元、40 個 3 位元組的字元，或是 30 個 4 位元組的字元。

```
varchar(120)
```

如果您在建立資料表陳述式中使用沒有長度說明符的 VARCHAR 資料類型，預設長度為 256。

[字串函數](String_functions_header.md) 現在支援最多 16，000，000 個位元組。例如，CONCAT 函數輸出先前限制為 65535 個位元組，但現在支援最多 16，000，000 個位元組。

```
SELECT LEN(CONCAT(REPEAT('A', 5000000), REPEAT('B', 5000000))) AS total_length;

 total_length
--------------
     10000000
```

## NCHAR 與 NVARCHAR 類型
<a name="r_Character_types-nchar-and-nvarchar-types"></a>

您可以建立具有 NCHAR 和 NVARCHAR 類型的資料欄 (也稱為 NATIONAL CHARACTER 和 NATIONAL CHARACTER VARYING 類型)。這些類型會分別轉換為 CHAR 和 VARCHAR 類型，然後以指定的位元組數目儲存。

未指定長度規格的 NCHAR 資料欄，會轉換為 CHAR(1) 資料欄。

未指定長度規格的 NVARCHAR 資料欄，會轉換為 VARCHAR(256) 資料欄。

## TEXT 與 BPCHAR 類型
<a name="r_Character_types-text-and-bpchar-types"></a>

您可以建立包含 TEXT 欄的 Amazon Redshift 資料表，但是此欄會轉換為 VARCHAR(256) 欄，接受最多 256 個字元的可變長度值。

您可以建立具備 BPCHAR (空格填充字元) 類型的 Amazon Redshift 欄，Amazon Redshift 會轉換為固定長度的 CHAR(256) 欄。

## 多餘空格的意義
<a name="r_Character_types-significance-of-trailing-blanks"></a>

CHAR 和 VARCHAR 資料類型都會儲存長度最多 *n* 個位元組的字串。如果試圖將較長的字串，儲存到具有這些類型的資料欄中，將會造成錯誤 (除非多出來的字串全部都是空格 (空白)，此時字串會被截斷至最大長度)。如果字串短於最大長度，CHAR 值會以空格填充，但 VARCHAR 值則會儲存不含空格的字串。

CHAR 值中的多餘空格在語義上一律不具有意義。這些空格會在您比較兩個 CHAR 值時被忽略、不列入 LENGTH 的計算中，而且會在您將 CHAR 值轉換為另一種字串類型時移除。

在比較值時，VARCHAR 和 CHAR 值中的多餘空格，在語義上會視為不具意義。

長度的計算會傳回 VARCHAR 字元字串的長度，其中也包含多餘的空格。多餘的空格不會列入固定長度字元字串的長度計算。

# 字元類型範例
<a name="r_Examples_with_character_types"></a>

## CREATE TABLE 陳述式
<a name="r_Examples_with_character_types-create-table-statement"></a>

下列的 CREATE TABLE 陳述式示範 VARCHAR 和 CHAR 資料類型的使用：

```
create table address(
address_id integer,
address1 varchar(100),
address2 varchar(50),
district varchar(20),
city_name char(20),
state char(2),
postal_code char(5)
);
```

下列的範例使用此資料表。

## 可變長度字元字串中的多餘空格
<a name="r_Examples_with_character_types-trailing-blanks-in-variable-length-character-strings"></a>

由於 ADDRESS1 是 VARCHAR 資料欄，因此在第二個插入的地址中，多餘的空格在語義上是無關緊要的。換句話說，下列這兩個插入的地址是*相符合*的。

```
insert into address(address1) values('9516 Magnolia Boulevard');

insert into address(address1) values('9516 Magnolia Boulevard  ');
```

```
select count(*) from address
where address1='9516 Magnolia Boulevard';

count
-------
2
(1 row)
```

如果 ADDRESS1 資料欄原本是 CHAR 資料欄，而且插入了相同的值，則 COUNT(\$1) 查詢會將字元字串視為相同，並傳回 `2`。

## LENGTH 函數的結果
<a name="r_Examples_with_character_types-results-of-the-length-function"></a>

LENGTH 函式會辨識 VARCHAR 資料欄中的多餘空格：

```
select length(address1) from address;

length
--------
23
25
(2 rows)
```

在 CITY\$1NAME 資料欄 (CHAR 資料欄) 中的 `Augusta` 值，無論輸入字串中是否有任何多餘的空格，一律會傳回 7 個字元的長度。

## 超過資料欄長度的值
<a name="r_Examples_with_character_types-values-that-exceed-the-length-of-the-column"></a>

字元字串不會為了配合資料欄宣告的寬度而遭到截斷：

```
insert into address(city_name) values('City of South San Francisco');
ERROR: value too long for type character(20)
```

這個問題的解決方法，是將值轉換為符合資料欄的大小：

```
insert into address(city_name)
values('City of South San Francisco'::char(20));
```

在這個例子中，字串 (`City of South San Fr`) 的前 20 個字元會載入資料欄。

# 日期時間 (Datetime) 類型
<a name="r_Datetime_types"></a>

**Topics**
+ [儲存與範圍](#r_Datetime_types-storage-and-ranges)
+ [DATE](#r_Datetime_types-date)
+ [TIME](#r_Datetime_types-time)
+ [TIMETZ](#r_Datetime_types-timetz)
+ [TIMESTAMP](#r_Datetime_types-timestamp)
+ [TIMESTAMPTZ](#r_Datetime_types-timestamptz)
+ [日期時間 (Datetime) 類型範例](r_Examples_with_datetime_types.md)
+ [日期、時間和時間戳記常值](r_Date_and_time_literals.md)
+ [間隔資料類型和常值](r_interval_data_types.md)

日期時間 (Datetime) 資料類型包含 DATE、TIME、TIMETZ、TIMESTAMP 與 TIMESTAMPTZ。

## 儲存與範圍
<a name="r_Datetime_types-storage-and-ranges"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Datetime_types.html)

## DATE
<a name="r_Datetime_types-date"></a>

使用 DATE 資料類型來儲存不含時間戳記的簡單日曆日期。

## TIME
<a name="r_Datetime_types-time"></a>

TIME 是 TIME WITHOUT TIME ZONE 的別名。

使用 TIME 資料類型來儲存一天中的時間。

TIME 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

在使用者資料表和 Amazon Redshift 系統資料表中，TIME 值預設皆採用世界標準時間 (UTC)。

## TIMETZ
<a name="r_Datetime_types-timetz"></a>

TIMETZ 是 TIME WITH TIME ZONE 的別名。

使用 TIMETZ 資料類型來儲存具有時區的一天中的時間。

TIMETZ 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

根據預設，TIMTZ 值在使用者資料表和 Amazon Redshift 系統資料表中皆採用 UTC。

## TIMESTAMP
<a name="r_Datetime_types-timestamp"></a>

TIMESTAMP 是 TIMESTAMP WITHOUT TIME ZONE 的別名。

使用 TIMESTAMP 資料類型來儲存完整的時間戳記值，其中包含日期和當日的時間。

TIMESTAMP 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

如果將日期插入 TIMESTAMP 欄，或具有部分時間戳記值的日期，則該值會隱含轉換為完整時間戳記值。此完整時間戳記值對於缺少的小時、分鐘和秒具有預設值 (00)。輸入字串中的時區值會遭到忽略。

根據預設，TIMESTAMP 值在使用者資料表和 Amazon Redshift 系統資料表中皆採用 UTC。

## TIMESTAMPTZ
<a name="r_Datetime_types-timestamptz"></a>

TIMESTAMPTZ 是 TIMESTAMP WITH TIME ZONE 的別名。

使用 TIMESTAMPTZ 資料類型來輸入完整的時間戳記值，其中包含日期、當日的時間和時區。當輸入值包含時區時，Amazon Redshift 會使用時區來將該值轉換為 UTC，並儲存 UTC 值。

若要查看受支援時區名稱的清單，請執行下列命令。

```
select pg_timezone_names();
```

 若要查看受支援時區縮寫的清單，請執行下列命令。

```
select pg_timezone_abbrevs();
```

在 [IANA 時區資料庫](https://www.iana.org/time-zones)中，也提供了關於時區的最新資訊。

下表提供時區格式的範例。


| 格式 | 範例 | 
| --- | --- | 
|  dd mon hh:mi:ss yyyy tz  |  17 Dec 07:37:16 1997 PST   | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 PST  | 
|  mm/dd/yyyy hh:mi:ss.ss tz  |  12/17/1997 07:37:16.00 美國時間/太平洋時區  | 
|  yyyy-mm-dd hh:mi:ss\$1/-tz  |  1997-12-17 07:37:16-08   | 
| dd.mm.yyyy hh:mi:ss tz |  17.12.1997 07:37:16.00 PST  | 

TIMESTAMPTZ 欄可針對小數秒數，儲存精確度最高 6 位數的數值。

如果將日期插入 TIMESTAMPTZ 欄，或具有部分時間戳記的日期，則該值會隱含轉換為完整時間戳記值。此完整時間戳記值對於缺少的小時、分鐘和秒具有預設值 (00)。

TIMESTAMPTZ 值在使用者資料表中採用 UTC。

# 日期時間 (Datetime) 類型範例
<a name="r_Examples_with_datetime_types"></a>

接下來，您可以找到使用 Amazon Redshift 支援的日期時間類型的範例。

## 日期範例
<a name="r_Examples_with_datetime_types-date-examples"></a>

以下範例插入具有不同格式的日期並顯示輸出。

```
create table datetable (start_date date, end_date date);
```

```
insert into datetable values ('2008-06-01','2008-12-31');

insert into datetable values ('Jun 1,2008','20081231');
```

```
select * from datetable order by 1;

start_date |  end_date
-----------------------
2008-06-01 | 2008-12-31
2008-06-01 | 2008-12-31
```

如果將時間戳記值插入 DATE 資料欄，會略過時間的部分，只載入日期。

## 時間範例
<a name="r_Examples_with_datetime_types-time-examples"></a>

以下範例插入具有不同格式的 TIME 和 TIMETZ 值並顯示輸出。

```
create table timetable (start_time time, end_time timetz);
```

```
insert into timetable values ('19:11:19','20:41:19 UTC');
insert into timetable values ('191119', '204119 UTC');
```

```
select * from timetable order by 1;
start_time |  end_time
------------------------
 19:11:19  | 20:41:19+00
 19:11:19  | 20:41:19+00
```

## 時間戳記範例
<a name="r_Examples_with_datetime_types-timestamp-examples"></a>

如果將日期插入 TIMESTAMP 或 TIMESTAMPTZ 資料欄，則時間會預設為午夜。例如，如果插入常值 `20081231`，則儲存的值為 `2008-12-31 00:00:00`。

若要變更目前工作階段的時區，請利用 [SET](r_SET.md) 指令來設定 [timezone](r_timezone_config.md) 組態參數。

下列範例會插入具有不同格式的時間戳記，並顯示產生的資料表。

```
create table tstamp(timeofday timestamp, timeofdaytz timestamptz);

insert into tstamp values('Jun 1,2008  09:59:59', 'Jun 1,2008 09:59:59 EST' );
insert into tstamp values('Dec 31,2008 18:20','Dec 31,2008 18:20');
insert into tstamp values('Jun 1,2008  09:59:59 EST', 'Jun 1,2008 09:59:59');

SELECT * FROM tstamp;

+---------------------+------------------------+
|      timeofday      |      timeofdaytz       |
+---------------------+------------------------+
| 2008-06-01 09:59:59 | 2008-06-01 14:59:59+00 |
| 2008-12-31 18:20:00 | 2008-12-31 18:20:00+00 |
| 2008-06-01 09:59:59 | 2008-06-01 09:59:59+00 |
+---------------------+------------------------+
```

# 日期、時間和時間戳記常值
<a name="r_Date_and_time_literals"></a>

以下是 Amazon Redshift 所支援日期、時間和時間戳記常值的規則。

## 日期
<a name="r_Date_and_time_literals-dates"></a>

下列輸入日期全都是 DATE 資料類型的有效常值日期值範例，可以載入 Amazon Redshift 資料表中。假設預設 `MDY DateStyle` 模式有效。此模式表示在字串中月份值位於日期值之前，例如 `1999-01-08` 和 `01/02/00`。

**注意**  
載入資料表時，日期或時間戳記常值必須用引號括住。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

## Times
<a name="r_Date_and_time_literals-times"></a>

下列輸入時間全都是 TIME 和 TIMETZ 資料類型的有效常值時間值範例，可以載入 Amazon Redshift 資料表中。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

## 時間戳記
<a name="r_Date_and_time_literals-timestamps"></a>

下列輸入時間戳記全都是 TIMESTAMP 和 TIMESTAMPTZ 資料類型的有效常值時間值範例，可以載入 Amazon Redshift 資料表中。有效的日期常值全都可以和下列的時間常值合併。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

## 特殊的日期時間 (Datetime) 值
<a name="r_Date_and_time_literals-special-datetime-values"></a>

下列的特殊值可做為日期時間 (datetime) 常值和日期函式的引數使用。這些值需使用單引號，而且會在查詢處理作業進行期間，轉換為一般的時間戳記值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Date_and_time_literals.html)

下列範例顯示 `now` 和 `today` 如何與 DATEADD 函數搭配使用。

```
select dateadd(day,1,'today');

date_add
---------------------
2009-11-17 00:00:00
(1 row)

select dateadd(day,1,'now');

date_add
----------------------------
2009-11-17 10:45:32.021394
(1 row)
```

# 間隔資料類型和常值
<a name="r_interval_data_types"></a>

您可以使用間隔資料類型來儲存下列單位的持續時間：`seconds`、`minutes`、`hours`、`days`、`months` 和 `years`。間隔資料類型和常值可用於日期時間計算，例如，將間隔新增至日期和時間戳記、加總間隔，以及從日期或時間戳記減去間隔。間隔常值可作為資料表中間隔資料類型欄的輸入值。

## 間隔資料類型的語法
<a name="r_interval_data_types-syntax"></a>

若要指定間隔資料類型，以年和月為單位儲存持續時間：

```
INTERVAL year_to_month_qualifier
```

若要指定間隔資料類型，以天、小時、分鐘和秒為單位儲存持續時間：

```
INTERVAL day_to_second_qualifier [ (fractional_precision) ]
```

## 間隔常值的語法
<a name="r_interval_data_types-syntax-literal"></a>

若要指定間隔常值，以年和月為單位定義持續時間：

```
INTERVAL quoted-string year_to_month_qualifier
```

若要指定間隔常值，以天、小時、分鐘和秒為單位定義持續時間：

```
INTERVAL quoted-string day_to_second_qualifier [ (fractional_precision) ]
```

## 引數
<a name="r_interval_data_types-arguments"></a>

 *quoted-string*   
指定正或負數值，以將數量和日期時間單位指定為輸入字串。如果 *quoted-string* 只包含數值，則 Amazon Redshift 會從 *year\$1to\$1month\$1qualifier* 或 *day\$1to\$1second\$1qualifier* 決定單位。例如，`'23' MONTH` 代表 `1 year 11 months`、`'-2' DAY` 代表 `-2 days 0 hours 0 minutes 0.0 seconds`、`'1-2' MONTH` 代表 `1 year 2 months`，以及 `'13 day 1 hour 1 minute 1.123 seconds' SECOND` 代表 `13 days 1 hour 1 minute 1.123 seconds`。如需間隔的輸出格式的詳細資訊，請參閱 [間隔樣式](#r_interval_data_types-interval-styles)。

 *year\$1to\$1month\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔，Amazon Redshift 會截斷並捨棄間隔的較小部分。*year\$1to\$1month\$1qualifier* 的有效值為：  
+ `YEAR`
+ `MONTH`
+ `YEAR TO MONTH`

 *day\$1to\$1second\$1qualifier*   
指定間隔的範圍。如果您使用限定詞並以小於限定詞的時間單位建立間隔，Amazon Redshift 會截斷並捨棄間隔的較小部分。*day\$1to\$1second\$1qualifier* 的有效值為：  
+ `DAY`
+ `HOUR`
+ `MINUTE`
+ `SECOND`
+ `DAY TO HOUR`
+ `DAY TO MINUTE`
+ `DAY TO SECOND`
+ `HOUR TO MINUTE`
+ `HOUR TO SECOND`
+ `MINUTE TO SECOND`
INTERVAL 常值的輸出會截斷至指定的最小 INTERVAL 元件。例如，使用 MINUTE 限定詞時，Amazon Redshift 會捨棄小於 MINUTE 的時間單位。  

```
select INTERVAL '1 day 1 hour 1 minute 1.123 seconds' MINUTE
```
得到的值會截斷至 `'1 day 01:01:00'`。

 *fractional\$1precision*   
這是選用參數，用於指定間隔中允許的小數位數。只有在您的間隔包含 SECOND 時，才應指定 *fractional\$1precision* 引數。例如，`SECOND(3)` 會建立只允許三位小數的間隔，例如 1.234 秒。小數最多為 6 位。

當間隔同時指定了 YEAR TO MONTH 和 DAY TO SECOND 部分時，工作階段組態 `interval_forbid_composite_literals` 會決定是否傳回錯誤。如需詳細資訊，請參閱[interval\$1forbid\$1composite\$1literals](r_interval_forbid_composite_literals.md)。

## 間隔算術
<a name="r_interval_data_types-arithmetic"></a>

您可以使用間隔值搭配其他日期時間值來執行算術運算。下表說明可用的運算，以及每項運算產生的資料類型。

**注意**  
 可以同時產生 `date` 和 `timestamp` 結果的運算會根據方程式中涉及的最小時間單位來進行。例如，當您將 `interval` 新增至 `date` 時，如果是 YEAR TO MONTH 間隔，則結果為 `date`，如果是 DAY TO SECOND 間隔，則結果為時間戳記。

第一個運算元為 `interval` 的運算會針對指定的第二個運算元產生下列結果：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_interval_data_types.html)

第一個運算元為 `date` 的運算會針對指定的第二個運算元產生下列結果：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_interval_data_types.html)

第一個運算元為 `timestamp` 的運算會針對指定的第二個運算元產生下列結果：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_interval_data_types.html)

## 間隔樣式
<a name="r_interval_data_types-interval-styles"></a>

您可以使用 SQL [SET](r_SET.md) 命令來變更間隔值的輸出顯示格式。當您在 SQL 中使用間隔資料類型時，請將其轉換為文字，以查看預期的間隔樣式，例如 `YEAR TO MONTH::text`。設定 (SET) `IntervalStyle` 的可用值為：
+ `postgres` - 遵循 PostgreSQL 樣式。這是預設值。
+ `postgres_verbose` - 遵循 PostgreSQL 詳細樣式。
+ `sql_standard` - 遵循 SQL 標準間隔常值樣式。

下列命令會將間隔樣式設定為 `sql_standard`。

```
SET IntervalStyle to 'sql_standard';
```

**postgres 輸出格式**

以下是 `postgres` 間隔樣式的輸出格式。每個數值都可以是負數。

```
'<numeric> <unit> [, <numeric> <unit> ...]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
---------------
1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
------------------
1 day 02:03:04.5678
```

**postgres\$1verbose 輸出格式**

postgres\$1verbose 語法類似 postgres，但 postgres\$1verbose 輸出還包含時間單位。

```
'[@] <numeric> <unit> [, <numeric> <unit> ...] [direction]'
```

```
select INTERVAL '1-2' YEAR TO MONTH::text 

varchar
-----------------
@ 1 year 2 mons
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text

varchar
---------------------------
@ 1 day 2 hours 3 mins 4.56 secs
```

**sql\$1standard 輸出格式**

間隔年到月的格式設定如下。在間隔之前指定負號表示間隔是負值，並套用至整個間隔。

```
'[-]yy-mm'
```

間隔天到秒的格式設定如下。

```
'[-]dd hh:mm:ss.ffffff'
```

```
SELECT INTERVAL '1-2' YEAR TO MONTH::text 
  
varchar   
-------
1-2
```

```
select INTERVAL '1 2:3:4.5678' DAY TO SECOND::text 

varchar
---------------
1 2:03:04.5678
```

## 間隔資料類型的範例
<a name="r_interval_data_types-examples"></a>

下列範例示範如何搭配資料表使用 INTERVAL 資料類型。

```
create table sample_intervals (y2m interval month, h2m interval hour to minute);
insert into sample_intervals values (interval '20' month, interval '2 days 1:1:1.123456' day to second);
select y2m::text, h2m::text from sample_intervals;


      y2m      |       h2m      
---------------+-----------------
 1 year 8 mons | 2 days 01:01:00
```

```
update sample_intervals set y2m = interval '2' year where y2m = interval '1-8' year to month;
select * from sample_intervals;

   y2m   |       h2m       
---------+-----------------
 2 years | 2 days 01:01:00
```

```
delete from sample_intervals where h2m = interval '2 1:1:0' day to second;
select * from sample_intervals;

 y2m | h2m 
-----+-----
```

## 間隔常值的範例
<a name="r_interval_data_types_literals-examples"></a>

下列範例會在間隔樣式設定為 `postgres` 的情況下執行。

下列範例示範如何建立 1 年的 INTERVAL 常值。

```
select INTERVAL '1' YEAR 

intervaly2m
---------------
1 years 0 mons
```

如果您指定的 *quoted-string* 超過限定詞，則會從間隔中截斷剩餘的時間單位。在下列範例中，13 個月的間隔會變成 1 年又 1 個月，但剩餘的 1 個月會因 YEAR 限定詞而被排除。

```
select INTERVAL '13 months' YEAR

intervaly2m
---------------
1 years 0 mons
```

如果您使用的限定詞低於間隔字串，則會將剩餘單位納入。

```
select INTERVAL '13 months' MONTH

intervaly2m
---------------
1 years 1 mons
```

在間隔中指定精確度會將小數位數截斷至指定的精確度。

```
select INTERVAL '1.234567' SECOND (3)

intervald2s
--------------------------------
0 days 0 hours 0 mins 1.235 secs
```

如果您未指定精確度，Amazon Redshift 會使用最大精確度 6。

```
select INTERVAL '1.23456789' SECOND

intervald2s
-----------------------------------
0 days 0 hours 0 mins 1.234567 secs
```

下列範例示範如何建立限定範圍的間隔。

```
select INTERVAL '2:2' MINUTE TO SECOND

intervald2s
------------------------------
0 days 0 hours 2 mins 2.0 secs
```

限定詞規定您要指定的單位。例如，即使下列範例使用與上一個範例相同的 '2:2' *quoted-string*，Amazon Redshift 仍會因為限定詞的關係，將其辨識為使用不同的時間單位。

```
select INTERVAL '2:2' HOUR TO MINUTE

intervald2s
------------------------------
0 days 2 hours 2 mins 0.0 secs
```

每個單位都支援縮寫和複數。例如，`5s`、`5 second` 和 `5 seconds` 是相等的間隔。支援的單位包括年、月、小時、分鐘和秒。

```
select INTERVAL '5s' SECOND

intervald2s
------------------------------
0 days 0 hours 0 mins 5.0 secs
```

```
select INTERVAL '5 HOURS' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```

```
select INTERVAL '5 h' HOUR

intervald2s
------------------------------
0 days 5 hours 0 mins 0.0 secs
```

# 未使用限定詞語法的間隔常值範例
<a name="r_interval_literals"></a>

**注意**  
下列範例示範使用未包含 `YEAR TO MONTH` 或 `DAY TO SECOND` 限定詞的間隔常值。如需使用包含限定詞的建議間隔常值的相關資訊，請參閱 [間隔資料類型和常值](r_interval_data_types.md)。

使用間隔常值來表示指定的時間期間，例如 `12 hours` 或 `6 months`。您可以在需要表示日期時間的條件和表達式中，使用這些間隔常值。

 間隔常值的表示方式，是結合 INTERVAL 關鍵字、數量和支援的日期部分，例如 `INTERVAL '7 days'` 或 `INTERVAL '59 minutes'`。您可以串連幾個數量和單位，來組成更精確的間隔時間，例如：`INTERVAL '7 days, 3 hours, 59 minutes'`。也支援每種單位的縮寫和複數，例如 `5 s`、`5 second` 和 `5 seconds` 是相同的間隔時間。

如果未指定日期部分，則間隔值代表秒。您可以指定小數格式的數量值 (例如：`0.5 days`)。

下列範例顯示不同間隔值的一連串計算。

以下內容為指定日期增加 1 秒。

```
select caldate + interval '1 second' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:00:01
(1 row)
```

以下內容為指定日期增加 1 分鐘。

```
select caldate + interval '1 minute' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 00:01:00
(1 row)
```

以下內容為指定日期增加 3 個小時又 35 分鐘。

```
select caldate + interval '3 hours, 35 minutes' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 03:35:00
(1 row)
```

以下內容為指定日期增加 52 週。

```
select caldate + interval '52 weeks' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-12-30 00:00:00
(1 row)
```

以下內容為指定日期增加 1 週 1 小時 1 分鐘又 1 秒。

```
select caldate + interval '1w, 1h, 1m, 1s' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2009-01-07 01:01:01
(1 row)
```

以下內容為指定指定日期增加 12 個小時 (半天)。

```
select caldate + interval '0.5 days' as dateplus from date
where caldate='12-31-2008';
dateplus
---------------------
2008-12-31 12:00:00
(1 row)
```

以下內容從 2023 年 2 月 15 日減去 4 個月，結果是 2022 年 10 月 15 日。

```
select date '2023-02-15' - interval '4 months';

?column?
---------------------
2022-10-15 00:00:00
```

以下內容從 2023 年 3 月 31 日減去 4 個月，結果是 2022 年 11 月 30 日。計算有將一個月中的天數納入考量。

```
select date '2023-03-31' - interval '4 months';

?column?
---------------------
2022-11-30 00:00:00
```

# 布林值 (Boolean) 類型
<a name="r_Boolean_type"></a>

使用 BOOLEAN 資料類型，在單位元組資料欄中儲存 true 和 false 值。下表說明 Boolean 值的三種可能狀態，以及導致狀態的字面值。無論輸入的字串為何，Boolean 資料欄都會分別將「t」和「f」儲存和輸出為 true 與 false。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Boolean_type.html)

您只可以透過 WHERE 子句中述詞的形式使用 IS 比較來檢查布林值。您無法使用 IS 比較來搭配 SELECT 清單中的布林值。

## 範例
<a name="r_Boolean_type-examples"></a>

您可以使用 BOOLEAN 資料欄，針對 CUSTOMER 資料表中的每個客戶，儲存其「作用中/非作用中」狀態。

```
create table customer(
custid int,
active_flag boolean default true);
```

```
insert into customer values(100, default);
```

```
select * from customer;
custid | active_flag
-------+--------------
   100 | t
```

如果在 CREATE TABLE 陳述式中未指定預設值 (`true` 或 `false`)，則插入預設值代表插入 null。

在此範例中，查詢會從 USERS 資料表中，選取喜歡運動但不喜歡戲劇的使用者：

```
select firstname, lastname, likesports, liketheatre
from users
where likesports is true and liketheatre is false
order by userid limit 10;

firstname |  lastname  | likesports | liketheatre
----------+------------+------------+-------------
Lars      | Ratliff    | t          | f
Mufutau   | Watkins    | t          | f
Scarlett  | Mayer      | t          | f
Shafira   | Glenn      | t          | f
Winifred  | Cherry     | t          | f
Chase     | Lamb       | t          | f
Liberty   | Ellison    | t          | f
Aladdin   | Haney      | t          | f
Tashya    | Michael    | t          | f
Lucian    | Montgomery | t          | f
(10 rows)
```

下列範例中的查詢會從 USERS 資料表中選取不確定是否喜歡搖滾樂的使用者。

```
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;

firstname | lastname | likerock
----------+----------+----------
Rafael    | Taylor   |
Vladimir  | Humphrey |
Barry     | Roy      |
Tamekah   | Juarez   |
Mufutau   | Watkins  |
Naida     | Calderon |
Anika     | Huff     |
Bruce     | Beck     |
Mallory   | Farrell  |
Scarlett  | Mayer    |
(10 rows)
```

下列範例會傳回錯誤，因為它在 SELECT 清單中使用 IS 比較。

```
select firstname, lastname, likerock is true as "check"
from users
order by userid limit 10;

[Amazon](500310) Invalid operation: Not implemented
```

下列範例會成功，因為它在 SELECT 清單中使用等於比較 ( = ) 而非 IS 比較。

```
select firstname, lastname, likerock = true as "check"
from users
order by userid limit 10;

firstname | lastname  | check
----------+-----------+------
Rafael    | Taylor    |      
Vladimir  | Humphrey  |      
Lars      | Ratliff   | true 
Barry     | Roy       |      
Reagan    | Hodge     | true 
Victor    | Hernandez | true 
Tamekah   | Juarez    |      
Colton    | Roy       | false
Mufutau   | Watkins   |      
Naida     | Calderon  |
```

# HLLSKETCH 類型
<a name="r_HLLSKTECH_type"></a>

針對 HyperLogLog 草圖使用 HLLSKETCH 資料類型。Amazon Redshift 支援稀疏或密集 HyperLogLog 草圖表示法。草圖一開始是稀疏的，當密集格式更有效地減少使用的記憶體佔用時，會切換到密集。

 當以下列 JSON 格式匯入、匯出或列印草圖時，Amazon Redshift 會自動轉換稀疏 HyperLogLog 草圖。

```
{"logm":15,"sparse":{"indices":[4878,9559,14523],"values":[1,2,1]}}
```

Amazon Redshift 使用 Base64 格式的字串表示法來表示密集 HyperLogLog 草圖。

Amazon Redshift 使用以下 Base64 格式的字串表示法來表示密集 HyperLogLog 草圖。

```
"ABAABA..."
```

在 raw 壓縮中使用時，HLLSKETCH 物件的最大大小為 24,580 個位元組。

# SUPER 類型
<a name="r_SUPER_type"></a>

使用 SUPER 資料類型將半結構化資料或文件儲存為值。雖然 Amazon Redshift 能夠使用 VARCHAR 儲存這類值，但我們建議您改用 SUPER 資料類型。

半結構化資料不符合 SQL 資料庫中使用的關聯式資料模型的剛性和表格結構。它包含參考資料中不同實體的標籤。它們可以包含複雜值，例如陣列、巢狀結構，以及與序列化格式相關聯的其他複雜結構，例如 JSON。SUPER 資料類型是一組無結構描述陣列和結構值，包含 Amazon Redshift 的所有其他純量類型。

SUPER 資料類型針對個別 SUPER 物件支援最多 16 MB 的資料。如需 SUPER 資料類型的相關資訊，包括在資料表中的實作範例，請參閱[Amazon Redshift 中的半結構化資料](super-overview.md)。

Amazon Redshift 提供內建支援，可使用 COPY 命令擷取下列半結構化資料格式：
+  JSON 
+  ARRAY 
+  TEXT 
+  CSV 

大於 1MB 的 SUPER 物件只能從下列檔案格式中擷取：
+  Parquet 
+  JSON 
+  TEXT 
+  CSV 

SUPER 資料類型具有下列屬性：
+ Amazon Redshift 純量值：
  + Null
  + 布林值
  + 數字，例如 smallint、integer、bigint、decimal 或浮點數 (例如 float4 或 float8)
  + 字串值，如 varchar 或 char
+ 複雜值：
  + 值的陣列，包括純量或複雜
  + 一種結構，也稱為元組或物件，它是屬性名稱和值 (純量或複雜) 的映射

這兩種類型的複雜值中的任何一種都包含它們自己的純量或複雜值，而沒有任何正規性限制。

SUPER 資料類型的預設壓縮編碼是 ZSTD。如需壓縮編碼的詳細資訊，請參閱 [壓縮編碼](c_Compression_encodings.md)。

SUPER 資料類型支援在無結構描述形式的半結構化資料的持久性。儘管階層式資料模型可能會發生變化，但舊版本的資料可以共存於同一 SUPER 欄中。

Amazon Redshift 使用 PartiQL 啟用陣列和結構的導覽功能。Amazon Redshift 也會使用 PartiQL 語法來迭代 SUPER 陣列。如需詳細資訊，請參閱[PartiQL - 適用於 Amazon Redshift 的 SQL 相容查詢語言](super-partiql.md)。

Amazon Redshift 會使用動態類型來處理無結構描述的 SUPER 資料，無需在查詢中使用資料類型之前先宣告資料類型。如需詳細資訊，請參閱[動態類型](query-super.md#dynamic-typing-lax-processing)。

您可以將動態資料遮罩政策套用至 SUPER 類型欄路徑上的純量值。如需動態資料遮罩的詳細資訊，請參閱 [動態資料遮罩](t_ddm.md)。如需將動態資料遮罩與 SUPER 資料類型搭配使用的詳細資訊，請參閱 [搭配 SUPER 資料類型路徑使用動態資料遮罩](t_ddm-super.md)。

建議您在使用 SUPER 資料時，將 `r_enable_case_sensitive_super_attribute` 組態選項設定為 true。如需詳細資訊，請參閱[enable\$1case\$1sensitive\$1super\$1attribute](r_enable_case_sensitive_super_attribute.md)。

# VARBYTE 類型
<a name="r_VARBYTE_type"></a>

使用 VARBYTE、VARBINARY 或 BINARY VARYING 欄來儲存具有固定限制的可變長度二進位值。

```
varbyte [ (n) ]
```

位元組數上限 (*n*) 的範圍為 1 – 16，777，216。預設值為 64,000。

可以使用 VARBYTE 資料類型的一些範例如下：
+ 在 VARBYTE 欄上聯結資料表。
+ 建立包含 VARBYTE 欄的具體化視觀表。支援包含 VARBYTE 欄的具體化視觀表累加式重新整理。但是，VARBYTE 欄上的 COUNT、MIN 和 MAX 和 GROUP BY 以外的彙總函數不支援累加式重新整理。

為了確保所有位元組都是可列印字元，Amazon Redshift 使用十六進位格式來列印 VARBYTE 值。例如，下列 SQL 會將十六進位字串 `6162` 轉換成二進位值。即使傳回的值是二進位值，結果仍會列印為十六進位 `6162`。

```
select from_hex('6162');
                      
 from_hex
----------
 6162
```

Amazon Redshift 支援在 VARBYTE 和以下資料類型之間進行轉換：
+ CHAR
+ VARCHAR
+ SMALLINT
+ INTEGER
+ BIGINT

使用 CHAR 和 VARCHAR 進行轉換時，將使用 UTF-8 格式。如需有關 UTF-8 格式的相關資訊，請參閱 [TO\$1VARBYTE](r_TO_VARBYTE.md)。從 SMALLINT、INTEGER 和 BIGINT 進行轉換時，會保留原始資料類型的位元組數目。這對於 SMALLINT 來說是兩個位元組、對於 INTEGER 來說是四個位元組、對於 BIGINT 來說是八個位元組。

下列 SQL 陳述式將 VARCHAR 字串轉換為 VARBYTE。即使傳回的值是二進位值，結果仍會列印為十六進位 `616263`。

```
select 'abc'::varbyte;
                      
 varbyte
---------
 616263
```

下列 SQL 陳述式將欄中的 CHAR 值轉換為 VARBYTE。這個範例會建立一個包含 CHAR(10) 欄 (c) 的資料表，插入長度小於 10 的字元值。產生的轉換將結果以空格字元 (hex'20') 填入定義的欄大小。即使傳回的值是二進位值，結果仍會列印為十六進位。

```
create table t (c char(10));
insert into t values ('aa'), ('abc');                 
select c::varbyte from t;
          c
----------------------
 61612020202020202020
 61626320202020202020
```

下列 SQL 陳述式將 SMALLINT 字串轉換為 VARBYTE。即使傳回的值是二進位值，結果仍會列印為十六進位 `0005`，即兩個位元組或四個十六進位字元。

```
select 5::smallint::varbyte;
                  
 varbyte
---------
 0005
```

下列 SQL 陳述式將 INTEGER 轉換為 VARBYTE。即使傳回的值是二進位值，結果仍會列印為十六進位 `00000005`，即四個位元組或八個十六進位字元。

```
select 5::int::varbyte;
                  
 varbyte
----------
 00000005
```

下列 SQL 陳述式將 BIGINT 轉換為 VARBYTE。即使傳回的值是二進位值，結果仍會列印為十六進位 `0000000000000005`，即八個位元組或 16 個十六進位字元。

```
select 5::bigint::varbyte;
                  
     varbyte
------------------
 0000000000000005
```

支援 VARBYTE 資料類型的 Amazon Redshift 功能包括：
+ [VARBYTE 運算子](r_VARBYTE_OPERATORS.md)
+ [CONCAT](r_CONCAT.md)
+ [LEN](r_LEN.md)
+ [LENGTH 函數](r_LENGTH.md)
+ [OCTET\$1LENGTH](r_OCTET_LENGTH.md)
+ [SUBSTRING 函數](r_SUBSTRING.md)
+ [FROM\$1HEX](r_FROM_HEX.md)
+ [TO\$1HEX](r_TO_HEX.md)
+ [FROM\$1VARBYTE](r_FROM_VARBYTE.md)
+ [TO\$1VARBYTE](r_TO_VARBYTE.md)
+ [GETBIT](r_GETBIT.md)
+ [載入 VARBYTE 資料類型的欄](copy-usage-varbyte.md)
+ [卸載 VARBYTE 資料類型的欄](r_UNLOAD.md#unload-usage-notes)

## 將 VARBYTE 資料類型與 Amazon Redshift 搭配使用時的限制
<a name="varbyte-limitations"></a>

以下是將 VARBYTE 資料類型與 Amazon Redshift 搭配使用時的限制：
+ Amazon Redshift Spectrum 僅支援 Parquet 和 ORC 檔案的 VARBYTE 資料類型。
+ Amazon Redshift 查詢編輯器和 Amazon Redshift 查詢編輯器 v2 尚未完全支援 VARBYTE 資料類型。因此，在使用 VARBYTE 運算式時，請使用不同的 SQL 用戶端。

  做為使用查詢編輯器的解決方法，如果您的資料長度等於或低於 16，000，000 位元組，且內容是有效的 UTF-8，您可以將 VARBYTE 值轉換為 VARCHAR，例如：

  ```
  select to_varbyte('6162', 'hex')::varchar;
  ```
+ 您不能將 VARBYTE 資料類別搭配 Python 或 Lambda 使用者定義函數 (UDF) 使用。
+ 您無法從 VARBYTE 欄建立 HLLSKETCH 欄，也無法在 VARBYTE 欄上使用 APPROXIMATE COUNT DISTINCT。
+ 大於 1MB 的 VARBYTE 值只能從下列檔案格式擷取：
  + Parquet
  + 文字
  + 逗號分隔值 (CSV)

## 類型相容性與轉換
<a name="r_Type_conversion"></a>

接下來的內容將會說明在 Amazon Redshift 中，類型轉換規則與資料類型相容性的運作方式。

### 相容性
<a name="r_Type_conversion-compatibility"></a>

 在資料庫各種操作的作業期間，會進行資料類型的比對，以及字面值與常數和資料類型的比對，包括下列的操作：
+ 對資料表進行的資料處理語言 (DML) 操作 
+ UNION、INTERSECT 和 EXCEPT 查詢 
+ CASE 表達式 
+ 述詞的評估，例如 LIKE 和 IN 
+ 針對進行資料比較或擷取的 SQL 函式，進行評估 
+ 數學運算子的比較 

這些操作的結果，取決於類型轉換規則和資料類型的相容性。*相容性*暗示並不一定需要針對某些值和某些資料類型，進行一對一的比對。由於某些資料類型是*相容*的，因此可進行隱含轉換或*強制轉換* (如需詳細資訊，請參閱 [隱含轉換類型](#implicit-conversion-types))。當資料類型不相容時，有時您可以使用明確的轉換函式，來將值從一種資料類型轉換為另一種。

### 一般相容性與轉換規則
<a name="r_Type_conversion-general-compatibility-and-conversion-rules"></a>

請注意下列的相容性與轉換規則：
+ 一般而言，屬於相同類型類別的資料類型 (例如不同的數值資料類型)，彼此可以相容和隱含轉換。

  例如，進行隱含轉換時，您可以將小數值插入整數資料欄。小數會經過四捨五入而變成整數。或者，您可以從日期中擷取 `2008` 等數值，然後將該數值插入整數資料欄。
+ 當您試圖插入超出範圍的值時，數值資料類型會強制讓溢位狀況發生。例如，精確度為 5 的小數值，不符合精確度定義為 4 的小數資料欄。小數的整數或完整部分一律不會遭到截斷，但是小數的小數部分可以適當地向上或向下四捨五入。不過，從資料表所選取值的明確轉換結果，不會四捨五入。
+ 不同類型的字元字串可以相容；VARCHAR 資料欄字串包含單位元組資料，CHAR 資料欄字串與其類似，可隱含轉換。包含多位元組資料的 VARCHAR 字串並不相容。此外，如果字串是適當的常值，則可以將字元字串轉換為日期、時間、時間戳記或數值；會忽略開頭或結尾的所有空格。相反地，您也可以將日期、時間、時間戳記或數值，轉換為固定長度或可變長度的字元字串。
**注意**  
您想要轉換為數值類型的字元字串，必須包含表示數字的字元。例如，您可以將字串 `'1.0'` 或 `'5.9'` 轉換為小數值，但無法將字串 `'ABC'` 轉換為任何數值類型。
+ 如果您將 DECIMAL 值與字元字串進行比較，Amazon Redshift 會嘗試將字元字串轉換為 DECIMAL 值。比較所有其他數值和字元字串時，數值會轉換為字元字串。若要強制執行相反的轉換 (例如，將字元字串轉換為整數，或將 DECIMAL 值轉換為字元字串)，請使用明確函數，例如 [CAST](r_CAST_function.md)。
+ 若要將 64 位元的 DECIMAL 或 NUMERIC 值轉換為較高的精確度，您必須使用明確轉換函式，例如 CAST 或 CONVERT 函式。
+ 將 DATE 或 TIMESTAMP 轉換為 TIMESTAMPTZ，或將 TIME 轉換為 TIMETZ 時，時區會設定為目前的工作階段時區。工作階段預設的時區為 UTC。如需設定工作階段時區的相關資訊，請參閱 [timezone](r_timezone_config.md)。
+ 同樣地，TIMESTAMPTZ 轉換為 DATE、TIME 或 TIMESTAMP 時，也會使用目前工作階段的時區。工作階段預設的時區為 UTC。在轉換之後，會去掉時區的資訊。
+ 用來表示指定時區之時間戳記的字元字串，會使用目前工作階段時區 (預設為 UTC) 轉換為 TIMESTAMPTZ。同樣地，代表指定時區之時間的字元字串，也會使用目前的工作階段時區 (預設為 UTC) 轉換為 TIMETZ。

### 隱含轉換類型
<a name="implicit-conversion-types"></a>

隱含轉換有兩種：
+ 指派敘述中的隱含轉換，例如設定 INSERT 或 UPDATE 指令中的值。
+ 表達式中的隱含轉換，例如在 WHERE 子句中進行比較。

下表列出了可以在指派敘述或表達式中隱含轉換的資料類型。您也可以使用明確轉換函式來進行這些轉換。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_Supported_data_types.html)

**注意**  
TIMESTAMPTZ、TIMESTAMP、DATE、TIME、TIMETZ 或字元字串之間的隱含轉換，會使用目前工作階段的時區。關於設定目前的時區，詳細資訊請參閱 [timezone](r_timezone_config.md)。  
GEOMETRY 和 GEOGRAPHY 資料類型無法隱含轉換為彼此以外的任何其他資料類型。如需詳細資訊，請參閱[CAST 函數](r_CAST_function.md)。  
VARBYTE 資料類型無法隱含轉換至任何其他資料類型。如需詳細資訊，請參閱[CAST 函數](r_CAST_function.md)。

### 將動態類型用於 SUPER 資料類型
<a name="r_dynamic_typing_SUPER"></a>

Amazon Redshift 會使用動態類型來處理無結構描述的 SUPER 資料，無需在查詢中使用資料類型之前先宣告資料類型。動態類型會使用導覽至 SUPER 資料欄的結果，而不必明確地將它們轉換為 Amazon Redshift 類型。如需將動態類型用於 SUPER 資料類型的相關資訊，請參閱[動態類型](query-super.md#dynamic-typing-lax-processing)。

您可以將 SUPER 值與其他資料類型互相轉換，但有一些例外情況。如需詳細資訊，請參閱[限制](limitations-super.md)。

# 定序序列
<a name="c_collation_sequences"></a>

Amazon Redshift 不支援地區特定或使用者定義的定序句。一般而言，如果缺少對資料值進行排序和比較時的地區特定規則，可能會影響到所有內容中任何述詞的結果。例如，ORDER BY 表達式和 MIN、MAX 及 RANK 等函式，會根據資料的二進位 UTF8 排序來傳回結果，並未將地區特定的字元納入考量。

# 表達式
<a name="r_expressions"></a>

**Topics**
+ [簡易表達式](#r_expressions-simple-expressions)
+ [複合運算式](r_compound_expressions.md)
+ [表達式清單](r_expression_lists.md)
+ [賦值子查詢](r_scalar_subqueries.md)
+ [函數表達式](r_function_expressions.md)

表達式結合了一個或多個值、運算子或求值的函式。表達式的資料類型通常是其組成項目的資料類型。

## 簡易表達式
<a name="r_expressions-simple-expressions"></a>

簡易表達式包括：
+ 常數或常值 
+ 資料欄名稱或資料欄參考 
+ 純量函式 
+ 彙總 (集) 函式 
+ 視窗函式 
+ 賦值子查詢 

簡易表達式的範例包括：

```
5+12
dateid
sales.qtysold * 100
sqrt (4)
max (qtysold)
(select max (qtysold) from sales)
```

# 複合運算式
<a name="r_compound_expressions"></a>

複合表達式是由算術運算子聯結的一連串的簡單表達式。在複合表達式中使用的簡易表達式，必須傳回數值。

## 語法
<a name="r_compound_expressions-synopsis"></a>

```
expression 
operator 
expression | (compound_expression)
```

## 引數
<a name="r_compound_expressions-arguments"></a>

 *表達式*   
求值的簡易表達式。

 *operator*   
 複合的算術表達式可使用下列的運算子來建構，依此優先順序使用：  
+ ( )：用來控制求值順序的括號
+ \$1、-：正號和負號/運算子
+  ^、\$1/、\$1\$1/：乘冪、平方根、立方根
+ \$1、/、%：乘法、除法和模除運算子
+  @：絕對值
+ \$1、-：加和減
+ &、\$1、\$1、\$1、<<、>>：AND、OR、NOT、向左移位、向右移位的位元運算子
+ \$1\$1：串接

 *(compound\$1expression)*   
複合運算式可以使用括號來巢狀化。

## 範例
<a name="r_compound_expressions-examples"></a>

複合運算式的範例包括下列。

```
('SMITH' || 'JONES')
sum(x) / y
sqrt(256) * avg(column)
rank() over (order by qtysold) / 100
(select (pricepaid - commission) from sales where dateid = 1882) * (qtysold)
```

某些函式也可以嵌套於其他函式內。例如，任何純量函式都可以嵌套在另一個純量函式之內。下列的範例會傳回一組數字的絕對值總和：

```
sum(abs(qtysold))
```

視窗函式不能做為彙總函式或其他視窗函式的引數使用。下列的表達式會傳回錯誤：

```
avg(rank() over (order by qtysold))
```

視窗函式可以嵌套彙總函式。下列的表達式會求出值集合的總和，然後加以排序：

```
rank() over (order by sum(qtysold))
```

# 表達式清單
<a name="r_expression_lists"></a>

表達式清單是表達式的組合，可以出現在成員資格與比較條件 (WHERE 子句)，以及 GROUP BY 子句中。

## 語法
<a name="r_expression_lists-synopsis"></a>

```
expression , expression , ... | (expression, expression, ...)
```

## 引數
<a name="r_expression_lists-arguments"></a>

 *表達式*   
求值的簡易表達式。表達式清單可以包含用英文逗號分隔的一個或多個表達式，或是用英文逗號分隔的一組或多組表達式。如果包含多組表達式，則每組都必須包含相同數量的表達式，並且用括號分隔。每組中的表達式數量，都必須符合條件中運算子前面的表達式數目。

## 範例
<a name="r_expression_lists-examples"></a>

下列是條件中的表達式清單範例：

```
(1, 5, 10)
('THESE', 'ARE', 'STRINGS')
(('one', 'two', 'three'), ('blue', 'yellow', 'green'))
```

每組中的表達式數量，都必須符合陳述式前半部中的數目：

```
select * from venue
where (venuecity, venuestate) in (('Miami', 'FL'), ('Tampa', 'FL'))
order by venueid;

venueid |        venuename        | venuecity | venuestate | venueseats
---------+-------------------------+-----------+------------+------------
28 | American Airlines Arena | Miami     | FL         |          0
54 | St. Pete Times Forum    | Tampa     | FL         |          0
91 | Raymond James Stadium   | Tampa     | FL         |      65647
(3 rows)
```

# 賦值子查詢
<a name="r_scalar_subqueries"></a>

賦值子查詢是括號中的正規 SELECT 查詢，只會傳回一個值 (一列和一個資料欄)。執行此查詢後，傳回的值會在外層的查詢中使用。如果子查詢傳回 0 列，則子查詢表達式的值為 null。如果子查詢傳回超過一列，Amazon Redshift 會傳回錯誤。子查詢可以參照父查詢傳來的變數，此變數會在子查詢的任何一次叫用期間中，做為常數使用。

您可以在叫用表達式的大多數陳述式中，使用賦值子查詢。賦值子查詢在下列的情況中並非有效的表達式：
+ 做為表達式的預設值
+ 在 GROUP BY 和 HAVING 子句中

## 範例
<a name="r_scalar_subqueries-example"></a>

下列的子查詢會針對 2008 年一整年，計算出每次銷售平均支付的價格，外層的查詢接著會使用輸出中的此值，來比較每季的銷售平均價格：

```
select qtr, avg(pricepaid) as avg_saleprice_per_qtr,
(select avg(pricepaid)
from sales join date on sales.dateid=date.dateid
where year = 2008) as avg_saleprice_yearly
from sales join date on sales.dateid=date.dateid
where year = 2008
group by qtr
order by qtr;
qtr  | avg_saleprice_per_qtr | avg_saleprice_yearly
-------+-----------------------+----------------------
1     |                647.64 |               642.28
2     |                646.86 |               642.28
3     |                636.79 |               642.28
4     |                638.26 |               642.28
(4 rows)
```

# 函數表達式
<a name="r_function_expressions"></a>

## 語法
<a name="r_function_expressions-syntax"></a>

任何內建的函式皆可做為表達式使用。函式呼叫的語法，是函式的名稱後面接著括號中的引數列表。

```
function ( [expression [, expression...]] )
```

## 引數
<a name="r_function_expressions-arguments"></a>

 *函數*   
任何內建函式。如需一些範例函數，請參閱[SQL 函數參考](c_SQL_functions.md)。

 *表達式*   
符合函式所預期資料類型和參數數目的任何表達式。

## 範例
<a name="r_function_expressions-examples"></a>

```
abs (variable)
select avg (qtysold + 3) from sales;
select dateadd (day,30,caldate) as plus30days from date;
```

# 條件
<a name="r_conditions"></a>

**Topics**
+ [語法](#r_conditions-synopsis)
+ [比較條件](r_comparison_condition.md)
+ [邏輯條件](r_logical_condition.md)
+ [模式比對條件](pattern-matching-conditions.md)
+ [BETWEEN 範圍條件](r_range_condition.md)
+ [Null 條件](r_null_condition.md)
+ [EXISTS 條件](r_exists_condition.md)
+ [IN 條件](r_in_condition.md)

 條件是一個或多個表達式和邏輯運算子 (判斷值為 true、false 或 unknown) 的陳述式。條件有時也稱為述詞。

**注意**  
所有的字串比較和 LIKE 模式比對，都會區分大小寫。例如，「A」和「a」不符。不過，您可以使用 ILIKE 述詞，來進行不區分大小寫的模式比對。

## 語法
<a name="r_conditions-synopsis"></a>

```
comparison_condition
| logical_condition
| range_condition
| pattern_matching_condition
| null_condition
| EXISTS_condition
| IN_condition
```

# 比較條件
<a name="r_comparison_condition"></a>

比較條件表示兩個值之間的邏輯關係。所有比較條件都是二元運算子，具有 Boolean 傳回類型。Amazon Redshift 支援下表中描述的比較運算子：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_comparison_condition.html)

## 使用須知
<a name="r_comparison_condition_usage_notes"></a>

= ANY \$1 SOME   
ANY 和 SOME 關鍵字等同 *IN* 條件，如果有傳回一個或多個值的子查詢，其所傳回的值至少有一個在比較時為 true，則 ANY 和 SOME 會傳回 true。Amazon Redshift 只支援 ANY 和 SOME 的 = (等於) 條件。不支援不等式條件。  
不支援 ALL 述詞。

<> ALL  
ALL 關鍵字等同 NOT IN (請參閱 [IN 條件](r_in_condition.md) 條件)，如果子查詢的結果中未包含運算式，將會傳回 true。Amazon Redshift 只支援 ALL 的 <> 或 \$1= (不等於) 條件。不支援其他比較條件。

IS TRUE/FALSE/UNKNOWN  
非 0 的值等於 TRUE、0 等於 FALSE，而 null 等於 UNKNOWN。請參閱 [布林值 (Boolean) 類型HLLSKETCH 類型](r_Boolean_type.md) 資料類型。

## 範例
<a name="r_comparison_condition-examples"></a>

下列是比較條件的一些簡單範例：

```
a = 5
a < b
min(x) >= 5
qtysold = any (select qtysold from sales where dateid = 1882
```

下列的查詢會從 VENUE 資料表傳回擁有超過 10,000 個座位的場地：

```
select venueid, venuename, venueseats from venue
where venueseats > 10000
order by venueseats desc;

venueid |           venuename            | venueseats
---------+--------------------------------+------------
83 | FedExField                     |      91704
 6 | New York Giants Stadium        |      80242
79 | Arrowhead Stadium              |      79451
78 | INVESCO Field                  |      76125
69 | Dolphin Stadium                |      74916
67 | Ralph Wilson Stadium           |      73967
76 | Jacksonville Municipal Stadium |      73800
89 | Bank of America Stadium        |      73298
72 | Cleveland Browns Stadium       |      73200
86 | Lambeau Field                  |      72922
...
(57 rows)
```

此範例會從 USERS 資料表中，選取喜歡搖滾樂的使用者 (USERID)：

```
select userid from users where likerock = 't' order by 1 limit 5;

userid
--------
3
5
6
13
16
(5 rows)
```

此範例會從 USERS 資料表中，選取不確定是否喜歡搖滾樂的使用者 (USERID)：

```
select firstname, lastname, likerock
from users
where likerock is unknown
order by userid limit 10;

firstname | lastname | likerock
----------+----------+----------
Rafael    | Taylor   |
Vladimir  | Humphrey |
Barry     | Roy      |
Tamekah   | Juarez   |
Mufutau   | Watkins  |
Naida     | Calderon |
Anika     | Huff     |
Bruce     | Beck     |
Mallory   | Farrell  |
Scarlett  | Mayer    |
(10 rows
```

## 具有 TIME 欄的範例
<a name="r_comparison_condition-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會擷取每個 timetz\$1val 中的小時數。

```
select time_val from time_test where time_val < '3:00';
   time_val
---------------
 00:00:00.5550
 00:58:00
```

下列範例會比較兩個時間常值。

```
select time '18:25:33.123456' = time '18:25:33.123456';
 ?column?
----------
 t
```

## 具有 TIMTZ 欄的範例
<a name="r_comparison_condition-examples-timetz"></a>

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例只會選取小於 `3:00:00 UTC` 的 TIMETZ 值。將值轉換為 UTC 後進行比較。

```
select timetz_val from timetz_test where timetz_val < '3:00:00 UTC';
                  
   timetz_val
---------------
 00:00:00.5550+00
```

下列範例會比較兩個 TIMETZ 常值。比較時會忽略時區。

```
select time '18:25:33.123456 PST' < time '19:25:33.123456 EST';
                  
 ?column?
----------
 t
```

# 邏輯條件
<a name="r_logical_condition"></a>

邏輯條件會合併兩個條件的結果，來產生單一結果。所有的邏輯條件都是二元運算子，具有 Boolean 傳回類型。

## 語法
<a name="r_logical_condition-synopsis"></a>

```
expression
{ AND | OR }
expression
NOT expression
```

邏輯條件使用三種值的布林邏輯，其中 null 值代表未知的關係。下表說明邏輯條件的結果，其中 `E1` 和 `E2` 表示表達式：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_logical_condition.html)

NOT 運算子會在 AND 之前評估，而 AND 運算子會在 OR 運算子之前評估。如果使用任何括號，就可以覆蓋這個預設的評估順序。

### 範例
<a name="r_logical_condition-examples"></a>

下列的範例會從 USERS 資料表，針對其中同時喜歡拉斯維加斯和運動的使用者，傳回其 USERID 和 USERNAME：

```
select userid, username from users
where likevegas = 1 and likesports = 1
order by userid;

userid | username
--------+----------
1 | JSG99FHE
67 | TWU10MZT
87 | DUF19VXU
92 | HYP36WEQ
109 | FPL38HZK
120 | DMJ24GUZ
123 | QZR22XGQ
130 | ZQC82ALK
133 | LBN45WCH
144 | UCX04JKN
165 | TEY68OEB
169 | AYQ83HGO
184 | TVX65AZX
...
(2128 rows)
```

下一個範例會從 USERS 資料表，針對其中喜歡拉斯維加斯或運動，或是這兩者的使用者，傳回其 USERID 和 USERNAME。此查詢會傳回前一個範例的所有輸出資料，加上只喜歡拉斯維加斯或運動的使用者。

```
select userid, username from users
where likevegas = 1 or likesports = 1
order by userid;

userid | username
--------+----------
1 | JSG99FHE
2 | PGL08LJI
3 | IFT66TXU
5 | AEB55QTM
6 | NDQ15VBM
9 | MSD36KVR
10 | WKW41AIW
13 | QTF33MCG
15 | OWU78MTR
16 | ZMG93CDD
22 | RHT62AGI
27 | KOY02CVE
29 | HUH27PKK
...
(18968 rows)
```

下列的查詢在 `OR` 條件周圍加上括號，以找出在紐約或加州上演「馬克白」的場地：

```
select distinct venuename, venuecity
from venue join event on venue.venueid=event.venueid
where (venuestate = 'NY' or venuestate = 'CA') and eventname='Macbeth'
order by 2,1;

venuename                |   venuecity
----------------------------------------+---------------
Geffen Playhouse                       | Los Angeles
Greek Theatre                          | Los Angeles
Royce Hall                             | Los Angeles
American Airlines Theatre              | New York City
August Wilson Theatre                  | New York City
Belasco Theatre                        | New York City
Bernard B. Jacobs Theatre              | New York City
...
```

如果移除此範例中的括號，將會改變查詢的邏輯和結果。

下列的範例使用 `NOT` 運算子：

```
select * from category
where not catid=1
order by 1;

catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
2 | Sports   | NHL       | National Hockey League
3 | Sports   | NFL       | National Football League
4 | Sports   | NBA       | National Basketball Association
5 | Sports   | MLS       | Major League Soccer
...
```

下列範例使用 `NOT` 條件，後接 `AND` 條件：

```
select * from category
where (not catid=1) and catgroup='Sports'
order by catid;

catid | catgroup | catname |             catdesc
-------+----------+---------+---------------------------------
2 | Sports   | NHL     | National Hockey League
3 | Sports   | NFL     | National Football League
4 | Sports   | NBA     | National Basketball Association
5 | Sports   | MLS     | Major League Soccer
(4 rows)
```

# 模式比對條件
<a name="pattern-matching-conditions"></a>

**Topics**
+ [LIKE](r_patternmatching_condition_like.md)
+ [SIMILAR TO](pattern-matching-conditions-similar-to.md)
+ [POSIX 運算子](pattern-matching-conditions-posix.md)

模式比對運算子會依據條件表達式中所指定的模式，來搜尋字串，並根據是否找到符合的結果，傳回 true 或 false。Amazon Redshift 使用三種方法進行模式比對：
+ LIKE 表達式

  LIKE 運算子會利用模式 (此模式使用萬用字元 `%` (百分比) 和 `_` (底線)) 來比較字串表達式 (例如資料欄的名稱)。LIKE 模式比對的範圍一律涵蓋整個字串。LIKE 會進行區分大小寫的比對，ILIKE 則會進行不區分大小寫的比對。
+ SIMILAR TO 規則表達式

  SIMILAR TO 運算子會利用 SQL 標準規則表達式的模式，來比對字串表達式，此模式包含一組模式比對中繼字元，其中包括 LIKE 運算子所支援的兩個字元。SIMILAR TO 會比對整個字串，並進行區分大小寫的比對。
+ POSIX 樣式規則表達式 

  POSIX 規則表達式提供了更強大的方法，來進行 LIKE 和 SIMILAR TO 運算子以外的模式比對。POSIX 規則表達式可比對字串的任何部分，並進行區分大小寫的比對。

使用 SIMILAR TO 或 POSIX 運算子進行的規則表達式比對，其運算成本非常昂貴。我們建議盡可能使用 LIKE，尤其是在處理極為龐大的列數時。例如，下列的查詢在功能上相同，但相較於使用規則運算式的查詢，使用 LIKE 的查詢，其執行速度快上好幾倍：

```
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

# LIKE
<a name="r_patternmatching_condition_like"></a>

LIKE 運算子會利用模式 (此模式使用萬用字元 % (百分比) 和 \$1 (底線)) 來比較字串表達式 (例如資料欄的名稱)。LIKE 模式比對的範圍一律涵蓋整個字串。若要比對字串中任意位置的序列，模式必須以百分比符號開頭和結尾。

LIKE 區分大小寫；ILIKE 不區分大小寫。

## 語法
<a name="r_patternmatching_condition_like-synopsis"></a>

```
expression [ NOT ] LIKE | ILIKE pattern [ ESCAPE 'escape_char' ]
```

## 引數
<a name="r_patternmatching_condition_like-arguments"></a>

 *表達式*   
有效的 UTF-8 字元表達式，例如資料欄的名稱。

LIKE \$1 ILIKE   
LIKE 會進行區分大小寫的模式比對。ILIKE 會針對單位元組 UTF-8 (ASCII) 字元，進行不區分大小寫的模式比對。若要對多位元組字元執行不區分大小寫的模式比對，請在具有 LIKE 條件的 *expression* 和 *pattern* 上使用 [LOWER](r_LOWER.md) 函數。  
不同於比較述詞，例如 = 和 <>，LIKE 和 ILIKE 述詞並未隱含忽略結尾空格。若要忽略結尾空格，請 RTRIM 或將 CHAR 資料欄明確轉換為 VARCHAR。  
`~~` 運算子相當於 LIKE，而 `~~*` 相當於 ILIKE。此外，`!~~` 和 `!~~*` 運算子相當於 NOT LIKE 和 NOT ILIKE。

 *pattern*   
有效的 UTF-8 字元表達式，包含要比對的模式。

 *escape\$1char*   
字元表達式，將會用來逸出模式中的中繼字元。預設值為兩個反斜線 (「\$1\$1」)。

如果 *pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。

兩個字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果不同，Amazon Redshift 會將 *pattern* 轉換為 *expression* 的資料類型。

LIKE 支援下列的模式比對中繼字元：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_patternmatching_condition_like.html)

## 範例
<a name="r_patternmatching_condition_like-examples"></a>

下表顯示範例，示範使用 LIKE 進行的模式比對：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_patternmatching_condition_like.html)

下列範例會找出名稱以「E」開頭的所有城市：

```
select distinct city from users
where city like 'E%' order by city;
city
---------------
East Hartford
East Lansing
East Rutherford
East St. Louis
Easthampton
Easton
Eatontown
Eau Claire
...
```

下列範例會找出姓氏中包含「ten」的使用者：

```
select distinct lastname from users
where lastname like '%ten%' order by lastname;
lastname
-------------
Christensen
Wooten
...
```

以下範例示範如何比對多個模式。

```
select distinct lastname from tickit.users
where lastname like 'Chris%' or lastname like '%Wooten' order by lastname;
lastname
-------------
Christensen
Christian
Wooten
...
```

下列範例會找出名稱中第 3 個和第 4 個字元為「ea」的城市。此指令使用 ILIKE 來示範不區分大小寫：

```
select distinct city from users where city ilike '__EA%' order by city;
city
-------------
Brea
Clearwater
Great Falls
Ocean City
Olean
Wheaton
(6 rows)
```

下列的範例使用預設的逸出字串 (\$1\$1)，來搜尋包含「\$1」的字串 (文字 `start` 後跟底線 `_`)：

```
select tablename, "column" from pg_table_def 
where "column" like '%start\\_%'
limit 5;

     tablename     |    column
-------------------+---------------
 stl_s3client      | start_time
 stl_tr_conflict   | xact_start_ts
 stl_undone        | undo_start_ts
 stl_unload_log    | start_time
 stl_vacuum_detail | start_row
(5 rows)
```

下列的範例將「^」指定為逸出字元，然後使用該逸出字元來搜尋包含「\$1」的字串 (文字 `start` 後跟底線 `_`)：

```
select tablename, "column" from pg_table_def 
where "column" like '%start^_%' escape '^' 
limit 5;

     tablename     |    column
-------------------+---------------
 stl_s3client      | start_time
 stl_tr_conflict   | xact_start_ts
 stl_undone        | undo_start_ts
 stl_unload_log    | start_time
 stl_vacuum_detail | start_row
(5 rows)
```

下列範例會使用 `~~*` 運算子執行不區分大小寫 (ILIKE)，搜尋以「Ag」開頭的城市。

```
select distinct city from users where city ~~* 'Ag%' order by city;
                   
city
------------
Agat	
Agawam	
Agoura Hills	
Aguadilla
```

# SIMILAR TO
<a name="pattern-matching-conditions-similar-to"></a>

SIMILAR TO 運算子會利用 SQL 標準規則表達式的模式，來比對字串表達式 (例如資料欄的名稱)。SQL 標準規則表達式的模式可包含一組模式比對中繼字元，其中包括 [LIKE](r_patternmatching_condition_like.md) 運算子所支援的兩個字元。

SIMILAR TO 運算子只會在其模式符合整個字串時傳回 true，不像 POSIX 規則表達式，其模式可以符合字串的任何部分。

SIMILAR TO 會進行區分大小寫的比對。

**注意**  
使用 SIMILAR TO 進行的規則表達式比對，其運算成本非常昂貴。我們建議盡可能使用 LIKE，尤其是在處理極為龐大的列數時。例如，下列的查詢在功能上相同，但相較於使用規則運算式的查詢，使用 LIKE 的查詢，其執行速度快上好幾倍：  

```
select count(*) from event where eventname SIMILAR TO '%(Ring|Die)%'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

## 語法
<a name="pattern-matching-conditions-similar-to-synopsis"></a>

```
expression [ NOT ] SIMILAR TO pattern [ ESCAPE 'escape_char' ]
```

## 引數
<a name="pattern-matching-conditions-similar-to-arguments"></a>

 *表達式*   
有效的 UTF-8 字元表達式，例如資料欄的名稱。

SIMILAR TO  
SIMILAR TO 會針對 *expression* 中的整個字串，進行區分大小寫的模式比對。

 *pattern*   
有效的 UTF-8 字元表達式，代表 SQL 標準規則表達式的模式。

 *escape\$1char*   
字元表達式，將會用來逸出模式中的中繼字元。預設值為兩個反斜線 (「\$1\$1」)。

如果*模式*未包含任何中繼字元，則模式只代表字串本身。

兩個字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果不同，Amazon Redshift 會將 *pattern* 轉換為 *expression* 的資料類型。

SIMILAR TO 支援下列的模式比對中繼字元：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-similar-to.html)

## 範例
<a name="pattern-matching-conditions-similar-to-examples"></a>

下表顯示範例，示範使用 SIMILAR TO 進行的模式比對：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-similar-to.html)

下列範例會找出名稱中包含「E」或「H」的城市：

```
SELECT DISTINCT city FROM users
WHERE city SIMILAR TO '%E%|%H%' ORDER BY city LIMIT 5;

      city
-----------------
 Agoura Hills
 Auburn Hills
 Benton Harbor
 Beverly Hills
 Chicago Heights
```

下列的範例使用預設的逸出字串 (「`\\`」)，來搜尋包含「`_`」的字串：

```
SELECT tablename, "column" FROM pg_table_def
WHERE "column" SIMILAR TO '%start\\_%'
ORDER BY tablename, "column" LIMIT 5;

        tablename         |       column
--------------------------+---------------------
 stcs_abort_idle          | idle_start_time
 stcs_abort_idle          | txn_start_time
 stcs_analyze_compression | start_time
 stcs_auto_worker_levels  | start_level
 stcs_auto_worker_levels  | start_wlm_occupancy
```

下列的範例將「`^`」指定為逸出字元，然後使用該逸出字元來搜尋包含「`_`」的字串：

```
SELECT tablename, "column" FROM pg_table_def
WHERE "column" SIMILAR TO '%start^_%' ESCAPE '^'
ORDER BY tablename, "column" LIMIT 5;

        tablename         |       column
--------------------------+---------------------
 stcs_abort_idle          | idle_start_time
 stcs_abort_idle          | txn_start_time
 stcs_analyze_compression | start_time
 stcs_auto_worker_levels  | start_level
 stcs_auto_worker_levels  | start_wlm_occupancy
```

# POSIX 運算子
<a name="pattern-matching-conditions-posix"></a>

POSIX 規則運算式是指定比對模式的字元序列。如果字串是規則運算式所描述之規則集的成員，就會比對規則運算式。

POSIX 規則表達式提供了更強大的方法，來進行 [LIKE](r_patternmatching_condition_like.md) 和 [SIMILAR TO](pattern-matching-conditions-similar-to.md) 運算子以外的模式比對。POSIX 規則表達式的模式可以符合字串的任何部分，不像 SIMILAR TO 運算子只在其模式符合整個字串時，才會傳回 true。

**注意**  
使用或 POSIX 運算子進行的規則表達式比對，其運算成本非常昂貴。我們建議盡可能使用 LIKE，尤其是在處理極為龐大的列數時。例如，下列的查詢在功能上相同，但相較於使用規則運算式的查詢，使用 LIKE 的查詢，其執行速度快上好幾倍：  

```
select count(*) from event where eventname ~ '.*(Ring|Die).*'; 
select count(*) from event where eventname LIKE '%Ring%' OR eventname LIKE '%Die%';
```

## 語法
<a name="pattern-matching-conditions-posix-synopsis"></a>

```
expression [ ! ] ~ pattern
```

## 引數
<a name="pattern-matching-conditions-posix-arguments"></a>

 *表達式*   
有效的 UTF-8 字元表達式，例如資料欄的名稱。

\$1  
否定運算子。不符合規則運算式。

\$1  
針對 *expression* 的任何子字串，進行區分大小寫的比對。  
`~~` 是 [LIKE](r_patternmatching_condition_like.md) 的同義詞。

 *pattern*   
代表規則運算式模式的字串常值。

如果*模式*未包含萬用字元，則模式只代表字串本身。

若要搜尋包含中繼字元 (例如「`. * | ? `」等) 的字串，請使用兩個反斜線 (「` \\`」) 來逸出字元。不像 `SIMILAR TO` 和 `LIKE`，POSIX 規則表達式的語法不支援使用者定義的逸出字元。

兩個字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果不同，Amazon Redshift 會將 *pattern* 轉換為 *expression* 的資料類型。

所有的字元表達式都可以是 CHAR 或 VARCHAR 資料類型。如果運算式的資料類型不同，Amazon Redshift 會將其轉換為 *expression* 的資料類型。

POSIX 模式比對支援下列的中繼字元：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-posix.html)

Amazon Redshift 支援下列的 POSIX 字元類別。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-posix.html)

 Amazon Redshift 在規則運算式中支援下列受到 Perl 影響的運算子。使用兩個反斜線 (「`\\`」) 來逸出運算子。  

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-posix.html)

## 範例
<a name="pattern-matching-conditions-posix-synopsis-examples"></a>

下表顯示範例，示範使用 POSIX 運算子進行的模式比對：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/pattern-matching-conditions-posix.html)

下列範例會找出名稱中包含 `E` 或 `H` 的城市：

```
SELECT DISTINCT city FROM users
WHERE city ~ '.*E.*|.*H.*' ORDER BY city LIMIT 5;

      city
-----------------
 Agoura Hills
 Auburn Hills
 Benton Harbor
 Beverly Hills
 Chicago Heights
```

下列範例會找出名稱中不包含 `E` 或 `H` 的所有城市：

```
SELECT DISTINCT city FROM users WHERE city !~ '.*E.*|.*H.*' ORDER BY city LIMIT 5;

      city
-----------------
 Aberdeen	
 Abilene	
 Ada	
 Agat	
 Agawam
```

下列的範例使用逸出字串 (「`\\`」) 來搜尋包含英文句點的字串。

```
SELECT venuename FROM venue
WHERE venuename ~ '.*\\..*'
ORDER BY venueid;

          venuename
------------------------------
 St. Pete Times Forum
 Jobing.com Arena
 Hubert H. Humphrey Metrodome
 U.S. Cellular Field
 Superpages.com Center
 E.J. Nutter Center
 Bernard B. Jacobs Theatre
 St. James Theatre
```

# BETWEEN 範圍條件
<a name="r_range_condition"></a>

`BETWEEN` 條件會使用關鍵字 `BETWEEN` 和 `AND`，來檢定表達式是否在一系列值的範圍內。

## 語法
<a name="r_range_condition-synopsis"></a>

```
expression [ NOT ] BETWEEN expression AND expression
```

表達式可以是數值、字元或日期時間 (datetime) 資料類型，但這些類型必須相容。範圍包含端點。

## 範例
<a name="r_range_condition-examples"></a>

第一個範例會計算有多少交易已登錄售出 2、3 或 4 張票券：

```
select count(*) from sales
where qtysold between 2 and 4;

count
--------
104021
(1 row)
```

範圍條件包含開頭值與結尾值。

```
select min(dateid), max(dateid) from sales
where dateid between 1900 and 1910;

min  | max 
-----+-----
1900 | 1910
```

範圍條件中第一個表達式的值，必須小於第二個表達式的值。由於表達式的值，下列的範例一律會傳回 0 列：

```
select count(*) from sales
where qtysold between 4 and 2;

count
-------
0
(1 row)
```

不過，套用 NOT 修飾符將會反轉邏輯，產生所有列的計數：

```
select count(*) from sales
where qtysold not between 4 and 2;

count
--------
172456
(1 row)
```

下列的查詢會傳回擁有 20,000 到 50,000 個座位的場地清單：

```
select venueid, venuename, venueseats from venue
where venueseats between 20000 and 50000
order by venueseats desc;

venueid |       venuename               | venueseats
---------+-------------------------------+------------
116 | Busch Stadium                 |      49660
106 | Rangers BallPark in Arlington |      49115
96 | Oriole Park at Camden Yards   |      48876
...
(22 rows)
```

下列範例示範使用 BETWEEN 的日期值：

```
select salesid, qtysold, pricepaid, commission, saletime 
from sales 
where eventid between 1000 and 2000 
   and saletime between '2008-01-01' and '2008-01-03'
order by saletime asc;

salesid | qtysold | pricepaid | commission |   saletime
--------+---------+-----------+------------+---------------
  65082 |       4 |       472 |       70.8 | 1/1/2008 06:06
 110917 |       1 |       337 |      50.55 | 1/1/2008 07:05
 112103 |       1 |       241 |      36.15 | 1/2/2008 03:15
 137882 |       3 |      1473 |     220.95 | 1/2/2008 05:18
  40331 |       2 |        58 |        8.7 | 1/2/2008 05:57
 110918 |       3 |      1011 |     151.65 | 1/2/2008 07:17
  96274 |       1 |       104 |       15.6 | 1/2/2008 07:18
 150499 |       3 |       135 |      20.25 | 1/2/2008 07:20
  68413 |       2 |       158 |       23.7 | 1/2/2008 08:12
```

請注意，儘管 BETWEEN 的範圍包含在內，但日期預設的時間值為 00:00:00。範例查詢的唯一有效 1 月 3 日列是銷售時間為 `1/3/2008 00:00:00` 的列。

# Null 條件
<a name="r_null_condition"></a>

null 條件會檢定 null (缺少值或是值未知)。

## 語法
<a name="r_null_condition-synopsis"></a>

```
expression IS [ NOT ] NULL
```

## 引數
<a name="r_null_condition-arguments"></a>

 *表達式*   
任何表達式，例如資料欄。

IS NULL   
表達式的值如果是 null 則為 true，表達式的值如果包含值，則為 false。

 IS NOT NULL   
表達式的值如果是 null 則為 false，表達式的值如果包含值，則為 true。

## 範例
<a name="r_null_condition-example"></a>

此範例顯示 SALES 資料表的 QTYSOLD 欄位中有多少次包含 null：

```
select count(*) from sales
where qtysold is null;
count
-------
0
(1 row)
```

# EXISTS 條件
<a name="r_exists_condition"></a>

EXISTS 條件會檢定在子查詢中是否存在列，如果子查詢傳回至少一列，則傳回 true。如果指定 NOT，則此條件會在子查詢未傳回任何列時傳回 true。

## 語法
<a name="r_exists_condition-synopsis"></a>

```
[ NOT ] EXISTS (table_subquery)
```

## 引數
<a name="r_exists_condition-arguments"></a>

 EXISTS   
當 *table\$1subquery* 傳回至少一列時，其值為 true。

NOT EXISTS   
當 *table\$1subquery* 未傳回任何列時，其值為 true。

 *table\$1subquery*   
子查詢，會評估包含一個或多個欄和一列或多列的資料表。

## 範例
<a name="r_exists_condition-example"></a>

此範例會針對具有任何類型銷售的日期，傳回所有的日期識別碼，一次一個：

```
select dateid from date
where exists (
select 1 from sales
where date.dateid = sales.dateid
)
order by dateid;

dateid
--------
1827
1828
1829
...
```

# IN 條件
<a name="r_in_condition"></a>

IN 條件會檢定值是否隸屬於一組值或子查詢。

## 語法
<a name="r_in_condition-synopsis"></a>

```
expression [ NOT ] IN (expr_list | table_subquery)
```

## 引數
<a name="r_in_condition-arguments"></a>

 *表達式*   
數值、字元或日期時間 (datetime) 表達式，會根據 *expr\$1list* 或 *table\$1subquery* 進行評估，而且必須與該清單或子查詢的資料類型相容。

 *expr\$1list*   
用英文逗號分隔的一個或多個表達式，或是用英文逗號分隔的一組或多組表達式 (用括號括住)。

 *table\$1subquery*   
子查詢，會評估包含一列或多列的資料表，但是其選擇清單中只限包含一個欄。

IN \$1 NOT IN   
如果表達式是表達式清單或查詢的成員，IN 會傳回 true。如果表達式不是成員，NOT IN 會傳回 true。在下列情況中，IN 和 NOT IN 會傳回 Null，而且不會傳回任何列：如果 *expression* 產生 null；或如果沒有符合的 *expr\$1list* 或 *table\$1subquery* 值，而且這些比較列其中至少有一列產生 null。

## 範例
<a name="r_in_condition-examples"></a>

只有這些列出的值，才會讓下列條件傳回 true：

```
qtysold in (2, 4, 5)
date.day in ('Mon', 'Tues')
date.month not in ('Oct', 'Nov', 'Dec')
```

## 大型 IN 清單的最佳化
<a name="r_in_condition-optimization-for-large-in-lists"></a>

為了實現最佳化的查詢效能，包含超過 10 個值的 IN 清單，會在內部轉換為純量陣列。包含不到 10 個值的 IN 清單，會轉換為一系列的 OR 述詞。支援這個最佳化功能的包括 SMALLINT、INTEGER、BIGINT、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE、TIMESTAMP 和 TIMESTAMPTZ 等資料類型。

請檢視查詢的 EXPLAIN 輸出，以查看這個最佳化機制的效果。例如：

```
explain select * from sales
QUERY PLAN
--------------------------------------------------------------------
XN Seq Scan on sales  (cost=0.00..6035.96 rows=86228 width=53)
Filter: (salesid = ANY ('{1,2,3,4,5,6,7,8,9,10,11}'::integer[]))
(2 rows)
```

# SQL 命令
<a name="c_SQL_commands"></a>

SQL 語言包含您用來建立和操作資料庫物件、執行查詢、載入資料表，以及修改資料表中資料的命令。

Amazon Redshift 以 PostgreSQL 為基礎。在設計和開發您的資料倉儲應用程式時，您必須知道 Amazon Redshift 與 PostgreSQL 之間有多項重要的差異。如需 Amazon Redshift SQL 與 PostgreSQL 之間差異的相關資訊，請參閱 [Amazon Redshift 和 PostgreSQL](c_redshift-and-postgres-sql.md)。

**注意**  
單一 SQL 陳述式的大小上限為 16 MB。

**Topics**
+ [ABORT](r_ABORT.md)
+ [ALTER DATABASE](r_ALTER_DATABASE.md)
+ [ALTER DATASHARE](r_ALTER_DATASHARE.md)
+ [ALTER DEFAULT PRIVILEGES](r_ALTER_DEFAULT_PRIVILEGES.md)
+ [ALTER EXTERNAL SCHEMA](r_ALTER_EXTERNAL_SCHEMA.md)
+ [ALTER EXTERNAL VIEW](r_ALTER_EXTERNAL_VIEW.md)
+ [ALTER FUNCTION](r_ALTER_FUNCTION.md)
+ [ALTER GROUP](r_ALTER_GROUP.md)
+ [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md)
+ [ALTER MASKING POLICY](r_ALTER_MASKING_POLICY.md)
+ [ALTER MATERIALIZED VIEW](r_ALTER_MATERIALIZED_VIEW.md)
+ [ALTER RLS POLICY](r_ALTER_RLS_POLICY.md)
+ [ALTER ROLE](r_ALTER_ROLE.md)
+ [ALTER PROCEDURE](r_ALTER_PROCEDURE.md)
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [ALTER SYSTEM](r_ALTER_SYSTEM.md)
+ [ALTER TABLE](r_ALTER_TABLE.md)
+ [ALTER TABLE APPEND](r_ALTER_TABLE_APPEND.md)
+ [ALTER 範本](r_ALTER_TEMPLATE.md)
+ [ALTER USER](r_ALTER_USER.md)
+ [ANALYZE](r_ANALYZE.md)
+ [ANALYZE COMPRESSION](r_ANALYZE_COMPRESSION.md)
+ [ATTACH MASKING POLICY](r_ATTACH_MASKING_POLICY.md)
+ [ATTACH RLS POLICY](r_ATTACH_RLS_POLICY.md)
+ [BEGIN](r_BEGIN.md)
+ [CALL](r_CALL_procedure.md)
+ [取消](r_CANCEL.md)
+ [CLOSE](close.md)
+ [COMMENT](r_COMMENT.md)
+ [COMMIT](r_COMMIT.md)
+ [COPY](r_COPY.md)
+ [CREATE DATABASE](r_CREATE_DATABASE.md)
+ [CREATE DATASHARE](r_CREATE_DATASHARE.md)
+ [CREATE EXTERNAL FUNCTION](r_CREATE_EXTERNAL_FUNCTION.md)
+ [CREATE EXTERNAL MODEL](r_create_external_model.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)
+ [CREATE EXTERNAL VIEW](r_CREATE_EXTERNAL_VIEW.md)
+ [CREATE FUNCTION](r_CREATE_FUNCTION.md)
+ [CREATE GROUP](r_CREATE_GROUP.md)
+ [CREATE IDENTITY PROVIDER](r_CREATE_IDENTITY_PROVIDER.md)
+ [CREATE LIBRARY](r_CREATE_LIBRARY.md)
+ [CREATE MASKING POLICY](r_CREATE_MASKING_POLICY.md)
+ [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)
+ [CREATE MODEL](r_CREATE_MODEL.md)
+ [CREATE PROCEDURE](r_CREATE_PROCEDURE.md)
+ [CREATE RLS POLICY](r_CREATE_RLS_POLICY.md)
+ [CREATE ROLE](r_CREATE_ROLE.md)
+ [CREATE SCHEMA](r_CREATE_SCHEMA.md)
+ [CREATE TABLE](r_CREATE_TABLE_NEW.md)
+ [CREATE TABLE AS](r_CREATE_TABLE_AS.md)
+ [建立 範本](r_CREATE_TEMPLATE.md)
+ [CREATE USER](r_CREATE_USER.md)
+ [CREATE VIEW](r_CREATE_VIEW.md)
+ [DEALLOCATE](r_DEALLOCATE.md)
+ [DECLARE](declare.md)
+ [DELETE](r_DELETE.md)
+ [DESC DATASHARE](r_DESC_DATASHARE.md)
+ [DESC IDENTITY PROVIDER](r_DESC_IDENTITY_PROVIDER.md)
+ [DETACH MASKING POLICY](r_DETACH_MASKING_POLICY.md)
+ [DETACH RLS POLICY](r_DETACH_RLS_POLICY.md)
+ [DROP DATABASE](r_DROP_DATABASE.md)
+ [DROP DATASHARE](r_DROP_DATASHARE.md)
+ [DROP EXTERNAL VIEW](r_DROP_EXTERNAL_VIEW.md)
+ [DROP FUNCTION](r_DROP_FUNCTION.md)
+ [DROP GROUP](r_DROP_GROUP.md)
+ [DROP IDENTITY PROVIDER](r_DROP_IDENTITY_PROVIDER.md)
+ [DROP LIBRARY](r_DROP_LIBRARY.md)
+ [DROP MASKING POLICY](r_DROP_MASKING_POLICY.md)
+ [DROP MODEL](r_DROP_MODEL.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)
+ [DROP PROCEDURE](r_DROP_PROCEDURE.md)
+ [DROP RLS POLICY](r_DROP_RLS_POLICY.md)
+ [DROP ROLE](r_DROP_ROLE.md)
+ [DROP SCHEMA](r_DROP_SCHEMA.md)
+ [DROP TABLE](r_DROP_TABLE.md)
+ [DROP 範本](r_DROP_TEMPLATE.md)
+ [DROP USER](r_DROP_USER.md)
+ [DROP VIEW](r_DROP_VIEW.md)
+ [結束](r_END.md)
+ [EXECUTE](r_EXECUTE.md)
+ [EXPLAIN](r_EXPLAIN.md)
+ [FETCH](fetch.md)
+ [GRANT](r_GRANT.md)
+ [INSERT](r_INSERT_30.md)
+ [INSERT (外部資料表)](r_INSERT_external_table.md)
+ [LOCK](r_LOCK.md)
+ [MERGE](r_MERGE.md)
+ [PREPARE](r_PREPARE.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [RESET](r_RESET.md)
+ [REVOKE](r_REVOKE.md)
+ [ROLLBACK](r_ROLLBACK.md)
+ [SELECT](r_SELECT_synopsis.md)
+ [SELECT INTO](r_SELECT_INTO.md)
+ [SET](r_SET.md)
+ [SET SESSION AUTHORIZATION](r_SET_SESSION_AUTHORIZATION.md)
+ [SET SESSION CHARACTERISTICS](r_SET_SESSION_CHARACTERISTICS.md)
+ [SHOW](r_SHOW.md)
+ [顯示資料欄授予](r_SHOW_COLUMN_GRANTS.md)
+ [SHOW COLUMNS](r_SHOW_COLUMNS.md)
+ [顯示限制](r_SHOW_CONSTRAINTS.md)
+ [SHOW EXTERNAL TABLE](r_SHOW_EXTERNAL_TABLE.md)
+ [SHOW DATABASES](r_SHOW_DATABASES.md)
+ [顯示功能](r_SHOW_FUNCTIONS.md)
+ [SHOW GRANTS](r_SHOW_GRANTS.md)
+ [SHOW MODEL](r_SHOW_MODEL.md)
+ [SHOW DATASHARES](r_SHOW_DATASHARES.md)
+ [顯示參數](r_SHOW_PARAMETERS.md)
+ [顯示政策](r_SHOW_POLICIES.md)
+ [SHOW PROCEDURE](r_SHOW_PROCEDURE.md)
+ [顯示程序](r_SHOW_PROCEDURES.md)
+ [SHOW SCHEMAS](r_SHOW_SCHEMAS.md)
+ [SHOW TABLE](r_SHOW_TABLE.md)
+ [SHOW TABLES](r_SHOW_TABLES.md)
+ [顯示範本](r_SHOW_TEMPLATE.md)
+ [顯示範本](r_SHOW_TEMPLATES.md)
+ [SHOW VIEW](r_SHOW_VIEW.md)
+ [START TRANSACTION](r_START_TRANSACTION.md)
+ [TRUNCATE](r_TRUNCATE.md)
+ [UNLOAD](r_UNLOAD.md)
+ [UPDATE](r_UPDATE.md)
+ [USE](r_USE_command.md)
+ [VACUUM](r_VACUUM_command.md)

# ABORT
<a name="r_ABORT"></a>

停止目前執行的交易，並捨棄該交易所做的所有更新。ABORT 不影響已完成的交易。

此命令會執行與 ROLLBACK 命令相同的功能。如需相關資訊，請參閱[ROLLBACK](r_ROLLBACK.md)。

## 語法
<a name="r_ABORT-synopsis"></a>

```
ABORT [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_ABORT-parameters"></a>

WORK  
選用的關鍵字。

TRANSACTION  
選用的關鍵字；WORK 和 TRANSACTION 為同義詞。

## 範例
<a name="r_ABORT-example"></a>

下列範例會建立資料表，然後開始交易，將資料插入資料表中。接著 ABORT 命令就會轉返資料插入操作，而使資料表變成空白。

以下命令會建立名為 MOVIE\$1GROSS 的範例資料表：

```
create table movie_gross( name varchar(30), gross bigint );
```

下一個命令集會開始交易，將兩個資料列插入資料表中：

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

接著，以下命令會從資料表中選取資料，表示該資料已成功插入：

```
select * from movie_gross;
```

命令輸出會顯示這兩個資料列都已成功插入：

```
         name           |  gross
------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

現在這個命令會將資料變更轉返為交易開始時的狀態：

```
abort;
```

從資料表選取資料現在會顯示空白資料表：

```
select * from movie_gross;

 name | gross
------+-------
(0 rows)
```

# ALTER DATABASE
<a name="r_ALTER_DATABASE"></a>

變更資料庫的屬性。

## 所需權限
<a name="r_ALTER_DATABASE-privileges"></a>

若要使用 ALTER DATABASE，需要下列其中一項權限。
+ 超級使用者
+ 具有 ALTER DATABASE 權限的使用者
+ 資料庫擁有者

## 語法
<a name="r_ALTER_DATABASE-synopsis"></a>

```
ALTER DATABASE database_name
{ 
  RENAME TO new_name
  | OWNER TO new_owner
  | [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]
    [ ISOLATION LEVEL { SNAPSHOT | SERIALIZABLE } ]
| INTEGRATION
 { 
  REFRESH { { ALL | INERROR } TABLES [ IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] }
   | SET 
     [ QUERY_ALL_STATES [=] { TRUE | FALSE } ] 
     [ ACCEPTINVCHARS [=] { TRUE | FALSE } ] 
     [ REFRESH_INTERVAL <interval> ]
     [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ]
     [ HISTORY_MODE [=] {TRUE | FALSE} [ FOR { {ALL} TABLES [IN SCHEMA schema [, ...] ] | TABLE schema.table [, ...] } ] ]
 }
}
```

## Parameters
<a name="r_ALTER_DATABASE-parameters"></a>

 *database\$1name*   
要修改的資料庫名稱。通常您會修改目前未連接的資料庫；無論何種情況下，變更都只會在後續工作階段中生效。您可以變更目前資料庫的擁有者，但無法將它重新命名：  

```
alter database tickit rename to newtickit;
ERROR:  current database may not be renamed
```

RENAME TO   
重新命名指定的資料庫。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。您無法重新命名 dev、padb\$1harvest、template0 或 template1 或 sys:internal 資料庫，也無法重新命名目前的資料庫。只有資料庫擁有者或 [superuser](r_superusers.md#def_superusers) 能夠重新命名資料庫；非超級使用者的擁有者必須同時具備 CREATEDB 權限。

 *new\$1name*   
新的資料庫名稱。

OWNER TO   
變更所指定資料庫的擁有者。您可以變更目前資料庫或其他資料庫的擁有者。但只有超級使用者可以變更擁有者。

 *new\$1owner*   
新的資料庫擁有者。新的擁有者必須是具備寫入權限的現有資料庫使用者。如需使用者權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
允許使用者同時開啟的資料庫連線數目上限。超級使用者不受此限制規範。使用 UNLIMITED 關鍵字可允許同時連線的最大數目。另外也可能限制每位使用者的連線數目。如需詳細資訊，請參閱[CREATE USER](r_CREATE_USER.md)。預設值為 UNLIMITED。若要檢視目前連線數目，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統畫面。  
如果同時套用使用者和資料庫連線數目限制，則必須在使用者嘗試連線時，在不超過這兩項限制的情況下提供一個未使用的連線位置。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定字串搜尋或比較是否區分大小寫的子句。  
您可以變更目前資料庫的區分大小寫設定，即使資料庫是空的。  
您必須擁有目前資料庫的 ALTER 許可，才能變更區分大小寫的設定。具有 CREATE DATABASE 許可的超級使用者或資料庫擁有者也可以變更資料庫的區分大小寫設定。  
CASE\$1SENSITIVE 和 CS 可互換，並產生相同的結果。同樣地，CASE\$1INSENSITIVE 和 CI 可互換，並產生相同的結果。

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
指定對資料庫執行查詢時所用隔離層級的子句。如需隔離層級的詳細資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。  
+ SNAPSHOT 隔離 — 提供隔離層級，防止更新和刪除衝突。
+ SERIALIZABLE 隔離 — 為並行交易提供完整的序列化。
修改資料庫的隔離層級時，請考慮下列項目：  
+ 您必須擁有目前資料庫的超級使用者或 CREATE DATABASE 權限，才能變更資料庫隔離層級。
+ 您無法變更 `dev` 資料庫的隔離層級。
+ 您無法變更交易區塊中的隔離等級。
+ 如果其他使用者連線到資料庫，修改隔離層級命令就會失敗。
+ 修改隔離層級命令可以修改目前工作階段的隔離層級設定。

INTEGRATION  
修改零 ETL 整合資料庫。

REFRESH \$1\$1 ALL \$1 INERROR \$1 TABLES [IN SCHEMA *schema* [, ...]] \$1 TABLE *schema.table* [, ...]\$1  
指定 Amazon Redshift 是否會重新整理指定結構描述或資料表中的所有資料表或發生錯誤之資料表的子句。重新整理會觸發指定結構描述或資料表中的資料表，從來源資料庫完全複製。  
如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[零 ETL 整合](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.html)。如需整合狀態的詳細資訊，請參閱 [SVV\$1INTEGRATION\$1TABLE\$1STATE](r_SVV_INTEGRATION_TABLE_STATE.md) 和 [SVV\$1INTEGRATION](r_SVV_INTEGRATION.md)。

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
QUERY\$1ALL\$1STATES 子句會設定零 ETL 整合資料表是否在所有狀態 (`Synced`、`Failed`、`ResyncRequired` 和 `ResyncInitiated`) 下均可供查詢。根據預設，零 ETL 整合資料表只有在 `Synced` 狀態下可供查詢。

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
ACCEPTINVCHARS 子句會設定零 ETL 整合資料表是否在偵測到 VARCHAR 資料類型的無效字元時，仍繼續擷取。遇到無效字元時，無效字元會取代為預設的 `?` 字元。

REFRESH\$1INTERVAL <interval>  
REFRESH\$1INTERVAL 子句會設定將資料從零 ETL 來源重新整理至目標資料庫的大約時間間隔 (以秒為單位)。針對來源類型為 Aurora MySQL、Aurora PostgreSQL 或 RDS for MySQL 的零 ETL 整合，`interval` 可以設定為 0-432,000 秒 (5 天)。針對 Amazon DynamoDB 零 ETL 整合，`interval` 可以設定為 900-432,000 秒 (15 分鐘至 5 天)。  
如需使用零 ETL 整合建立資料庫的詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[在 Amazon Redshift 中建立目的地資料庫](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)。

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
TRUNCATECOLUMNS 子句會設定，當 VARCHAR 欄或 SUPER 欄屬性的值超出限制時，零 ETL 整合資料表是否繼續擷取。當 `TRUE` 時，值會截斷至符合欄長度，而溢出 JSON 屬性的值則會截斷至符合 SUPER 欄長度。

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1 [ FOR \$1 \$1ALL\$1 TABLES [IN SCHEMA schema [, ...]] \$1 TABLE schema.table [, ...]\$1 ]  
此子句指定 Amazon Redshift 要針對所有資料表，還是參與零 ETL 整合的結構描述中的資料表設定歷史記錄模式。此選項僅適用於針對零 ETL 整合建立的資料庫。  
HISTORY\$1MODE 子句可以設定為 `TRUE` 或 `FALSE`。預設值為 `FALSE`。只有處於 `Synced` 狀態的資料表才能將歷史記錄模式切換為開啟和關閉。如需有關 HISTORY\$1MODE 的資訊，請參閱《Amazon Redshift 管理指南》**中的[歷史記錄模式](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html)。

## 使用須知
<a name="r_ALTER_DATABASE-usage-notes"></a>

ALTER DATABASE 命令會套用至後續工作階段，而非目前工作階段。您必須重新連線到修改過的資料庫，才會看見變更的效果。

## 範例
<a name="r_ALTER_DATABASE-examples"></a>

以下範例會將名為 TICKIT\$1SANDBOX 的資料庫重新命名為 TICKIT\$1TEST：

```
alter database tickit_sandbox rename to tickit_test;
```

下列範例會將 TICKIT 資料庫 (目前資料庫) 的擁有者變更為 DWUSER：

```
alter database tickit owner to dwuser;
```

下列範例會變更 sampledb 資料庫的資料庫大小寫設定：

```
ALTER DATABASE sampledb COLLATE CASE_INSENSITIVE;
```

下列範例會修改名稱為 **sampledb** 且具有 SNAPSHOT 隔離層級的資料庫。

```
ALTER DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

下列範例會重新整理零 ETL 整合之 **sample\$1integration\$1db** 中的資料表 **schema1.sample\$1table1** 和 **schema2.sample\$1table2** 資料庫。

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH TABLE schema1.sample_table1, schema2.sample_table2;
```

下列範例會重新整理零 ETL 整合中所有已同步處理和失敗的資料表。

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH ALL tables;
```

下列範例會將零 ETL 整合的重新整理間隔設定為 600 秒。

```
ALTER DATABASE sample_integration_db INTEGRATION SET REFRESH_INTERVAL 600;
```

下列範例會重新整理結構描述 **sample\$1schema** 中處於 `ErrorState` 的所有資料表。

```
ALTER DATABASE sample_integration_db INTEGRATION REFRESH INERROR TABLES in SCHEMA sample_schema;
```

下列範例會開啟資料表 `myschema.table1` 的歷史記錄模式。

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true FOR TABLE myschema.table1
```

下列範例會開啟 `myschema` 中所有資料表的歷史記錄模式。

```
ALTER DATABASE sample_integration_db INTEGRATION SET HISTORY_MODE = true for ALL TABLES IN SCHEMA myschema
```

# ALTER DATASHARE
<a name="r_ALTER_DATASHARE"></a>

變更資料共用的定義。您可以使用 ALTER DATASHARE 來新增物件或移除物件。您只能變更目前資料庫中的資料共用。在資料共用中新增或移除相關聯資料庫中的物件。在要新增或移除的資料共用物件上有所需許可的資料共用擁有者可以修改資料共用。

## 所需權限
<a name="r_ALTER_DATASHARE-privileges"></a>

以下是 ALTER DATASHARE 所需的權限：
+ 超級使用者。
+ 具有 ALTER DATASHARE 權限的使用者。
+ 在資料共用上具有 ALTER 或 ALL 權限的使用者。
+ 若要將特定物件新增至資料共用，使用者必須要有物件的權限。在這種情況下，使用者必須是物件的擁有者，或具有物件的 SELECT、USAGE 或 ALL 權限。

## 語法
<a name="r_ALTER_DATASHARE-synopsis"></a>

下列語法說明如何在資料共用中新增或移除物件。

```
ALTER DATASHARE datashare_name { ADD | REMOVE } {
TABLE schema.table [, ...]
| SCHEMA schema [, ...]
| FUNCTION schema.sql_udf (argtype,...) [, ...]
| ALL TABLES IN SCHEMA schema [, ...]
| ALL FUNCTIONS IN SCHEMA schema [, ...] }
```

下列語法說明如何設定資料共用的屬性。

```
ALTER DATASHARE datashare_name {
[ SET PUBLICACCESSIBLE [=] TRUE | FALSE ]
[ SET INCLUDENEW [=] TRUE | FALSE FOR SCHEMA schema ] }
```

## Parameters
<a name="r_ALTER_DATASHARE-parameters"></a>

*datashare\$1name*  
要修改的資料共用名稱。

ADD \$1 REMOVE  
指定是否要在資料共用中新增或移除物件的子句。

TABLE *schema*.*table* [, ...]  
指定結構描述中要新增至資料共用的資料表或檢視名稱。

SCHEMA *schema* [, ...]   
要新增至資料共用的結構描述名稱。

FUNCTION *schema*.*sql\$1udf* (argtype,...) [, ...]  
要新增至資料共用且具有引數類型的使用者定義 SQL 函數名稱。

ALL TABLES IN SCHEMA *schema* [, ...]   
指定是否將指定結構描述中的所有資料表和檢視新增至資料共用的子句。

ALL FUNCTIONS IN SCHEMA *schema* [, ...] \$1  
指定將指定結構描述中所有函數新增至資料共用的子句。

[ SET PUBLICACCESSIBLE [=] TRUE \$1 FALSE ]  
該子句會指定資料共用是否可以共用至可公開存取的叢集。

[ SET INCLUDENEW [=] TRUE \$1 FALSE FOR SCHEMA *schema* ]  
該子句會指定是否要將指定結構描述中建立的任何未來資料表、檢視或 SQL 使用者定義函數 (UDF) 新增至資料共用。目前指定結構描述中的資料表、檢視或 SQL UDF 不會新增至資料共用。只有超級用戶可以為每個「資料共用-結構描述」配對修改此屬性。INCLUDENEW 子句會預設為 false。

## ALTER DATASHARE 使用須知
<a name="r_ALTER_DATASHARE_usage"></a>
+ 下列使用者可以修改資料共用：
  + 超級使用者
  + 資料共用的擁有者
  + 在資料共用上具有 ALTER 或 ALL 權限的使用者。
+ 若要將特定物件新增至資料共用，使用者必須要有物件的正確權限。使用者必須是物件的擁有者，或具有物件的 SELECT、USAGE 或 ALL 權限。
+ 您可以共用結構描述、資料表、一般檢視、近期繫結檢視、具體化視觀表，以及 SQL 使用者定義函數 (UDF)。在結構描述中新增物件之前，請先將結構描述新增至資料共用。

  當您新增結構描述時，Amazon Redshift 不會在其下方新增所有物件。您必須明確地新增這些物件。
+ 我們建議您在開啟公開存取設定的情況下建立 AWS Data Exchange 資料共用。
+ 一般而言，建議您不要修改 AWS Data Exchange 資料共用，以使用 ALTER DATASHARE 陳述式關閉公有可存取性。如果您這樣做，可存取資料共用的 AWS 帳戶 會在其叢集可公開存取時失去存取權。執行此類修改可能會違反 AWS Data Exchange中的資料產品條款。有關此建議的例外情況，請參閱以下內容。

  下列範例顯示在關閉 設定的情況下建立 AWS Data Exchange 資料共用時發生錯誤。

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ERROR:  Alter of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value 'c670ba4db22f4b'
  ```

  若要允許變更 AWS Data Exchange 資料共用以關閉可公開存取的設定，請設定下列變數，然後再次執行 ALTER DATASHARE 陳述式。

  ```
  SET datashare_break_glass_session_var to 'c670ba4db22f4b';
  ```

  ```
  ALTER DATASHARE salesshare SET PUBLICACCESSIBLE FALSE;
  ```

  在這種情況下，Amazon Redshift 會產生隨機的一次性值來設定工作階段變數，以允許對 AWS Data Exchange 資料共用執行 ALTER DATASHARE SET PUBLICACCESSIBLE FALSE。

## 範例
<a name="r_ALTER_DATASHARE_examples"></a>

下列範例會將 `public` 結構描述新增至資料共用 `salesshare`。

```
ALTER DATASHARE salesshare ADD SCHEMA public;
```

下列範例會將 `public.tickit_sales_redshift` 資料表新增至 `salesshare` 資料共用。

```
ALTER DATASHARE salesshare ADD TABLE public.tickit_sales_redshift;
```

下列範例會將所有資料表新增至 `salesshare` 資料共用。

```
ALTER DATASHARE salesshare ADD ALL TABLES IN SCHEMA PUBLIC;
```

下列範例會將 `public.tickit_sales_redshift` 資料表從 `salesshare` 資料共用中移除。

```
ALTER DATASHARE salesshare REMOVE TABLE public.tickit_sales_redshift;
```

# ALTER DEFAULT PRIVILEGES
<a name="r_ALTER_DEFAULT_PRIVILEGES"></a>

定義指定的使用者日後所建立的物件要套用的存取許可預設設定。根據預設，使用者只能變更自己擁有的預設存取許可。只有超級使用者能夠指定其他使用者的預設許可。

您可將預設權限套用至角色、使用者或使用者群組。您可為目前資料庫中建立的所有物件，或只為指定的結構描述中建立的物件設定全域的預設許可。

預設許可只會套用至新物件。執行 ALTER DEFAULT PRIVILEGES 並不會變更現有物件的許可。若要授予資料庫或結構描述內任何使用者建立的所有目前和未來物件的許可，請參閱[限定範圍許可](https://docs.aws.amazon.com/redshift/latest/dg/t_scoped-permissions.html)。

若要檢視有關資料庫使用者預設權限的資訊，請查詢 [PG\$1DEFAULT\$1ACL](r_PG_DEFAULT_ACL.md) 系統目錄資料表。

如需權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

## 所需權限
<a name="r_ALTER_DEFAULT_PRIVILEGES-privileges"></a>

以下是 ALTER DEFAULT PRIVILEGES 所需的權限：
+ 超級使用者
+ 具有 ALTER DEFAULT PRIVILEGES 權限的使用者
+ 變更自身預設存取權限的使用者
+ 為其有權存取的結構描述設定權限的使用者

## 語法
<a name="r_ALTER_DEFAULT_PRIVILEGES-synopsis"></a>

```
ALTER DEFAULT PRIVILEGES
    [ FOR USER target_user [, ...] ]
    [ IN SCHEMA schema_name [, ...] ]
    grant_or_revoke_clause

where grant_or_revoke_clause is one of:

GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	TO { user_name [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	TO { user_name [ WITH GRANT OPTION ] |  ROLE role_name | GROUP group_name | PUBLIC } [, ...]

REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE  { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
	ON TABLES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON FUNCTIONS
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM user_name [, ...] [ RESTRICT ]

REVOKE { EXECUTE | ALL [ PRIVILEGES ] }
	ON PROCEDURES
	FROM { ROLE role_name | GROUP group_name | PUBLIC } [, ...] [ RESTRICT ]
```

## Parameters
<a name="r_ALTER_DEFAULT_PRIVILEGES-parameters"></a>

FOR USER *target\$1user*  <a name="default-for-user"></a>
選用。為其定義預設權限的使用者名稱。只有超級使用者能夠指定其他使用者的預設權限。預設值是目前使用者。

IN SCHEMA *schema\$1name*   <a name="default-in-schema"></a>
選用。如果出現 IN SCHEMA 子句，指定的預設權限就會套用至所指定 *schema\$1name* 中建立的新物件。在此情況下，做為 ALTER DEFAULT PRIVILEGES 目標的使用者或使用者群組必須具備所指定結構描述的 CREATE 權限。結構描述專屬的預設權限會新增至現有的全域預設權限。根據預設，預設權限會全域套用至整個資料庫。

GRANT   <a name="default-grant"></a>
對於指定使用者所建立的所有新資料表和檢視、函數或預存程序，要授予指定使用者或群組的權限集。您可以使用 GRANT 子句設定與使用 [GRANT](r_GRANT.md) 命令時相同的權限和選項。

WITH GRANT OPTION   <a name="default-grant-option"></a>
指出接收權限的使用者可以接著將相同的權限授予他人的子句。您無法將 WITH GRANT OPTION 授予群組或 PUBLIC。

TO *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*   <a name="default-to"></a>
使用者、角色或使用者群組的名稱，將對其套用指定的預設權限。

REVOKE   <a name="default-revoke"></a>
對於指定使用者所建立的所有新資料表、函數或預存程序，要撤銷指定使用者或群組的權限集。您可以使用 REVOKE 子句設定與使用 [REVOKE](r_REVOKE.md) 命令時相同的權限和選項。

GRANT OPTION FOR  <a name="default-revoke-option"></a>
 這個子句只會撤銷對其他使用者授予指定權限的選項，而不會撤銷權限本身。您無法撤銷群組或 PUBLIC 的 GRANT OPTION。

FROM *user\$1name* \$1 ROLE *role\$1name* \$1 GROUP *group\$1name*  <a name="default-from"></a>
使用者、角色或使用者群組的名稱，預設將撤銷其指定權限。

RESTRICT   <a name="default-restrict"></a>
RESTRICT 選項只會撤銷使用者直接授予的權限。這是預設值。

## 範例
<a name="r_ALTER_DEFAULT_PRIVILEGES-examples"></a>

假設您想要允許使用者群組 `report_readers` 中的任何使用者檢視使用者 `report_admin` 建立的所有資料表和檢視。在此情況下，請以超級使用者身分執行下列命令。

```
alter default privileges for user report_admin grant select on tables to group report_readers; 
```

在下列範例中，第一個命令會授予您建立的所有新資料表的 SELECT 權限。每當您建立新的檢視時，都必須明確授予檢視權限，或再次重新執行 `alter default privileges` 命令。

```
alter default privileges grant select on tables to public; 
```

下列範例會對 `sales_admin` 使用者群組授予您在 `sales` 結構描述中建立的所有新資料表和檢視的 INSERT 權限。

```
alter default privileges in schema sales grant insert on tables to group sales_admin; 
```

以下範例會反轉前述範例中的 ALTER DEFAULT PRIVILEGES 命令。

```
alter default privileges in schema sales revoke insert on tables from group sales_admin;
```

根據預設，PUBLIC 使用者群組具有所有新的使用者定義功能的執行許可。若要撤銷新功能的 `public` 執行許可，然後僅將執行許可授予 `dev_test` 使用者群組，請執行下列命令。

```
alter default privileges revoke execute on functions from public;
alter default privileges grant execute on functions to group dev_test;
```

# ALTER EXTERNAL SCHEMA
<a name="r_ALTER_EXTERNAL_SCHEMA"></a>

更改目前資料庫中的現有外部結構描述。只有結構描述擁有者、超級使用者或對結構描述具有 ALTER 權限的使用者，才能進行更改。只能更改從 DATA CATALOG、KAFKA 或 MSK 建立的外部結構描述。

此結構描述的擁有者是 CREATE EXTERNAL SCHEMA 命令的發行者。若要轉移外部結構描述的所有權，請使用 ALTER SCHEMA 來變更擁有者。若要將結構描述的存取權授予其他使用者或使用者群組，請使用 GRANT 命令。

您無法使用 GRANT 或 REVOKE 命令處理外部資料表的許可。這時請改為在外部結構描述授予和撤銷許可。

如需詳細資訊，請參閱下列內容：
+ [ALTER SCHEMA](r_ALTER_SCHEMA.md)
+ [GRANT](r_GRANT.md)
+ [REVOKE](r_REVOKE.md)
+ [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)
+ [針對現有外部結構描述啟用 mTLS 身分驗證](materialized-view-streaming-ingestion-mtls.md#materialized-view-streaming-ingestion-mtls-alter)

若要檢視外部結構描述的詳細資訊，請查詢 SVV\$1EXTERNAL\$1SCHEMAS 系統檢視。如需詳細資訊，請參閱[SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md)。

## 語法
<a name="r_ALTER_EXTERNAL_SCHEMA-synopsis"></a>

```
ALTER EXTERNAL SCHEMA schema_name
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'asm-secret-arn' ]
[ URI 'Kafka bootstrap URL' ]
```

如果您有用於串流擷取的現有外部結構描述，而且想要實作雙向 TLS 進行身分驗證，您可以執行下列命令，以指定 mTLS 身分驗證和 ACM 中的 ACM 憑證 ARN。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
AUTHENTICATION_ARN 'arn:aws:acm:us-east-1:444455556666:certificate/certificate_ID';
```

或者，您可以修改 mTLS 身分驗證，並參考 Secrets Manager 中的機密 ARN。

```
ALTER EXTERNAL SCHEMA schema_name 
AUTHENTICATION mtls
SECRET_ARN 'arn:aws:secretsmanager:us-east-1:012345678910:secret:myMTLSSecret';
```

下列範例示範如何修改 ALTER EXTERNAL SCHEMA 的 URI：

```
ALTER EXTERNAL SCHEMA schema_name  
URI 'lkc-ghidef-67890.centralus.azure.glb.confluent.cloud:9092';
```

下列範例示範如何修改 ALTER EXTERNAL SCHEMA 的 IAM 角色：

```
ALTER EXTERNAL SCHEMA schema_name  
IAM_ROLE 'arn:aws:iam::012345678901:role/testrole';
```

## Parameters
<a name="r_ALTER_EXTERNAL_SCHEMA-parameters"></a>

 IAM\$1ROLE【 預設 \$1 'SESSION' \$1 'arn：aws：iam：：<AWS account-id>：role/<role-name>' 】   
使用 `default` 關鍵字讓 Amazon Redshift 使用預設的 IAM 角色。  
如果您使用聯合身分連線到 Amazon Redshift 叢集，並從使用此命令建立的外部結構描述存取資料表，請使用 `'SESSION'`。  
如需詳細資訊，請參閱 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

AUTHENTICATION  
為串流擷取定義的驗證類型。具有身分驗證類型的串流擷取能夠與 Apache Kafka、Confluent Cloud 和 Amazon Managed Streaming for Apache Kafka 搭配運作。如需詳細資訊，請參閱 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

AUTHENTICATION\$1ARN  
Amazon Redshift 使用 Apache Kafka、Confluent Cloud 或 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 進行 mtls 身分驗證的 AWS Certificate Manager 憑證 ARN。當您選擇發出憑證時，ACM 主控台中就會提供 ARN。

SECRET\$1ARN  
使用 建立之支援秘密的 Amazon Resource Name (ARN) AWS Secrets Manager。如需如何建立和擷取機密的 ARN 的相關資訊，請參閱《AWS Secrets Manager 使用者指南》**中的[使用 AWS Secrets Manager管理機密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)，以及[在 Amazon Redshift 中擷取機密的 Amazon Resource Name (ARN)](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html)。

URI  
Apache Kafka、Confluent Cloud 或 Amazon Managed Streaming for Apache Kafka (Amazon MSK) 叢集的啟動程序 URL。端點必須可從 Amazon Redshift 叢集連接 (可路由)。如需詳細資訊，請參閱 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

# ALTER EXTERNAL VIEW
<a name="r_ALTER_EXTERNAL_VIEW"></a>

使用 ALTER EXTERNAL VIEW 命令更新外部檢視。視您使用的參數而定，也可以參考此檢視的其他 SQL 引擎 (例如 Amazon Athena 和 Amazon EMR Spark) 可能會受到影響。如需有關 Data Catalog 檢視的詳細資訊，請參閱 [AWS Glue Data Catalog 檢視](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。

## 語法
<a name="r_ALTER_EXTERNAL_VIEW-synopsis"></a>

```
ALTER EXTERNAL VIEW schema_name.view_name
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
[FORCE] { AS (query_definition) | REMOVE DEFINITION }
```

## Parameters
<a name="r_ALTER_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
連接到 AWS Glue 資料庫的結構描述，後面接著檢視的名稱。

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
變更視觀表時要使用的結構描述標記法。您可以指定 使用您建立的 AWS Glue Data Catalog Glue 資料庫，或您建立的外部結構描述。如需詳細資訊，請參閱[CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 和 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

FORCE  
即使資料表中參考的物件與其他 SQL 引擎不一致， 是否 AWS Lake Formation 應該更新檢視的定義。如果 Lake Formation 更新檢視，則對於其他 SQL 引擎來說，該檢視會被視為過時，直到這些引擎也更新為止。

 *AS query\$1definition*   
Amazon Redshift 執行以變更檢視的 SQL 查詢的定義。

REMOVE DEFINITION  
是否捨棄並重新建立檢視。必須捨棄檢視並重新建立，才能將其標記為 `PROTECTED`。

## 範例
<a name="r_ALTER_EXTERNAL_VIEW-examples"></a>

下列範例會變更名為 sample\$1schema.glue\$1data\$1catalog\$1view 的 Data Catalog 視觀表。

```
ALTER EXTERNAL VIEW sample_schema.glue_data_catalog_view
FORCE
REMOVE DEFINITION
```

# ALTER FUNCTION
<a name="r_ALTER_FUNCTION"></a>

重新命名函式或變更擁有者。函式名稱和資料類型都是必要的。只有擁有者或超級使用者才能重新命名函式。只有超級使用者才能變更函式的擁有者。

## 語法
<a name="r_ALTER_FUNCTION-synopsis"></a>

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     RENAME TO new_name
```

```
ALTER FUNCTION function_name ( { [ py_arg_name py_arg_data_type | sql_arg_data_type } [ , ... ] ] )
     OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## Parameters
<a name="r_ALTER_FUNCTION-parameters"></a>

 *function\$1name*   
要更改的函式名稱。在目前的搜尋路徑中指定函式的名稱，或使用格式 `schema_name.function_name` 來使用專屬結構描述。

*py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
選用。Python 使用者定義函式的輸入引數名稱和資料類型清單，或 SQL 使用者定義函式的輸入引數資料類型清單。

 *new\$1name*   
使用者定義函式的新名稱。

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
使用者定義函式的新擁有者。

## 範例
<a name="r_ALTER_FUNCTION-examples"></a>

下列範例會將函式的名稱從 `first_quarter_revenue` 變更為 `quarterly_revenue`。

```
ALTER FUNCTION first_quarter_revenue(bigint, numeric, int) 
         RENAME TO quarterly_revenue;
```

下列範例會將 `quarterly_revenue` 函式的擁有者變更為 `etl_user`。

```
ALTER FUNCTION quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER GROUP
<a name="r_ALTER_GROUP"></a>

變更使用者群組。使用此命令可將使用者新增至群組、從群組中刪除使用者，或重新命名群組。

## 語法
<a name="r_ALTER_GROUP-synopsis"></a>

```
ALTER GROUP group_name
{
ADD USER username [, ... ] |
DROP USER username [, ... ] |
RENAME TO new_name
}
```

## Parameters
<a name="r_ALTER_GROUP-parameters"></a>

 *group\$1name*   
要修改的使用者群組名稱。

ADD   
將使用者新增至使用者群組。

DROP   
從使用者群組中移除使用者。

 *username*   
要新增至群組或從群組中刪除的使用者名稱。

RENAME TO   
重新命名使用者群組。開頭為兩個底線的群組名稱保留供 Amazon Redshift 內部使用。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

 *new\$1name*   
使用者群組的新名稱。

## 範例
<a name="r_ALTER_GROUP-examples"></a>

以下範例會將名為 DWUSER 的使用者新增至 ADMIN\$1GROUP 群組。

```
ALTER GROUP admin_group
ADD USER dwuser;
```

以下範例會將群組 ADMIN\$1GROUP 重新命名為 ADMINISTRATORS。

```
ALTER GROUP admin_group
RENAME TO administrators;
```

以下範例會將兩個使用者新增至 ADMIN\$1GROUP 群組。

```
ALTER GROUP admin_group
ADD USER u1, u2;
```

以下範例會將兩個使用者從 ADMIN\$1GROUP 群組中捨棄。

```
ALTER GROUP admin_group
DROP USER u1, u2;
```

# ALTER IDENTITY PROVIDER
<a name="r_ALTER_IDENTITY_PROVIDER"></a>

修改身分提供者以指派新參數和值。當您執行此命令時，所有先前設定的參數值都會先刪除，然後再指派新值。只有超級使用者可以修改身分提供者。

## 語法
<a name="r_ALTER_IDENTITY_PROVIDER-synopsis"></a>

```
ALTER IDENTITY PROVIDER identity_provider_name
[PARAMETERS parameter_string]
[NAMESPACE namespace]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
[DISABLE | ENABLE]
```

## Parameters
<a name="r_ALTER_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
新身分提供者的名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

 *parameter\$1string*   
包含正確格式化 JSON 物件的字串，其中包含特定身分提供者所需的參數和值。

 *命名空間*   
組織命名空間。

 *iam\$1role*   
提供 IAM Identity Center 連線許可的 IAM 角色。此參數僅在身分提供者類型為 AWSIDC 時適用。

 *auto\$1create\$1roles*   
啟用或停用自動建立角色功能。如果值為 TRUE，Amazon Redshift 會啟用自動建立角色功能。如果值為 FALSE，Amazon Redshift 會停用自動建立角色功能。如果未指定此參數的值，Amazon Redshift 會使用下列邏輯來判斷值：  
+  如有 `AUTO_CREATE_ROLES` 但未指定值，則值會設定為 TRUE。
+  如未提供 `AUTO_CREATE_ROLES` 且身分提供者為 AWSIDC，則值會設定為 FALSE。
+  如未提供 `AUTO_CREATE_ROLES` 且身分提供者為 Azure，則值會設定為 TRUE。
若要包含群組，請指定 `INCLUDE`。預設值為空白，表示 `AUTO_CREATE_ROLES` 開啟時，包含所有群組。  
若要排除群組，請指定 `EXCLUDE`。預設值為空白，表示 `AUTO_CREATE_ROLES` 開啟時，不要排除任何群組。

 *filter\$1pattern*   
有效的 UTF-8 字元表達式，包含要比對群組名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_ALTER_IDENTITY_PROVIDER.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。  
*filter\$1pattern* 支援下列字元：  
+  大寫和小寫英文字母字元 (A-Z 和 a-z) 
+  數字 (0-9) 
+  下列特殊字元：

  ```
  _ % ^ * + ? { } , $
  ```

 *DISABLE 或 ENABLE*   
開啟或關閉身分提供者 預設為 ENABLE。

## 範例
<a name="r_ALTER_IDENTITY_PROVIDER-examples"></a>

下列範例會修改名為 *oauth\$1standard* 的身分提供者。特別是在 Microsoft Azure AD 為身分提供者時適用。

```
ALTER IDENTITY PROVIDER oauth_standard
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

下列範例示範如何設定 identity-provider 命名空間。這會套用至 Microsoft Azure AD (若其遵循如先前範例的陳述式)，或套用至另一個身分提供者。在您將現有 Amazon Redshift 佈建叢集或 Amazon Redshift Serverless 工作群組連線至 IAM Identity Center 的情況下，若您透過受管應用程式設定連線，則也適用此設定。

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
NAMESPACE 'MYCO';
```

下列範例會設定 IAM 角色，並且適用設定 Redshift 與 IAM Identity Center 整合的使用案例。

```
ALTER IDENTITY PROVIDER "my-redshift-idc-application"
IAM_ROLE 'arn:aws:iam::123456789012:role/myadministratorrole';
```

如需設定從 Redshift 到 IAM Identity Center 的連線詳細資訊，請參閱[將 Redshift 與 IAM Identity Center 連線，為使用者提供單一登入體驗](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)。

**停用身分提供者**

下列範例陳述式說明如何停用身分提供者。停用時，身分提供者的聯合身分使用者必須先再次將其啟用，才能登入叢集。

```
ALTER IDENTITY PROVIDER "redshift-idc-app" DISABLE;
```

# ALTER MASKING POLICY
<a name="r_ALTER_MASKING_POLICY"></a>

修改現有的動態資料遮罩政策。如需動態資料遮罩的相關資訊，請參閱 [動態資料遮罩](t_ddm.md)。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以修改遮罩政策。

## 語法
<a name="r_ALTER_MASKING_POLICY-synopsis"></a>

```
ALTER MASKING POLICY
{ policy_name | database_name.policy_name }
USING (masking_expression);
```

## Parameters
<a name="r_ALTER_MASKING_POLICY-parameters"></a>

*policy\$1name*   
 遮罩政策的名稱。這必須是資料庫中已存在的遮罩政策名稱。

database\$1name  
政策建立來源的資料庫名稱。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

*masking\$1expression*  
用來轉換目標資料欄的 SQL 運算式。其可以使用資料操作函數 (例如字符串操作函數) 編寫，或與使用 SQL、Python 或 AWS Lambda編寫的使用者定義函數一起編寫。  
 運算式必須與原始運算式的輸入資料欄和資料類型相符。例如，如果原始遮罩政策的輸入資料欄是 `sample_1 FLOAT` 和 `sample_2 VARCHAR(10)`，您將無法修改遮罩政策以取得第三個資料欄，或讓政策採用 FLOAT 和 BOOLEAN。如果您使用常數做為遮罩運算式，則必須將其明確轉換為符合輸入類型的類型。  
 對於在遮罩運算式中使用的任何使用者定義函數，您都必須擁有 USAGE 權限。

如需在 Amazon Redshift 聯合許可目錄上使用 ALTER MASKING POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

# ALTER MATERIALIZED VIEW
<a name="r_ALTER_MATERIALIZED_VIEW"></a>

變更具體化視觀表的屬性。

## 語法
<a name="r_ALTER_MATERIALIZED_VIEW-synopsis"></a>

```
ALTER MATERIALIZED VIEW mv_name
{
AUTO REFRESH { YES | NO } 
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [FOR DATASHARES]
};
```

## Parameters
<a name="r_ALTER_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
具體化視觀表的名稱。

AUTO REFRESH \$1 YES \$1 NO \$1  
開啟或關閉具體化視觀表自動重新整理的子句。如需具體化視觀表自動重新整理的相關資訊，請參閱 [重新整理具體化視觀表](materialized-view-refresh.md)。

ALTER DISTSTYLE ALL  
將關係的現有分佈樣式變更為 `ALL` 的子句。考慮下列各項：  
+ 無法同時在相同關係上執行 ALTER DISTSTYLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE ALL 會傳回錯誤。
  + 如果 ALTER DISTSTYLE ALL 執行中，則不會在關係上啟動背景清空。
+ 包含交錯排序索引鍵的關係和暫存資料表不支援 ALTER DISTSTYLE ALL 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該關係不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE ALL 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

ALTER DISTSTYLE EVEN  
將關係的現有分佈樣式變更為 `EVEN` 的子句。考慮下列各項：  
+ 無法同時在相同關係上執行 ALTER DISTSYTLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE EVEN 會傳回錯誤。
  + 如果 ALTER DISTSTYLE EVEN 執行中，則不會在關係上啟動背景清空。
+ 包含交錯排序索引鍵的關係和暫存資料表不支援 ALTER DISTSTYLE EVEN 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該關係不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE EVEN 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

ALTER DISTKEY *column\$1name* 或 ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
此子句會變更作為關係的分佈索引鍵使用的欄。考慮下列各項：  
+ VACUUM 和 ALTER DISTKEY 無法在相同關係上並行執行。
  + 如果 VACUUM 已在執行，則 ALTER DISTKEY 會傳回錯誤。
  + 如果 ALTER DISTKEY 執行中，則不會在關係上啟動背景清空。
  + 如果 ALTER DISTKEY 執行中，則前景清空會傳回錯誤。
+ 您一次僅可以在一個關係上執行一個 ALTER DISTKEY 命令。
+ 包含交錯排序索引鍵的關係不支援 ALTER DISTKEY 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該關係不再是自動資料表最佳化的候選項目。
指定 DISTSTYLE KEY 時，資料是依 DISTKEY 資料欄中的值分佈。如需 DISTSTYLE 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

ALTER DISTSTYLE AUTO  
將關係的現有分佈樣式變更為 AUTO 的子句。  
將分佈樣式變更為 AUTO 時，關係的分佈樣式會設定如下：  
+ 將具有 DISTSTYLE ALL 的小型關係轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE EVEN 的小型關係轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE KEY 的小型關係轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE ALL 的大型關係轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE EVEN 的大型關係轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE KEY 的大型關係轉換為 AUTO(KEY) 並保留 DISTKEY。在這種情況下，Amazon Redshift 不會對關係進行任何變更。
如果 Amazon Redshift 判斷新的分佈樣式或索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更關係的分佈樣式或索引鍵。例如，Amazon Redshift 可能會將 DISTSTYLE 為 AUTO(KEY) 的關係轉換為 AUTO(EVEN)，反之亦然。如需修改分佈索引鍵時行為 (包括資料重新分佈和鎖定) 的相關資訊，請前往 [Amazon Redshift Advisor 建議](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation)。  
如需 DISTSTYLE AUTO 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。  
若要檢視關係的分佈樣式，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請前往 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視關係的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請前往 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請前往 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
此子句可變更或新增用於關係的排序索引鍵。暫存資料表不支援 ALTER SORTKEY。  
當您變更排序索引鍵時，新排序索引鍵或原始排序索引鍵中欄的壓縮編碼可能會變更。如果沒有明確定義關係的編碼，則 Amazon Redshift 會自動指定壓縮編碼，如下所示：  
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL 或 DOUBLE PRECISION 資料類型的資料欄會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR 或 VARCHAR 的資料欄會有指派的 LZO 壓縮。
考慮下列各項：  
+ 您最多可為每個關係的排序索引鍵定義 400 個欄。
+ 您可以將交錯排序索引鍵修改為複合排序索引鍵或無排序索引鍵。但是，您無法將複合排序索引鍵修改為交錯排序索引鍵。
+ 如果排序索引鍵先前已定義為 AUTO，則該關係不再是自動資料表最佳化的候選項目。
+ Amazon Redshift 建議對定義為排序索引鍵的資料欄使用 RAW 編碼 (不壓縮)。當您變更資料欄以選擇其做為排序索引鍵時，資料欄的壓縮會變更為 RAW 壓縮 (不壓縮)。這可能會增加關係所需的儲存空間。關係大小的增加幅度取決於特定的關係定義和關係內容。如需壓縮的詳細資訊，請前往 [壓縮編碼](c_Compression_encodings.md)。
當資料載入關係之後，資料就會依據排序索引鍵的排序載入。當您修改排序索引鍵時，Amazon Redshift 會重新排列資料。如需 SORTKEY 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。

ALTER SORTKEY AUTO  
將目標關係的排序索引鍵變更或新增至 AUTO 的子句。暫存資料表不支援 SORTKEY AUTO。  
當您將排序索引鍵修改為 AUTO 時，Amazon Redshift 會保留關係的現有排序索引鍵。  
如果 Amazon Redshift 判斷新的排序索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更關係的排序索引鍵。  
如需 SORTKEY AUTO 的詳細資訊，請前往 [CREATE MATERIALIZED VIEW](materialized-view-create-sql-command.md)。  
若要檢視關係的排序索引鍵，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請前往 [SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視關係的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請前往 [SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請前往 [SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。

ALTER SORTKEY NONE  
移除目標關係的排序索引鍵的子句。  
如果排序索引鍵先前已定義為 AUTO，則該關係不再是自動資料表最佳化的候選項目。

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
開啟或關閉關係的資料列層級安全性的子句。  
開啟關係的資料列層級安全性時，您只能讀取資料列層級安全政策允許您存取的資料列。如果沒有任何政策授予您關係存取權，您就無法看到關聯中的任何資料列。只有超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以設定 ROW LEVEL SECURITY 子句。如需詳細資訊，請參閱[資料列層級安全性](t_rls.md)。  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  一個子句，讓您為關係選擇資料列層級安全政策的結合類型。將多個資料列層級安全政策附加至關係時，您可以將政策與 AND 或 OR 子句結合使用。根據預設，Amazon Redshift 將 RLS 政策與 AND 子句結合在一起。具有 `sys:secadmin` 角色的超級使用者、使用者或角色可以使用此子句來定義關係之資料列層級安全政策的組合類型。如需詳細資訊，請參閱[每個使用者結合多個政策](t_rls_combine_policies.md)。
+ FOR DATASHARES

   該子句會決定是否可透過資料共用存取受 RLS 保護的關係。預設的情況是無法透過資料共用存取受 RLS 保護的關係。搭配此子句執行的 ALTER MATERIALIZED VIEW ROW LEVEL SECURITY 命令只會影響關係的資料共用存取屬性。ROW LEVEL SECURITY 屬性並未變更。

   如果您讓受 RLS 保護的關係可以透過資料庫存取，則該關係在取用者端資料庫中不會有資料列層級的安全性。關係會在生產者端保留其 RLS 屬性。

## 範例
<a name="r_ALTER_MATERIALIZED_VIEW-examples"></a>

下列範例可讓 `tickets_mv` 具體化視觀表自動重新整理。

```
ALTER MATERIALIZED VIEW tickets_mv AUTO REFRESH YES
```

# ALTER MATERIALIZED VIEW 的 DISTSTYLE 和 SORTKEY 範例
<a name="r_ALTER_MATERIALIZED_VIEW-DISTSTYLE-SORTKEY-examples"></a>

本主題中的範例說明如何使用 ALTER MATERIALIZED VIEW 執行 DISTSTYLE 和 SORTKEY 變更。

下列範例查詢顯示如何使用範例基礎資料表更改 DISTSTYLE KEY DISTKEY 欄：

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER diststyle KEY distkey inv_warehouse_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER distkey inv_item_sk;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

將具體化視觀表更改為 DISTSTYLE ALL：

```
CREATE TABLE base_inventory(
  inv_date_sk int4 NOT NULL,
  inv_item_sk int4 NOT NULL,
  inv_warehouse_sk int4 NOT NULL,
  inv_quantity_on_hand int4
);

INSERT INTO base_inventory VALUES(1,1,1,1);

CREATE materialized VIEW inventory diststyle even AS SELECT * FROM base_inventory;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

ALTER MATERIALIZED VIEW inventory ALTER diststyle ALL;
SELECT "table", diststyle FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

下列命令顯示使用範例基礎資料表的 ALTER MATERIALIZED VIEW SORTKEY 範例：

```
CREATE TABLE base_inventory (c0 int, c1 int);

INSERT INTO base_inventory VALUES(1,1);

CREATE materialized VIEW inventory interleaved sortkey(c0, c1) AS SELECT * FROM base_inventory;
SELECT "table", sortkey1 FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0, c1);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey NONE;
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

ALTER materialized VIEW inventory ALTER sortkey(c0);
SELECT "table", diststyle, sortkey_num FROM svv_table_info WHERE "table" = 'inventory';

DROP TABLE base_inventory CASCADE;
```

# ALTER RLS POLICY
<a name="r_ALTER_RLS_POLICY"></a>

修改資料表上現有的資料列層級安全性政策。

超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以修改政策。

## 語法
<a name="r_ALTER_RLS_POLICY-synopsis"></a>

```
ALTER RLS POLICY
{ policy_name | database_name.policy_name }
USING ( using_predicate_exp );
```

## Parameters
<a name="r_ALTER_RLS_POLICY-parameters"></a>

 *policy\$1name*   
政策的名稱。

database\$1name  
政策建立來源的資料庫名稱。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

USING (* using\$1predicate\$1exp *)  
指定套用至查詢中 WHERE 子句的篩選條件。Amazon Redshift 會在查詢層級使用者述詞之前套用政策述詞。例如，**current\$1user = ‘joe’ and price > 10** 會限制 Joe 只能查看價格大於 \$110 的記錄。  
在用來以 policy\$1name 名稱建立政策的 CREATE RLS POLICY 陳述式中，運算式可以存取其中 WITH 子句中宣告的變數。

如需在 Amazon Redshift 聯合許可目錄上使用 ALTER RLS POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

## 範例
<a name="r_ALTER_RLS_POLICY-examples"></a>

下列範例會修改 RLS 政策。

```
-- First create an RLS policy that limits access to rows where catgroup is 'concerts'.
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'concerts');

-- Then, alter the RLS policy to only show rows where catgroup is 'piano concerts'.
ALTER RLS POLICY policy_concerts
USING (catgroup = 'piano concerts');
```

# ALTER ROLE
<a name="r_ALTER_ROLE"></a>

重新命名角色或變更擁有者。如需 Amazon Redshift 系統定義角色的清單，請參閱 [Amazon Redshift 系統定義角色](r_roles-default.md)。

## 所需的許可
<a name="r_ALTER_ROLE-privileges"></a>

以下是 ALTER ROLE 所需的權限：
+ 超級使用者
+ 具有 ALTER ROLE 許可的使用者

## 語法
<a name="r_ALTER_ROLE-synopsis"></a>

```
ALTER ROLE role [ WITH ]
  { { RENAME TO role } | { OWNER TO user_name } }[, ...]
  [ EXTERNALID TO external_id ]
```

## Parameters
<a name="r_ALTER_ROLE-parameters"></a>

 *角色*   
要修改的角色名稱。

RENAME TO  
角色的新名稱。

OWNER TO *user\$1name*  
角色的新擁有者。

EXTERNALID TO *external\$1id*  
角色的新外部 ID，與身分提供者相關聯。如需詳細資訊，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

## 範例
<a name="r_ALTER_ROLE-examples"></a>

下列範例會將角色的名稱從 `sample_role1` 變更為 `sample_role2`。

```
ALTER ROLE sample_role1 RENAME TO sample_role2;
```

下列範例會變更角色的擁有者。

```
ALTER ROLE sample_role1 WITH OWNER TO user1
```

ALTER ROLE 的語法類似於下面的 ALTER PROCEDURE。

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

下列範例會將程序的擁有者變更為 `etl_user`。

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

下列範例會使用與身分提供者相關聯的新外部 ID 來更新角色 `sample_role1`。

```
ALTER ROLE sample_role1 EXTERNALID TO "XYZ456";
```

# ALTER PROCEDURE
<a name="r_ALTER_PROCEDURE"></a>

重新命名程序或變更擁有者。程序名稱和資料類型 (或簽章) 都是必要的。只有擁有者或超級使用者才能重新命名程序。只有超級使用者才能變更程序的擁有者。

## 語法
<a name="r_ALTER_PROCEDURE-synopsis"></a>

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    RENAME TO new_name
```

```
ALTER PROCEDURE sp_name [ ( [ [ argname ] [ argmode ] argtype [, ...] ] ) ]
    OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
```

## Parameters
<a name="r_ALTER_PROCEDURE-parameters"></a>

 *sp\$1name*   
要修改的程序的名稱。在目前的搜尋路徑中僅指定程序的名稱，或使用格式 `schema_name.sp_procedure_name` 來使用專屬結構描述。

*[argname] [argmode] argtype*   
引數名稱、引數模式和資料類型的清單。只有用於識別預存程序的輸入資料類型是必要的。或者，您可以提供用於建立程序的完整簽章，包括輸入和輸出參數及其模式。

 *new\$1name*   
預存程序的新名稱。

*new\$1owner* \$1 CURRENT\$1USER \$1 SESSION\$1USER  
預存程序的新擁有者。

## 範例
<a name="r_ALTER_PROCEDURE-examples"></a>

下列範例會將程序的名稱從 `first_quarter_revenue` 變更為 `quarterly_revenue`。

```
ALTER PROCEDURE first_quarter_revenue(volume INOUT bigint, at_price IN numeric,
 result OUT int) RENAME TO quarterly_revenue;
```

此範例相當於下列命令。

```
ALTER PROCEDURE first_quarter_revenue(bigint, numeric) RENAME TO quarterly_revenue;
```

下列範例會將程序的擁有者變更為 `etl_user`。

```
ALTER PROCEDURE quarterly_revenue(bigint, numeric) OWNER TO etl_user;
```

# ALTER SCHEMA
<a name="r_ALTER_SCHEMA"></a>

變更現有結構描述的定義。使用此命令可重新命名結構描述或變更結構描述的擁有者。例如，重新命名現有的結構描述，以便在您打算建立該結構描述的新版本時，保留該結構描述的備份複本。如需結構描述的相關資訊，請參閱 [CREATE SCHEMA](r_CREATE_SCHEMA.md)。

若要檢視設定的結構描述配額，請參閱 [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md)。

若要檢視超出結構描述配額的記錄，請參閱 [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md)。

## 所需權限
<a name="r_ALTER_SCHEMA-privileges"></a>

以下是 ALTER SCHEMA 所需的權限：
+ 超級使用者
+ 具有 ALTER SCHEMA 權限的使用者
+ 結構描述擁有者

當您變更結構描述名稱時，請務必更新使用舊名稱的物件 (例如預存程序或具體化視觀表)，才能使用新名稱。

## 語法
<a name="r_ALTER_SCHEMA-synopsis"></a>

```
ALTER SCHEMA schema_name
{
RENAME TO new_name |
OWNER TO new_owner |
QUOTA { quota [MB | GB | TB] | UNLIMITED }
}
```

## Parameters
<a name="r_ALTER_SCHEMA-parameters"></a>

 *schema\$1name*   
要修改的資料庫結構描述名稱。

RENAME TO   
重新命名結構描述的子句。

 *new\$1name*   
結構描述的新名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

OWNER TO   
變更結構描述擁有者的子句。

 *new\$1owner*   
結構描述的新擁有者。

QUOTA   
所指定之結構描述可以使用的磁碟空間數上限。此空間是所指定之結構描述下所有資料表的集體大小。Amazon Redshift 會將選取的值轉換為 MB。GB 是您未指定值時的預設測量單位。  
如需設定結構描述配額的相關資訊，請參閱 [CREATE SCHEMA](r_CREATE_SCHEMA.md)。

## 範例
<a name="r_ALTER_SCHEMA-examples"></a>

下列範例會將 SALES 結構描述重新命名為 US\$1SALES。

```
alter schema sales
rename to us_sales;
```

下列範例會將 US\$1SALES 結構描述的擁有權提供給使用者 DWUSER。

```
alter schema us_sales
owner to dwuser;
```

下列範例會將配額變更為 300 GB，並移除配額。

```
alter schema us_sales QUOTA 300 GB;
alter schema us_sales QUOTA UNLIMITED;
```

# ALTER SYSTEM
<a name="r_ALTER_SYSTEM"></a>

變更 Amazon Redshift 叢集或 Redshift Serverless 工作群組的系統層級組態選項。

## 所需權限
<a name="r_ALTER_SYSTEM-privileges"></a>

下列其中一種使用者類型可以執行 ALTER SYSTEM 命令：
+ 超級使用者
+ 管理員使用者

## 語法
<a name="r_ALTER_SYSTEM-synopsis"></a>

```
ALTER SYSTEM SET system-level-configuration = {true| t | on | false | f | off}
```

## Parameters
<a name="r_ALTER_SYSTEM-parameters"></a>

 *system-level-configuration*   
系統層級組態 有效值：`data_catalog_auto_mount` 和 `metadata_security`。

\$1true\$1 t \$1 on \$1 false \$1 f \$1 off\$1   
用於啟用或停用系統層級組態的值。`true`、`t` 或 `on` 表示要啟用組態。`false`、`f` 或 `off` 表示要停用組態。

## 使用須知
<a name="r_ALTER_SYSTEM-usage-notes"></a>

對於佈建的叢集，`data_catalog_auto_mount` 的變更會在下次重新啟動叢集時生效。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[重新啟動叢集](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#reboot-cluster)。

對於無伺服器工作群組，`data_catalog_auto_mount` 的變更不會立即生效。

## 範例
<a name="r_ALTER_SYSTEM-examples"></a>

下列範例會開啟自動掛載 AWS Glue Data Catalog。

```
ALTER SYSTEM SET data_catalog_auto_mount = true;
```

下列範例會開啟中繼資料安全性。

```
ALTER SYSTEM SET metadata_security = true;
```

### 設定預設身分命名空間
<a name="r_ALTER_SYSTEM-identity"></a>

此範例為使用身分提供者時專用。您可以將 Redshift 與 IAM Identity Center 和身分提供者整合，以集中管理 Redshift 和其他 AWS 服務的身分。

下列範例示範如何設定系統的預設身分命名空間。如此一來，後續您就能更輕鬆地執行 GRANT 和 CREATE 陳述式，因為您不需要包含命名空間作為每個身分的字首。

```
ALTER SYSTEM SET default_identity_namespace = 'MYCO';
```

執行命令之後，您可以執行如下所示的陳述式：

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
               
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

設定預設身分命名空間的效果在於，每個身分都不需要用其作為字首。在此範例中，`alice` 會取代為 `MYCO:alice`。任何包含的身分都會發生此情況。如需搭配 Redshift 使用 IAM Identity Center 的詳細資訊，請參閱[將 Redshift 與 IAM Identity Center 連線，為使用者提供單一登入體驗](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)。

如需與使用 IAM Identity Center 的 Redshift 組態相關設定的詳細資訊，請參閱 [SET](r_SET.md) 和 [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md)。

# ALTER TABLE
<a name="r_ALTER_TABLE"></a>

此命令會變更 Amazon Redshift 資料表或 Amazon Redshift Spectrum 外部資料表的定義。此命令會更新 [CREATE TABLE](r_CREATE_TABLE_NEW.md) 或 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 設定的值和屬性。您可以在檢視上使用 ALTER TABLE 以提供資料列層級安全 (RLS)。

您不能在交易區塊 (BEGIN ... END) 內的外部資料表上執行 ALTER TABLE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

ALTER TABLE 會鎖定用於讀取和寫入操作的資料表，直到封閉 ALTER TABLE 操作的交易完成為止，除非在文件中明確說明您可以在修改資料表時，查詢資料或對資料表執行其他操作。

## 所需權限
<a name="r_ALTER_TABLE-privileges"></a>

修改資料表的使用者需要適當的權限，才能成功執行命令。根據 ALTER TABLE 命令的不同，使用者可能需要下列其中一項權限。
+ 超級使用者
+ 具有 ALTER TABLE 權限的使用者
+ 具有結構描述的 USAGE 權限的資料表擁有者

## 語法
<a name="r_ALTER_TABLE-synopsis"></a>

```
ALTER TABLE table_name
{
ADD table_constraint
| DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
| OWNER TO new_owner
| RENAME TO new_name
| RENAME COLUMN column_name TO new_name
| ALTER COLUMN column_name TYPE updated_varchar_data_type_size
| ALTER COLUMN column_name ENCODE new_encode_type
| ALTER COLUMN column_name ENCODE encode_type,
| ALTER COLUMN column_name ENCODE encode_type, .....;
| ALTER DISTKEY column_name
| ALTER DISTSTYLE ALL
| ALTER DISTSTYLE EVEN
| ALTER DISTSTYLE KEY DISTKEY column_name
| ALTER DISTSTYLE AUTO
| ALTER [COMPOUND] SORTKEY ( column_name [,...] )
| ALTER SORTKEY AUTO
| ALTER SORTKEY NONE
| ALTER ENCODE AUTO
| ADD [ COLUMN ] column_name column_type
  [ DEFAULT default_expr ]
  [ ENCODE encoding ]
  [ NOT NULL | NULL ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ] |
| DROP [ COLUMN ] column_name [ RESTRICT | CASCADE ] 
| ROW LEVEL SECURITY { ON | OFF } [ CONJUNCTION TYPE { AND | OR } ] [ FOR DATASHARES ]
| MASKING { ON | OFF } FOR DATASHARES }

where table_constraint is:

[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] )
| PRIMARY KEY ( column_name [, ... ] )
| FOREIGN KEY (column_name [, ... ] )
   REFERENCES  reftable [ ( refcolumn ) ]}

The following options apply only to external tables:

SET LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
| SET FILE FORMAT format |
| SET TABLE PROPERTIES ('property_name'='property_value')
| PARTITION ( partition_column=partition_value [, ...] )
  SET LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
| ADD [IF NOT EXISTS]
    PARTITION ( partition_column=partition_value [, ...] ) LOCATION { 's3://bucket/folder' |'s3://bucket/manifest_file' }
    [, ... ]
| DROP PARTITION ( partition_column=partition_value [, ...] )
```

若要減少執行 ALTER TABLE 命令的時間，你可以結合 ALTER TABLE 命令的部分子句。

Amazon Redshift 支援 ALTER TABLE 子句的以下組合：

```
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTKEY column_Id;
ALTER TABLE tablename ALTER DISTKEY column_Id, ALTER SORTKEY (column_list);
ALTER TABLE tablename ALTER SORTKEY (column_list), ALTER DISTSTYLE ALL;
ALTER TABLE tablename ALTER DISTSTYLE ALL, ALTER SORTKEY (column_list);
```

## Parameters
<a name="r_ALTER_TABLE-parameters"></a>

 *table\$1name*   
要修改的資料表名稱。僅指定資料表的名稱，或使用格式 *schema\$1name.table\$1name* 來使用專屬結構描述。外部資料表必須以外部結構描述名稱限定。如果您要使用 ALTER TABLE 陳述式重新命名檢視或變更其擁有者，則也可以指定檢視名稱。資料表名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

ADD *table\$1constraint*   
新增指定限制條件至資料表的子句。如需有效 *table\$1constraint* 值得說明，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
您無法將主索引鍵限制條件新增至可為 null 的資料欄。如果資料欄原本是以 NOT NULL 限制條件建立，則您可以新增主索引鍵限制條件。

DROP CONSTRAINT *constraint\$1name*   
從資料表中刪除具名限制條件的子句。若要刪除限制條件，請指定限制條件名稱，而非限制條件類型。若要檢視資料表限制條件名稱，請執行下列查詢。  

```
select constraint_name, constraint_type
from information_schema.table_constraints;
```

RESTRICT   
僅移除指定限制條件的子句。RESTRICT 是 DROP CONSTRAINT 的選項。RESTRICT 不能搭配 CASCADE 使用。

CASCADE   
此子句會移除指定限制條件及相依於該限制條件的任何項目。CASCADE 是 DROP CONSTRAINT 的選項。CASCADE 不能搭配 RESTRICT 使用。

OWNER TO *new\$1owner*   
此子句會將資料表 (或檢視) 的擁有者變更為 *new\$1owner* 值。

RENAME TO *new\$1name*   
此子句會將資料表 (或檢視) 重新命名為 *new\$1name* 中指定的值。資料表名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。  
您無法將永久資料表重新命名為開頭為 '\$1' 的名稱。開頭為 '\$1' 的資料表名稱代表暫時資料表。  
您無法重新命名外部資料表。

ALTER COLUMN *column\$1name* TYPE *updated\$1varchar\$1data\$1type\$1size*   
子句，會變更定義為 VARCHAR 資料類型的資料欄大小。此子句僅支援修改 VARCHAR 資料類型的大小。考量下列限制：  
+ 您無法修改具有以下壓縮編碼的欄位：BYTEDICT、RUNLENGTH、TEXT255 或 TEXT32K。
+ 您無法將大小降低至小於現有資料的大小上限。
+ 您無法修改含預設值的資料欄。
+ 您無法修改具有 UNIQUE、PRIMARY KEY 或 FOREIGN KEY 的資料欄。
+ 您無法在交易區塊 (BEGIN ... END) 內改變資料欄。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

ALTER COLUMN *column\$1name* ENCODE *new\$1encode\$1type*   
變更資料欄壓縮編碼的子句。如果您指定資料欄的壓縮編碼，資料表就不會再設定為 ENCODE AUTO。如需壓縮編碼的詳細資訊，請參閱 [欄壓縮以縮減儲存資料的大小](t_Compressing_data_on_disk.md)。  
當您變更資料欄的壓縮編碼時，資料表仍可供查詢。  
考量下列限制：  
+ 您無法將資料欄的編碼修改為目前資料行定義的編碼。
+ 您無法在具有交錯排序索引鍵的資料表中修改資料行的編碼。

ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, ALTER COLUMN *column\$1name* ENCODE *encode\$1type*, .....;  
該子句可變更單一命令中多個資料欄的壓縮編碼。如需壓縮編碼的詳細資訊，請參閱 [欄壓縮以縮減儲存資料的大小](t_Compressing_data_on_disk.md)。  
當您變更資料欄的壓縮編碼時，資料表仍可供查詢。  
 考量下列限制：  
+ 您無法在單一命令中多次將資料欄變更為相同或不同的編碼類型。
+ 您無法將資料欄的編碼修改為目前資料行定義的編碼。
+ 您無法在具有交錯排序索引鍵的資料表中修改資料行的編碼。

ALTER DISTSTYLE ALL  
將資料表的現有分佈樣式變更為 `ALL` 的子句。考慮下列各項：  
+ 無法同時在相同資料表上執行 ALTER DISTSTYLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE ALL 會傳回錯誤。
  + 如果 ALTER DISTSTYLE ALL 執行中，則不會在資料表上啟動背景清空。
+ 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE ALL 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE ALL 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTSTYLE EVEN  
將資料表的現有分佈樣式變更為 `EVEN` 的子句。考慮下列各項：  
+ 無法同時在相同資料表上執行 ALTER DISTSYTLE、ALTER SORTKEY 和 VACUUM。
  + 如果 VACUUM 目前執行中，然後執行 ALTER DISTSTYLE EVEN 會傳回錯誤。
  + 如果 ALTER DISTSTYLE EVEN 執行中，則不會在資料表上啟動背景清空。
+ 包含交錯排序索引鍵的資料表和暫存資料表不支援 ALTER DISTSTYLE EVEN 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
如需 DISTSTYLE EVEN 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTKEY *column\$1name* 或 ALTER DISTSTYLE KEY DISTKEY *column\$1name*  
會變更用作資料表的分佈索引鍵的資料欄的子句。考慮下列各項：  
+ VACUUM 和 ALTER DISTKEY 無法並行在相同資料表上執行。
  + 如果 VACUUM 已在執行，則 ALTER DISTKEY 會傳回錯誤。
  + 如果 ALTER DISTKEY 執行中，則不會在資料表上啟動背景清空。
  + 如果 ALTER DISTKEY 執行中，則前景清空會傳回錯誤。
+ 您一次僅可以在一個資料表上執行一個 ALTER DISTKEY 命令。
+ 包含交錯排序索引鍵的資料表不支援 ALTER DISTKEY 命令。
+ 如果分佈樣式先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
指定 DISTSTYLE KEY 時，資料是依 DISTKEY 資料欄中的值分佈。如需 DISTSTYLE 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER DISTSTYLE AUTO  
將資料表的現有分佈樣式變更為 AUTO 的子句。  
將分佈樣式變更為 AUTO 時，資料表的分佈樣式會設定為下列內容：  
+ 將具有 DISTSTYLE ALL 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE EVEN 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE KEY 的小型資料表轉換為 AUTO(ALL)。
+ 將具有 DISTSTYLE ALL 的大型資料表轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE EVEN 的大型資料表轉換為 AUTO(EVEN)。
+ 將具有 DISTSTYLE KEY 的大型資料表轉換為 AUTO(KEY) 並保留 DISTKEY 。在這種情況下，Amazon Redshift 不會對資料表進行任何變更。
如果 Amazon Redshift 判斷新的分佈樣式或索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更資料表的分佈樣式或索引鍵。例如，Amazon Redshift 可能會將 DISTSTYLE 為 AUTO(KEY) 的資料表轉換為 AUTO(EVEN)，反之亦然。如需修改分佈索引鍵時行為 (包括資料重新分佈和鎖定) 的相關資訊，請參閱 [Amazon Redshift Advisor 建議](https://docs.aws.amazon.com/redshift/latest/dg/advisor-recommendations.html#alter-diststyle-distkey-recommendation)。  
如需 DISTSTYLE AUTO 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
若要檢視資料表的分佈樣式，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視資料表的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請參閱[SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。

ALTER [COMPOUND] SORTKEY ( *column\$1name* [,...] )  
此子句可變更或新增用於資料表的排序索引鍵。暫存資料表不支援 ALTER SORTKEY。  
當您變更排序索引鍵時，新排序索引鍵或原始排序索引鍵中欄的壓縮編碼可能會變更。如果沒有明確定義資料表的編碼，則 Amazon Redshift 會自動指定壓縮編碼，如下所示：  
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL 或 DOUBLE PRECISION 資料類型的資料欄會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR 或 VARCHAR 的資料欄會有指派的 LZO 壓縮。
考慮下列各項：  
+ 每個資料表的排序索引鍵最多可定義 400 個資料欄。
+ 您可以將交錯排序索引鍵修改為複合排序索引鍵或無排序索引鍵。但是，您無法將複合排序索引鍵修改為交錯排序索引鍵。
+ 如果排序索引鍵先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。
+ Amazon Redshift 建議對定義為排序索引鍵的資料欄使用 RAW 編碼 (不壓縮)。當您變更資料欄以選擇其做為排序索引鍵時，資料欄的壓縮會變更為 RAW 壓縮 (不壓縮)。這可能會增加資料表所需的儲存空間。資料表大小的增加幅度取決於特定的資料表定義和資料表內容。如需壓縮的相關資訊，請參閱 [壓縮編碼](c_Compression_encodings.md)。
當資料載入資料表之後，資料就會依據排序索引鍵的排序載入。當您修改排序索引鍵時，Amazon Redshift 會重新排列資料。如需 SORTKEY 的相關資訊，請參閱[CREATE TABLE](r_CREATE_TABLE_NEW.md)。

ALTER SORTKEY AUTO  
將目標資料表的排序索引鍵變更或新增為 AUTO 的子句。暫存資料表不支援 SORTKEY AUTO。  
當您將排序索引鍵修改為 AUTO 時，Amazon Redshift 會保留資料表的現有排序索引鍵。  
如果 Amazon Redshift 判斷新的排序索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在未來變更資料表的排序索引鍵。  
如需 SORTKEY AUTO 的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。  
若要檢視資料表的排序索引鍵，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視資料表的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請參閱[SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。

ALTER SORTKEY NONE  
移除目標資料表的排序索引鍵的子句。  
如果排序索引鍵先前已定義為 AUTO，則該資料表不再是自動資料表最佳化的候選項目。

ALTER ENCODE AUTO  
將目標資料表資料欄的編碼類型變更為 AUTO 的子句。當您將編碼修改為 AUTO 時，Amazon Redshift 會保留資料表中資料欄的現有編碼類型。然後，如果 Amazon Redshift 判斷新的編碼類型可以改善查詢效能，Amazon Redshift 就可以變更資料表資料欄的編碼類型。  
如果您修改一個或多個欄以指定編碼，則 Amazon Redshift 不會再自動調整資料表中所有資料欄的編碼。這些資料欄會保留目前的編碼設定。  
下列動作不會影響資料表的 ENCODE AUTO 設定：  
+ 重新命名資料表。
+ 修改資料表的 DISTSTYLE 或 SORTKEY 設定。
+ 使用 ENCODE 設定新增或捨棄資料列。
+ 使用 COPY 命令的 COMPUPDATE 選項。如需詳細資訊，請參閱[資料載入操作](copy-parameters-data-load.md)。
若要檢視資料表的編碼，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。

RENAME COLUMN *column\$1name* TO *new\$1name*   
此子句會將資料欄重新命名為 *new\$1name* 中指定的值。資料欄名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

ADD [ COLUMN ] *column\$1name*   
將指定名稱的資料欄新增至資料表的子句。您只能在每個 ALTER TABLE 陳述式中新增一個資料欄。  
您無法新增本身為資料表的分佈索引鍵 (DISTKEY) 或排序索引鍵 (SORTKEY) 的資料欄。  
 您無法使用 ALTER TABLE ADD COLUMN 命令修改以下資料表和資料欄屬性：  
+ UNIQUE
+ PRIMARY KEY
+ REFERENCES (外部索引鍵)
+ IDENTITY 或 GENERATED BY DEFAULT AS IDENTITY
資料欄名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。單一資料表中可定義的資料欄數目上限為 1,600 個。  
以下限制適用於新增資料欄至外部資料表時：  
+ 您無法將資料欄新增至具有資料欄限制條件 DEFAULT、ENCODE、NOT NULL 或 NULL 的外部資料表。
+ 您無法將資料欄新增至使用 AVRO 檔案格式定義的外部資料表。
+ 若啟用虛擬資料欄，則單一外部資料表中可定義的資料欄數目上限為 1,598 個。若未啟用虛擬資料欄，則單一資料表中可定義的資料欄數目上限為 1,600 個。
如需詳細資訊，請參閱[CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)。

 *column\$1type*   
要新增之資料欄的資料類型。若是 CHAR 和 VARCHAR 資料欄，您可以改用 MAX 關鍵字，而不宣告長度上限。MAX 會將 CHAR 的長度上限設定為 4,096 個位元組，或將 VARCHAR 的長度上限設定為 65,535 個位元組。GEOMETRY 物件的大小上限是 1,048,447 位元組。  
如需有關 Amazon Redshift 支援資料類型的資訊，請參閱 [資料類型](c_Supported_data_types.md)。

DEFAULT *default\$1expr*   <a name="alter-table-default"></a>
此子句會指派資料欄的預設資料值。*default\$1expr* 的資料類型必須符合資料欄的資料類型。DEFAULT 值必須是無變數的表達式。不允許子查詢、目前資料表中其他資料欄的交叉參考，以及使用者定義的功能。  
*default\$1expr* 是在未指定資料欄值的任何 INSERT 操作中使用。若未指定預設值，則資料欄的預設值為 null。  
若 COPY 操作在資料欄上遇到有 DEFAULT 值和 NOT NULL 限制條件的 null 欄位，則 COPY 命令會插入 *default\$1expr* 的值。  
外部資料表不支援 DEFAULT。

ENCODE *encoding*   
資料欄的壓縮編碼。根據預設，如果您未為資料表中的任何資料欄指定壓縮編碼，或者您指定資料表的 ENCODE AUTO 選項，Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。  
如果您為資料表中的任何資料欄指定壓縮編碼，或者未為資料表指定 ENCODE AUTO 選項，Amazon Redshift 會自動將壓縮編碼指派給您未指定壓縮編碼的資料欄，如下所示：  
+ 暫時資料表中的所有資料欄預設都會有指派的 RAW 壓縮。
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY 或 GEOGRAPHY 資料類型的資料行會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR、VARCHAR 或 VARBYTE 的資料欄會有指派的 LZO 壓縮。
若您不想要壓縮資料欄，請明確指定 RAW 編碼。
支援以下 [compression encodings](c_Compression_encodings.md#compression-encoding-list)：  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (無壓縮)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD
外部資料表不支援 ENCODE。

NOT NULL \$1 NULL   
NOT NULL 會指定不允許資料欄包含 null 值。NULL 是預設值，指出資料欄可接受 null 值。  
外部資料表不支援 NOT NULL 和 NULL。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定資料欄上的字串搜尋或比較是區分大小寫或不區分大小寫的子句。預設值與資料庫目前的區分大小寫設定相同。  
若要尋找資料庫定序資訊，請使用下列命令：  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE 和 CS 可互換，並產生相同的結果。同樣地，CASE\$1INSENSITIVE 和 CI 可互換，並產生相同的結果。

DROP [ COLUMN ] *column\$1name*   
要從資料表中刪除的資料欄名稱。  
您無法刪除資料表中的最後一個資料欄。資料表至少必須有一個資料欄。  
您無法刪除本身為資料表的分佈索引鍵 (DISTKEY) 或排序索引鍵 (SORTKEY) 的資料欄。若資料欄有任何相依物件，像是檢視、主索引鍵、外部索引鍵或 UNIQUE 限制條件，則 DROP COLUMN 的預設行為是 RESTRICT。  
以下限制適用於從外部資料表刪除資料欄時：  
+ 若資料欄做為分割區使用，則無法從外部資料表刪除該資料欄。
+ 您無法從使用 AVRO 檔案格式定義的外部資料表中刪除資料欄。
+ 外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。
+ 除非您將政策捨棄或中斷連結，否則您無法捨棄政策定義中參照的政策資料表資料欄。這也適用於指定 CASCADE 選項時。您可以捨棄政策資料表中的其他資料欄。
如需詳細資訊，請參閱[CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)。

RESTRICT   
搭配 DROP COLUMN 使用時，RESTRICT 表示要捨棄的資料欄未捨棄，在以下這些情況中：  
+ 如果定義的檢視參考要捨棄的資料欄
+ 如果外部索引鍵參考資料欄
+ 如果資料欄為分段索引鍵的一部分
RESTRICT 不能搭配 CASCADE 使用。  
外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

CASCADE   
搭配 DROP COLUMN 使用時，會移除指定的資料欄及相依於該資料欄的任何項目。CASCADE 不能搭配 RESTRICT 使用。  
外部資料表的 RESTRICT 和 CASCADE 會遭到忽略。

以下選項只適用於外部資料表。

SET LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*' \$1  
包含資料檔案的 Amazon S3 資料夾路徑，或包含 Amazon S3 物件路徑清單的資訊清單檔案。儲存貯體必須位於 Amazon Redshift 叢集所在的同一 AWS 區域。如需支援的 AWS 區域清單，請參閱 [Amazon Redshift Spectrum 限制](c-spectrum-considerations.md)。如需使用資訊清單檔案的相關資訊，請參閱 CREATE EXTERNAL TABLE [Parameters](r_CREATE_EXTERNAL_TABLE.md#r_CREATE_EXTERNAL_TABLE-parameters) 參考中的 LOCATION。

SET FILE FORMAT *format*  
外部資料檔案的檔案格式。  
有效格式如下：  
+ AVRO 
+ PARQUET
+ RCFILE
+ SEQUENCEFILE
+ TEXTFILE 

SET TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*')   
此子句會設定外部資料表的資料表屬性的資料表定義。  
資料表屬性區分大小寫。  
'numRows'='*row\$1count*'  
此屬性會設定資料表定義的 numRows 值。若要明確更新外部資料表的統計資料，請設定 numRows 屬性以指出資料表的大小。Amazon Redshift 不會分析外部資料表來產生查詢最佳化工具用來產生查詢計劃的資料表統計資料。如果未設定外部資料表的資料表統計資料，則 Amazon Redshift 會產生查詢執行計畫。此計畫是根據外部資料表為較大資料表，而本機資料表為較小資料表的假設。  
'skip.header.line.count'='*line\$1count*'  
此屬性會設定每個來源檔案開頭要略過的資料列數。

PARTITION ( *partition\$1column*=*partition\$1value* [, ...] SET LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1  
此子句會設定一個或多個分割區資料欄的新位置。

ADD [ IF NOT EXISTS ] PARTITION ( *partition\$1column*=*partition\$1value* [, ...] ) LOCATION \$1 's3://*bucket*/*folder*' \$1 's3://*bucket*/*manifest\$1file*' \$1 [, ... ]  
新增一或多個分割區的子句。您可以使用單一 ALTER TABLE … ADD 陳述式來指定多個 PARTITION 子句。  
如果您使用 AWS Glue 目錄，您可以使用單一 ALTER TABLE 陳述式新增最多 100 個分割區。
IF NOT EXISTS 子句指出，若指定的分割區已存在，則命令不應進行任何變更。也指出命令應該傳回分割區已存在的訊息，而不是在發生錯誤的情況下終止。此子句在編寫指令碼時很實用，如此指令碼就不會因為 ALTER TABLE 嘗試新增已存在的分割區而失敗。

DROP PARTITION (*partition\$1column*=*partition\$1value* [, ...] )   
刪除指定分割區的子句。刪除分割區只會修改外部資料表中繼資料。Amazon S3 上的資料不受影響。

ROW LEVEL SECURITY \$1 ON \$1 OFF \$1 [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] [ FOR DATASHARES ]  
開啟或關閉關係的資料列層級安全性的子句。  
開啟關係的資料列層級安全性時，您只能讀取資料列層級安全政策允許您存取的資料列。如果沒有任何政策授予您關係存取權，您就無法看到關聯中的任何資料列。只有超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以設定 ROW LEVEL SECURITY 子句。如需詳細資訊，請參閱[資料列層級安全性](t_rls.md)。連線的資料庫或具有 amazon redshift 聯合許可的資料庫支援此陳述式。FOR DATASHARES 子句不支援具有 Amazon Redshift 聯合許可的資料庫。  
+ [ CONJUNCTION TYPE \$1 AND \$1 OR \$1 ] 

  一個子句，讓您為關係選擇資料列層級安全政策的結合類型。將多個資料列層級安全政策附加至關係時，您可以將政策與 AND 或 OR 子句結合使用。根據預設，Amazon Redshift 將 RLS 政策與 AND 子句結合在一起。具有 `sys:secadmin` 角色的超級使用者、使用者或角色可以使用此子句來定義關係之資料列層級安全政策的組合類型。如需詳細資訊，請參閱[每個使用者結合多個政策](t_rls_combine_policies.md)。
+ FOR DATASHARES

  該子句會決定是否可透過資料共用存取受 RLS 保護的關係。預設的情況是無法透過資料共用存取受 RLS 保護的關係。搭配此子句執行的 ALTER TABLE ROW LEVEL SECURITY 命令只會影響關係的資料共用存取屬性。ROW LEVEL SECURITY 屬性並未變更。

   如果您讓受 RLS 保護的關係可以透過資料庫存取，則該關係在取用者端資料庫中不會有資料列層級的安全性。關係會在生產者端保留其 RLS 屬性。

MASKING \$1 ON \$1 OFF \$1 FOR DATASHARES  
該子句會決定是否可透過資料共用存取受 DDM 保護的關係。根據預設，無法透過資料共用存取受 DDM 保護的關係。如果您開放透過資料共用存取受 DDM 保護的關係，則該關係在取用者端資料共用的資料庫中不會受到遮罩保護。關係會保留其在生產者端的遮罩屬性。只有超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以設定 MASKING FOR DATASHARES 子句。如需詳細資訊，請參閱[動態資料遮罩](t_ddm.md)。

## 範例
<a name="r_ALTER_TABLE-examples"></a>

如需示範如何使用 ALTER TABLE 命令的範例，請參閱下列內容。
+ [ALTER TABLE 範例](r_ALTER_TABLE_examples_basic.md)
+ [ALTER EXTERNAL TABLE 範例](r_ALTER_TABLE_external-table.md)
+ [ALTER TABLE ADD 和 DROP COLUMN 範例](r_ALTER_TABLE_COL_ex-add-drop.md)

# ALTER TABLE 範例
<a name="r_ALTER_TABLE_examples_basic"></a>

以下範例示範 ALTER TABLE 命令的基本用法。

## 重新命名資料表或檢視
<a name="r_ALTER_TABLE_examples_basic-rename-a-table"></a>

以下命令會將 USERS 資料表重新命名為 USERS\$1BKUP：

```
alter table users
rename to users_bkup;
```

 您也可以使用此類型的命令來重新命名檢視。

## 變更資料表或檢視的擁有者
<a name="r_ALTER_TABLE_examples_basic-change-the-owner-of-a-table-or-view"></a>

以下命令會將 VENUE 資料表擁有者變更為使用者 DWUSER：

```
alter table venue
owner to dwuser;
```

以下命令會建立檢視，然後變更其擁有者：

```
create view vdate as select * from date;
alter table vdate owner to vuser;
```

## 重新命名欄位
<a name="r_ALTER_TABLE_examples_basic-rename-a-column"></a>

以下命令會將 VENUE 資料表中的 VENUESEATS 資料欄重新命名為 VENUESIZE：

```
alter table venue
rename column venueseats to venuesize;
```

## 丟棄資料表限制條件
<a name="r_ALTER_TABLE_examples_drop-constraint"></a>

若要捨棄資料表限制條件，像是主索引鍵、外部索引鍵或唯一限制條件，請先找到限制條件的內部名稱。然後在 ALTER TABLE 命令中指定限制條件名稱。以下範例會尋找 CATEGORY 資料表的限制條件，然後刪除名稱為 `category_pkey` 的主索引鍵。

```
select constraint_name, constraint_type
from information_schema.table_constraints
where constraint_schema ='public'
and table_name = 'category';

constraint_name | constraint_type
----------------+----------------
category_pkey   | PRIMARY KEY

alter table category
drop constraint category_pkey;
```

## 變更 VARCHAR 資料欄
<a name="r_ALTER_TABLE_examples_alter-column"></a>

若要節省儲存體，您可以定義一個資料表，其中的 VARCHAR 資料欄一開始具有您目前資料需求所需的最低大小。之後若要容納較長的字串，則可以變更資料表以增加資料欄的大小。

以下範例會將 EVENTNAME 資料欄的大小增加為 VARCHAR (300)。

```
alter table event alter column eventname type varchar(300);
```

## 更改 VARBYTE 欄
<a name="r_ALTER_TABLE_examples_alter-varbyte-column"></a>

若要節省儲存體，您可以定義一個資料表，其中的 VARBYTE 欄一開始具有您目前資料需求所需的最低大小。之後若要容納較長的字串，則可以變更資料表以增加資料欄的大小。

以下範例會將 EVENTNAME 欄的大小增加為 VARBYTE(300)。

```
alter table event alter column eventname type varbyte(300);
```

## 修改資料欄的壓縮編碼。
<a name="r_ALTER_TABLE_examples_alter-column-encoding"></a>

您可以修改資料欄的壓縮編碼。您可以在下方找到一組示範此方法的範例。這些範例的資料表定義如下。

```
create table t1(c0 int encode lzo, c1 bigint encode zstd, c2 varchar(16) encode lzo, c3 varchar(32) encode zstd);
```

下列陳述式會將資料欄 c0 的壓縮編碼從 LZO 編碼修改為 AZ64 編碼。

```
alter table t1 alter column c0 encode az64;
```

下列陳述式會將資料欄 c1 的壓縮編碼從 Zstandard 編碼修改為 AZ64 編碼。

```
alter table t1 alter column c1 encode az64;
```

下列陳述式會將資料欄 c2 的壓縮編碼從 LZO 編碼修改為 Byte-Dictionary 編碼。

```
alter table t1 alter column c2 encode bytedict;
```

下列陳述式會將資料欄 c3 的壓縮編碼從 Zstandard 編碼修改為 Runlength 編碼。

```
alter table t1 alter column c3 encode runlength;
```

## 修改 DISTSTYLE KEY DISTKEY 欄位
<a name="r_ALTER_TABLE_examples_alter-distkey"></a>

下列範例示範如何變更資料表的 DISTSTYLE 和 DISTKEY。

建立採用 EVEN 分佈樣式的資料表。SVV\$1TABLE\$1INFO 檢視顯示 DISTSTYLE 為 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

將資料表 DISTKEY 改為 `inv_warehouse_sk`。SVV\$1TABLE\$1INFO 檢視將 `inv_warehouse_sk` 資料欄顯示為產生的分佈金鑰。

```
alter table inventory alter diststyle key distkey inv_warehouse_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_warehouse_sk)
```

將資料表 DISTKEY 改為 `inv_item_sk`。SVV\$1TABLE\$1INFO 檢視將 `inv_item_sk` 資料欄顯示為產生的分佈金鑰。

```
alter table inventory alter distkey inv_item_sk;

select "table", "diststyle" from svv_table_info;

   table   |       diststyle
-----------+-----------------------
 inventory | KEY(inv_item_sk)
```

## 將資料表改為 DISTSTYLE ALL
<a name="r_ALTER_TABLE_examples_alter-diststyle-all"></a>

下列範例示範如何將資料表變更為 DISTSTYLE ALL。

建立採用 EVEN 分佈樣式的資料表。SVV\$1TABLE\$1INFO 檢視顯示 DISTSTYLE 為 EVEN。

```
create table inventory(
  inv_date_sk int4 not null ,
  inv_item_sk int4 not null ,
  inv_warehouse_sk int4 not null ,
  inv_quantity_on_hand int4
) diststyle even;

Insert into inventory values(1,1,1,1);

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     EVEN
```

將資料表 DISTSTYLE 改為 ALL。SVV\$1TABLE\$1INFO 檢視會顯示已變更的 DISTSYTLE。

```
alter table inventory alter diststyle all;

select "table", "diststyle" from svv_table_info;

   table   |   diststyle
-----------+----------------
 inventory |     ALL
```

## 修改資料表 SORTKEY
<a name="r_ALTER_TABLE_examples_alter-sortkey"></a>

您可以修改資料表以具有複合排序索引鍵或沒有排序鍵。

在下列資料表定義中，資料表 `t1` 是以交錯排序索引鍵來定義。

```
create table t1 (c0 int, c1 int) interleaved sortkey(c0, c1);
```

下列命令會將資料表從交錯排序索引鍵修改為複合排序索引鍵。

```
alter table t1 alter sortkey(c0, c1);
```

下列命令會修改資料表以移除交錯排序索引鍵。

```
alter table t1 alter sortkey none;
```

在下列資料表定義中，資料表 `t1` 是以 `c0` 作為交錯排序索引鍵來定義。

```
create table t1 (c0 int, c1 int) sortkey(c0);
```

下列命令會將資料表 `t1` 修改為複合排序索引鍵。

```
alter table t1 alter sortkey(c0, c1);
```

## 將資料表修改為 ENCODE AUTO
<a name="r_ALTER_TABLE_examples_alter-encode-auto"></a>

下列範例顯示如何將資料表修改為 ENCODE AUTO。

此範例的資料表定義如下。資料欄 `c0` 是以編碼類型 AZ64 定義，而資料欄 `c1` 是以編碼類型 LZO 定義。

```
create table t1(c0 int encode AZ64, c1 varchar encode LZO);
```

對於此資料表，下列陳述式會將編碼變更為 AUTO。

```
alter table t1 alter encode auto;
```

下列範例會顯示如何將資料表修改為移除 ENCODE AUTO 設定。

此範例的資料表定義如下。資料表資料欄不需編碼即可定義。在這種情況下，編碼會預設為 ENCODE AUTO。

```
create table t2(c0 int, c1 varchar);
```

對於此資料表，下列陳述式會將資料欄 c0 的編碼變更為 LZO。資料表編碼不再設定為 ENCODE AUTO。

```
alter table t2 alter column c0 encode lzo;;
```

## 修改資料列層級安全性控制
<a name="r_ALTER_TABLE_examples_basic-rls"></a>

下列命令會關閉資料表的 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY OFF;
```

下列命令會開啟資料表的 RLS：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
```

下列命令會開啟資料表的 RLS，並使其可透過資料共用存取：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES OFF;
```

下列命令會開啟資料表的 RLS，並使其不可透過資料共用存取：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON;
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY FOR DATASHARES ON;
```

下列命令會開啟 RLS，並將資料表的 RLS 結合類型設定為 OR：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE OR;
```

下列命令會開啟 RLS，並將資料表的 RLS 結合類型設定為 AND：

```
ALTER TABLE tickit_category_redshift ROW LEVEL SECURITY ON CONJUNCTION TYPE AND;
```

# ALTER EXTERNAL TABLE 範例
<a name="r_ALTER_TABLE_external-table"></a>

下列範例使用位於美國東部 （維吉尼亞北部） 區域 (`us-east-1`) 的 Amazon S3 儲存貯體， AWS 區域 以及在 中[範例](r_CREATE_EXTERNAL_TABLE_examples.md)為 CREATE TABLE 建立的範例資料表。如需如何搭配外部資料表使用分割區的詳細資訊，請參閱 [分割 Redshift Spectrum 外部資料表](c-spectrum-external-tables.md#c-spectrum-external-tables-partitioning)。

以下範例會將 SPECTRUM.SALES 外部資料表的 numRows 資料表屬性設定為 170,000 個資料列。

```
alter table spectrum.sales
set table properties ('numRows'='170000');
```

以下範例會變更 SPECTRUM.SALES 外部資料表的位置。

```
alter table spectrum.sales
set location 's3://redshift-downloads/tickit/spectrum/sales/';
```

以下範例會將 SPECTRUM.SALES 外部資料表的格式變更為 Parquet。

```
alter table spectrum.sales
set file format parquet;
```

以下範例會為 SPECTRUM.SALES\$1PART 資料表新增一個分割區。

```
alter table spectrum.sales_part
add if not exists partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
```

以下範例會為 SPECTRUM.SALES\$1PART 資料表新增三個分割區。

```
alter table spectrum.sales_part add if not exists
partition(saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/'
partition(saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/'
partition(saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
```

以下範例會修改 SPECTRUM.SALES\$1PART 以刪除具有 `saledate='2008-01-01''` 的分割區。

```
alter table spectrum.sales_part
drop partition(saledate='2008-01-01');
```

以下範例會為具有 `saledate='2008-01-01'` 的分割區設定新的 Amazon S3 路徑。

```
alter table spectrum.sales_part
partition(saledate='2008-01-01')
set location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01-01/';
```

下列範例會將 `sales_date` 的名稱變更為 `transaction_date`。

```
alter table spectrum.sales rename column sales_date to transaction_date;
```

下列範例會針對使用最佳化資料列單欄式 (ORC) 格式的外部資料表，將資料欄映射設定為位置映射。

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='position');
```

下列範例會針對使用 ORC 格式的外部資料表，將資料欄映射設定為名稱映射。

```
alter table spectrum.orc_example
set table properties('orc.schema.resolution'='name');
```

# ALTER TABLE ADD 和 DROP COLUMN 範例
<a name="r_ALTER_TABLE_COL_ex-add-drop"></a>

以下範例示範如何使用 ALTER TABLE 先新增再刪除基本資料表資料欄，以及如何刪除具有相依物件的資料欄。

## 先 ADD 再 DROP 基本欄位
<a name="r_ALTER_TABLE_COL_ex-add-then-drop-a-basic-column"></a>

下列範例會將獨立的 FEEDBACK\$1SCORE 資料欄新增至 USERS 資料表。此資料欄僅包含整數，且此資料欄的預設值為 NULL (無意見回饋分數)。

首先，查詢 PG\$1TABLE\$1DEF 目錄資料表以檢視 USERS 資料表的結構描述：

```
column        | type                   | encoding | distkey | sortkey
--------------+------------------------+----------+---------+--------
userid        | integer                | delta    | true    |       1
username      | character(8)           | lzo      | false   |       0
firstname     | character varying(30)  | text32k  | false   |       0
lastname      | character varying(30)  | text32k  | false   |       0
city          | character varying(30)  | text32k  | false   |       0
state         | character(2)           | bytedict | false   |       0
email         | character varying(100) | lzo      | false   |       0
phone         | character(14)          | lzo      | false   |       0
likesports    | boolean                | none     | false   |       0
liketheatre   | boolean                | none     | false   |       0
likeconcerts  | boolean                | none     | false   |       0
likejazz      | boolean                | none     | false   |       0
likeclassical | boolean                | none     | false   |       0
likeopera     | boolean                | none     | false   |       0
likerock      | boolean                | none     | false   |       0
likevegas     | boolean                | none     | false   |       0
likebroadway  | boolean                | none     | false   |       0
likemusicals  | boolean                | none     | false   |       0
```

現在新增 feedback\$1score 資料欄：

```
alter table users
add column feedback_score int
default NULL;
```

從 USERS 選取 FEEDBACK\$1SCORE 資料欄，確認其已新增：

```
select feedback_score from users limit 5;

feedback_score
----------------
NULL
NULL
NULL
NULL
NULL
```

刪除資料欄以恢復原始 DDL：

```
alter table users drop column feedback_score;
```

## 捨棄具有相依物件的欄位
<a name="r_ALTER_TABLE_COL_ex-dropping-a-column-with-a-dependent-object"></a>

下列範例會捨棄具有相依物件的資料欄。結果會將相依物件一併刪除。

首先再次將 FEEDBACK\$1SCORE 資料欄新增至 USERS 資料表：

```
alter table users
add column feedback_score int
default NULL;
```

接著從 USERS 資料表建立名為 USERS\$1VIEW 的檢視：

```
create view users_view as select * from users;
```

現在嘗試從 USERS 資料表刪除 FEEDBACK\$1SCORE 資料欄。此 DROP 陳述式會使用預設行為 (RESTRICT)：

```
alter table users drop column feedback_score;
```

Amazon Redshift 會顯示錯誤訊息，指出無法捨棄資料欄，因為有其他物件與其相依。

再次嘗試刪除 FEEDBACK\$1SCORE 資料欄，這次指定 CASCADE 以刪除所有相依物件：

```
alter table users
drop column feedback_score cascade;
```

# ALTER TABLE APPEND
<a name="r_ALTER_TABLE_APPEND"></a>

會從現有來源資料表移出資料，將資料列附加到目標資料表。來源資料表中的資料會移至目標資料表中相符的資料欄。資料欄的順序並不重要。資料成功附加至目標資料表後，來源資料表就會是空的。因為是移動而不是複製資料，ALTER TABLE APPEND 通常比類似的 [CREATE TABLE AS](r_CREATE_TABLE_AS.md) 或 [INSERT](r_INSERT_30.md) INTO 操作更快。

**注意**  
ALTER TABLE APPEND 會在來源資料表和目標資料表之間移動資料區塊。為了提升效能，ALTER TABLE APPEND 不會在附加操作的過程中精簡儲存空間。因此，儲存空間的使用量會暫時增加。若要回收空間，請執行 [VACUUM](r_VACUUM_command.md) 操作。

同名的資料欄也必須有一模一樣的資料欄屬性。若來源資料表或目標資料表包含對方所沒有的資料欄，請使用 IGNOREEXTRA 或 FILLTARGET 參數指定管理額外資料欄的方式。

您無法附加身分資料欄。若兩個資料表都包含身分資料欄，命令就會失敗。若只有一個資料表擁有身分資料欄，請包含 FILLTARGET 或 IGNOREEXTRA 參數。如需詳細資訊，請參閱[ALTER TABLE APPEND 使用須知](#r_ALTER_TABLE_APPEND_usage)。

您可以附加 GENERATED BY DEFAULT AS IDENTITY 欄。您可以利用您提供的值，更新定義為 GENERATED BY DEFAULT AS IDENTITY 的資料欄。如需詳細資訊，請參閱[ALTER TABLE APPEND 使用須知](#r_ALTER_TABLE_APPEND_usage)。

目標資料表必須是永久資料表。不過，來源可以是永久資料表，也可以是為串流擷取設定的具體化視觀表。兩個物件必須使用相同的分佈樣式和分佈索引鍵 (如有定義的話)。若物件經過排序，則兩個物件必須使用相同的排序樣式，並且定義相同的資料欄做為排序索引鍵。

ALTER TABLE APPEND 命令會在操作完成時立即自動遞交。此命令無法轉返。您無法在交易區塊 (BEGIN ... END) 內執行 ALTER TABLE APPEND。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

## 所需權限
<a name="r_ALTER_TABLE_APPEND-privileges"></a>

根據 ALTER TABLE APPEND 命令的不同，使用者可能需要下列其中一項權限：
+ 超級使用者
+ 具 ALTER TABLE 系統權限的使用者
+ 在來源資料表上具有 DELETE 和 SELECT 權限，以及在目標資料表上具有 INSERT 權限的使用者

## 語法
<a name="r_ALTER_TABLE_APPEND-synopsis"></a>

```
ALTER TABLE target_table_name APPEND FROM [ source_table_name | source_materialized_view_name ]
[ IGNOREEXTRA | FILLTARGET ]
```

從具體化視觀表附加只有在為 [將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md) 設定具體化視觀表的情況下才有作用。

## Parameters
<a name="r_ALTER_TABLE_APPEND-parameters"></a>

 *target\$1table\$1name*   
要附加資料列的資料表名稱。僅指定資料表的名稱，或使用格式 *schema\$1name.table\$1name* 來使用專屬結構描述。目標資料表必須是現有的永久資料表。

 FROM *source\$1table\$1name*   
提供要附加之資料列的資料表名稱。僅指定資料表的名稱，或使用格式 *schema\$1name.table\$1name* 來使用專屬結構描述。來源資料表必須是現有的永久資料表。

 FROM *source\$1materialized\$1view\$1name*   
提供要附加之資料列的具體化視觀表名稱。從具體化視觀表附加只有在為 [將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md) 設定具體化視觀表的情況下才有作用。來源具體化視觀表必須已存在。

IGNOREEXTRA   
此關鍵字會指定，若來源資料表包含了目標資料表中沒有的資料欄，則應捨棄額外資料欄中的資料。您無法搭配 FILLTARGET 使用 IGNOREEXTRA。

FILLTARGET   
此關鍵字會指定，若目標資料表包含了來源資料表中沒有的資料欄，則應在這些資料欄中填入 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 資料欄值 (如有定義的話) 或 NULL。您無法搭配 FILLTARGET 使用 IGNOREEXTRA。

## ALTER TABLE APPEND 使用須知
<a name="r_ALTER_TABLE_APPEND_usage"></a>
+ ALTER TABLE APPEND 只會移動來源資料表與目標資料表中完全相同的資料欄。資料欄的順序並不重要。
+  若來源資料表或目標資料表包含額外的資料欄，請根據下列規則使用 FILLTARGET 或 IGNOREEXTRA：
  + 如果來源資料表包含了目標資料表中沒有的資料欄，則要包括 IGNOREEXTRA。此命令會略過來源資料表中額外的資料欄。
  + 如果目標資料表包含了來源資料表中沒有的資料欄，則要包括 FILLTARGET。此命令會以預設資料欄值或 IDENTITY 值 (如有定義的話) 或 NULL 填入目標資料表中額外的資料欄。
  + 如果來源資料表和目標資料表都包含額外的資料欄，則命令會失敗。您無法同時使用 FILLTARGET 和 IGNOREEXTRA。
+ 如果兩個資料表中包含的資料欄名稱相同但屬性不同，則命令會失敗。名稱類似的資料欄必須都有下列屬性：
  + 資料類型
  + 資料欄大小
  + 壓縮編碼
  + 非 null
  + 排序樣式
  + 排序索引鍵資料欄
  + 分佈樣式
  + 分佈索引鍵資料欄
+ 您無法附加身分資料欄。如果來源資料表和目標資料表都有身分資料欄，則命令會失敗。若只有來源資料表擁有身分資料欄，請包含 IGNOREEXTRA 參數以便略過身分資料欄。若只有目標資料表擁有身分資料欄，請包含 FILLTARGET 參數，以便根據為資料表定義的 IDENTITY 子句填入身分資料欄。如需詳細資訊，請參閱[DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default)。
+ 您可以利用 ALTER TABLE APPEND 陳述式來附加預設身分資料欄。如需詳細資訊，請參閱[CREATE TABLE](r_CREATE_TABLE_NEW.md)。
+ ALTER TABLE APPEND 操作在連線至下列任一項的 Amazon Redshift 串流具體化視觀表上執行時，會保留獨佔鎖定：
  +  Amazon Kinesis Data Stream 
  +  Amazon Managed Streaming for Apache Kafka 主題 
  +  支援的外部串流，例如 Confluent Cloud Kafka 主題 

  如需詳細資訊，請參閱[將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md)。

## ALTER TABLE APPEND 範例
<a name="r_ALTER_TABLE_APPEND_examples"></a>

假設您的組織有資料表 SALES\$1MONTHLY，用來擷取目前的銷售交易。您想要每個月將交易資料表中的資料移至 SALES 資料表。

您可以使用以下 INSERT INTO 和 TRUNCATE 命令完成這項任務。

```
insert into sales (select * from sales_monthly);
truncate sales_monthly;
```

不過，使用 ALTER TABLE APPEND 命令能夠更有效率地執行相同的操作。

首先，查詢 [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md) 系統目錄資料表以確認兩個資料表擁有相同的資料欄，且資料欄的屬性相同。

```
select trim(tablename) as table, "column", trim(type) as type,
encoding, distkey, sortkey, "notnull"
from pg_table_def where tablename like 'sales%';

table      | column     | type                        | encoding | distkey | sortkey | notnull
-----------+------------+-----------------------------+----------+---------+---------+--------
sales      | salesid    | integer                     | lzo      | false   |       0 | true
sales      | listid     | integer                     | none     | true    |       1 | true
sales      | sellerid   | integer                     | none     | false   |       2 | true
sales      | buyerid    | integer                     | lzo      | false   |       0 | true
sales      | eventid    | integer                     | mostly16 | false   |       0 | true
sales      | dateid     | smallint                    | lzo      | false   |       0 | true
sales      | qtysold    | smallint                    | mostly8  | false   |       0 | true
sales      | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
sales      | commission | numeric(8,2)                | delta32k | false   |       0 | false
sales      | saletime   | timestamp without time zone | lzo      | false   |       0 | false
salesmonth | salesid    | integer                     | lzo      | false   |       0 | true
salesmonth | listid     | integer                     | none     | true    |       1 | true
salesmonth | sellerid   | integer                     | none     | false   |       2 | true
salesmonth | buyerid    | integer                     | lzo      | false   |       0 | true
salesmonth | eventid    | integer                     | mostly16 | false   |       0 | true
salesmonth | dateid     | smallint                    | lzo      | false   |       0 | true
salesmonth | qtysold    | smallint                    | mostly8  | false   |       0 | true
salesmonth | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | commission | numeric(8,2)                | delta32k | false   |       0 | false
salesmonth | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

接著查看各資料表的大小。

```
select count(*) from sales_monthly;
 count
-------
  2000
(1 row)

select count(*) from sales;
 count
-------
 412,214
(1 row)
```

現在執行以下 ALTER TABLE APPEND 命令。

```
alter table sales append from sales_monthly;         
```

再次查看各資料表的大小。SALES\$1MONTHLY 資料表現在擁有 0 個資料列，而 SALES 資料表增加了 2000 個資料列。

```
select count(*) from sales_monthly;
 count
-------
     0
(1 row)

select count(*) from sales;
 count
-------
 414214
(1 row)
```

如果來源資料表的資料欄比目標資料表多，請指定 IGNOREEXTRA 參數。以下範例使用 IGNOREEXTRA 參數在附加至 SALES 資料表時，略過 SALES\$1LISTING 資料表中額外的資料欄。

```
alter table sales append from sales_listing ignoreextra;
```

如果目標資料表的資料欄比來源資料表多，請指定 FILLTARGET 參數。以下範例使用 FILLTARGET 參數來填入 SALES\$1REPORT 資料表中 SALES\$1MONTH 資料表沒有的資料欄。

```
alter table sales_report append from sales_month filltarget;
```

下列範例顯示如何以具體化視觀表作為來源來使用 ALTER TABLE APPEND 的範例。

```
ALTER TABLE target_tbl APPEND FROM my_streaming_materialized_view;
```

此範例中的資料表和具體化視觀表名稱為範例。從具體化視觀表附加只有在為 [將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md) 設定具體化視觀表的情況下才有作用。這會將來源具體化視觀表中的所有記錄移至與具體化視觀表具有相同結構描述的目標資料表，並使具體化視觀表保持不變。這與資料來源為資料表時的行為相同。

# ALTER 範本
<a name="r_ALTER_TEMPLATE"></a>

變更現有範本的定義。使用此命令重新命名範本、變更範本的擁有者、從範本定義新增或移除參數，或設定參數值。

## 所需權限
<a name="r_ALTER_TEMPLATE-privileges"></a>

若要更改範本，您必須具有下列其中一項：
+ 超級使用者權限
+ 包含範本之結構描述的 ALTER TEMPLATE 權限和 USAGE 權限

## 語法
<a name="r_ALTER_TEMPLATE-synopsis"></a>

```
ALTER TEMPLATE [database_name.][schema_name.]template_name
{
RENAME TO new_name
| OWNER TO new_owner
| ADD  parameter [AS] [value]
| DROP parameter
| SET parameter TO value1 [, parameter2 TO value2 , ...]
};
```

## Parameters
<a name="r_ALTER_TEMPLATE-parameters"></a>

 *database\$1name*   
（選用） 建立範本的資料庫名稱。如果未指定，則會使用目前的資料庫。

 *schema\$1name*   
（選用） 建立範本的結構描述名稱。如果未指定，則會在目前的搜尋路徑中搜尋範本。

 *template\$1name*   
要變更的範本名稱。

RENAME TO   
重新命名範本的 子句。

 *new\$1name*   
範本的新名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

OWNER TO   
變更範本擁有者的子句。

 *new\$1owner*   
範本的新擁有者。

ADD *參數* 【AS】 【*值*】  
將新參數新增至範本。  
+ 對於僅限關鍵字的參數 （例如 CSV 或 GZIP)，請僅指定參數名稱。
+ 對於需要值的參數，請指定參數名稱，後面接著 值。您可以選擇性地在參數和值之間包含 AS。

DROP *參數*  
從範本中移除指定的參數。無法使用單一 DROP 命令捨棄多個參數。

SET *參數* TO *value1* 【， *參數2* TO *value2* ， ...】  
更新現有範本參數的值。僅將 用於已有值的參數。您可以在單一命令中更新多個參數。

## 範例
<a name="r_ALTER_TEMPLATE-examples"></a>

下列範例會將 test\$1template 範本重新命名為 demo\$1template。

```
ALTER TEMPLATE test_template
RENAME TO demo_template;
```

下列範例會將 demo\$1template 結構描述的擁有權提供給使用者 bob。

```
ALTER TEMPLATE demo_template
OWNER TO bob;
```

下列範例將參數`CSV`新增至 template demo\$1template

```
ALTER TEMPLATE demo_template
ADD CSV;
```

下列範例將參數`TIMEFORMAT 'auto'`新增至 template demo\$1template

```
ALTER TEMPLATE demo_template
ADD TIMEFORMAT 'auto';
```

下列範例`ENCRYPTED`會從範本 demo\$1template 捨棄參數

```
ALTER TEMPLATE demo_template
DROP ENCRYPTED;
```

下列範例會將 `DELIMITER` 參數設定為 ，`'|'`並將 `TIMEFORMAT` 參數設定為 `'epochsecs'`：

```
ALTER TEMPLATE demo_template
SET DELIMITER TO '|', TIMEFORMAT TO 'epochsecs';
```

# ALTER USER
<a name="r_ALTER_USER"></a>

變更資料庫使用者。

## 所需權限
<a name="r_ALTER_USER-privileges"></a>

以下是 ALTER USER 所需的權限：
+ 超級使用者
+ 具有 ALTER USER 權限的使用者
+ 想要變更自己密碼的目前使用者

## 語法
<a name="r_ALTER_USER-synopsis"></a>

```
ALTER USER username [ WITH ] option [, ... ]

where option is

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ VALID UNTIL 'expiration_date' ]
| RENAME TO new_name |
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit | RESET SESSION TIMEOUT
| SET parameter { TO | = } { value | DEFAULT }
| RESET parameter
| EXTERNALID external_id
```

## Parameters
<a name="r_ALTER_USER-parameters"></a>

 *username*   
使用者的名稱。

WITH   
選用的關鍵字。

CREATEDB \$1 NOCREATEDB   
CREATEDB 選項可讓使用者建立新的資料庫。NOCREATEDB 是預設值。

CREATEUSER \$1 NOCREATEUSER   
CREATEUSER 選項可建立具有所有資料庫權限的超級使用者，包括 CREATE USER。預設值為 NOCREATEUSER。如需詳細資訊，請參閱[超級使用者](r_superusers.md)。

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="alter-user-syslog-access"></a>
此子句會指定使用者對 Amazon Redshift 系統資料表和檢視的存取層級。  
具有 SYSLOG ACCESS RESTRICTED 許可的一般使用者，只能看見該使用者在使用者可見的系統資料表和檢視中產生的列。預設值為 RESTRICTED。  
具有 SYSLOG ACCESS UNRESTRICTED 許可的一般使用者，可以看見使用者可見的系統資料表和檢視中的所有列，包括其他使用者產生的列。UNRESTRICTED 並不會讓一般使用者存取超級使用者可查看的資料表。只有超級使用者可看見超級使用者可查看的資料表。  
若使用者擁有不受限制的系統資料表存取權限，該使用者就能查看其他使用者產生的資料。例如，STL\$1QUERY 和 STL\$1QUERYTEXT 包含 INSERT、UPDATE 和 DELETE 陳述式的全文，當中可能包含使用者產生的敏感資料。
所有使用者皆可看到 SVV\$1TRANSACTIONS 中的所有資料列。  
如需詳細資訊，請參閱[系統資料表和檢視中資料的可見性](cm_chap_system-tables.md#c_visibility-of-data)。

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
設定使用者的密碼。  
根據預設，使用者可以變更自己擁有的密碼，除非密碼遭到停用。若要停用使用者的密碼，請指定 DISABLE。停用使用者的密碼時，會從系統刪除密碼，而且使用者只能使用暫時 AWS Identity and Access Management (IAM) 使用者登入資料登入。如需詳細資訊，請參閱[使用 IAM 身分驗證產生資料庫使用者登入資料](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html)。只有超級使用者能夠啟用或停用密碼，您無法停用超級使用者的密碼。若要啟用密碼，請執行 ALTER USER 並指定密碼。  
如需使用 PASSWORD 參數的詳細資訊，請參閱 [CREATE USER](r_CREATE_USER.md)。

VALID UNTIL '*expiration\$1date*'  
指定密碼有過期日期。使用 `'infinity'` 值就不會有過期日期。此參數的有效資料類型為時間戳記。  
只有超級使用者可以使用此參數。

RENAME TO   
重新命名使用者。

 *new\$1name*   
使用者的新名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
重新命名使用者時，您也必須重設使用者的密碼。重設密碼不一定要與先前的密碼不同。使用者名稱會做為密碼加密的一部分使用，因此使用者重新命名時，密碼也會遭到清除。在密碼重設前，使用者將無法登入。例如：  

```
alter user newuser password 'EXAMPLENewPassword11'; 
```

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
允許使用者同時開啟的資料庫連線數目上限。超級使用者不受此限制規範。使用 UNLIMITED 關鍵字可允許同時連線的最大數目。另外也可能限制每個資料庫的連線數目。如需詳細資訊，請參閱[CREATE DATABASE](r_CREATE_DATABASE.md)。預設值為 UNLIMITED。若要檢視目前連線數目，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統畫面。  
如果同時套用使用者和資料庫連線數目限制，則必須在使用者嘗試連線時，在不超過這兩項限制的情況下提供一個未使用的連線位置。

SESSION TIMEOUT *limit* \$1 RESET SESSION TIMEOUT  
工作階段保持非作用中或閒置的時間上限 (以秒為單位)。範圍是 60 秒 (一分鐘) 到 1,728,000 秒 (20 天)。如果未為使用者設定工作階段逾時，則會套用叢集設定。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配額和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。  
當您設定工作階段逾時時，只會套用至新的工作階段。  
若要檢視有關作用中使用者工作階段的資訊 (包括開始時間、使用者名稱和工作階段逾時)，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統檢視。若要檢視有關使用者工作階段歷史記錄的資訊，請查詢 [STL\$1SESSIONS](r_STL_SESSIONS.md) 檢視。若要擷取有關資料庫使用者的資訊 (包括工作階段逾時值)，請查詢 [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md) 檢視。

SET   
將指定使用者執行之所有工作階段的組態參數設定為新的預設值。

RESET   
將指定使用者的組態參數重設為原始預設值。

 *parameter*   
要設定或重設的參數名稱。

 *value*   
參數的新值。

DEFAULT   
將指定使用者執行之所有工作階段的組態參數設定為預設值。

EXTERNALID *external\$1id*   
與身分提供者相關聯的使用者識別碼。使用者必須停用密碼。如需詳細資訊，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

## 使用須知
<a name="r_ALTER_USER_usage_notes"></a>
+ **嘗試修改 rdsdb** - 您不能修改名為 `rdsdb` 的使用者。
+ **建立未知密碼** – 使用 AWS Identity and Access Management (IAM) 身分驗證建立資料庫使用者憑證時，您可能想要建立只能使用臨時憑證登入的超級使用者。您無法停用超級使用者的密碼，但是可以使用隨機產生的 MD5 雜湊字串建立未知的密碼。

  ```
  alter user iam_superuser password 'md51234567890123456780123456789012';
  ```
+ **設定 search\$1path** – 當您使用 ALTER USER 命令設定 [search\$1path](r_search_path.md) 參數時，修改會在指定使用者下次登入時生效。若您想要變更目前使用者和工作階段的 search\$1path 值，請使用 SET 命令。
+ **設定時區** – 當您搭配 ALTER USER 命令使用 SET TIMEZONE 時，修改會在指定使用者下次登入時生效。
+ **使用動態資料遮罩和資料列層級安全性政策** — 當您佈建的叢集或無伺服器命名空間具有任何動態資料遮罩或資料列層級安全性政策時，一般使用者會無法使用下列命令：

  ```
  ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
  ```

  只有超級使用者和具有 ALTER USER 權限的使用者才能設定這些組態選項。如需有關資料列層級安全性詳細資訊，請參閱 [資料列層級安全性](t_rls.md)。如需動態資料遮罩的詳細資訊，請參閱 [動態資料遮罩](t_ddm.md)。

## 範例
<a name="r_ALTER_USER-examples"></a>

下列範例會將建立資料庫的權限提供給使用者 ADMIN：

```
alter user admin createdb;
```

下面範例會將使用者 ADMIN 的密碼設為 `adminPass9`，以及為密碼設定過期日期和時間：

```
alter user admin password 'adminPass9'
valid until '2017-12-31 23:59';
```

以下範例會將使用者 ADMIN 重新命名為 SYSADMIN：

```
alter user admin rename to sysadmin;
```

下列範例會將使用者的閒置工作階段逾時更新為 300 秒。

```
ALTER USER dbuser SESSION TIMEOUT 300;
```

重設使用者的閒置工作階段逾時。重設時會套用叢集設定。您必須是資料庫超級使用者才能執行此命令。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配額和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

```
ALTER USER dbuser RESET SESSION TIMEOUT;
```

下列範例會更新名為 `bob` 之使用者的外部 ID。命名空間為 `myco_aad`。如果命名空間未與已註冊的身分提供者相關聯，則會導致錯誤。

```
ALTER USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

下列範例會為特定資料庫使用者執行的所有工作階段設定時區。這會變更後續工作階段的時區，但不會變更目前工作階段的時區。

```
ALTER USER odie SET TIMEZONE TO 'Europe/Zurich';
```

下列範例會設定使用者 `bob` 允許開啟的資料庫連線數目上限。

```
ALTER USER bob CONNECTION LIMIT 10;
```

# ANALYZE
<a name="r_ANALYZE"></a>

更新資料表統計資訊以供查詢規劃器使用。

## 所需權限
<a name="r_ANALYZE-privileges"></a>

以下是 ANALYZE 所需的權限：
+ 超級使用者
+ 具有 ANALYZE 權限的使用者
+ 關係的擁有者
+ 共用資料表的資料庫擁有者

## 語法
<a name="r_ANALYZE-synopsis"></a>

```
ANALYZE [ VERBOSE ]
[ [ table_name [ ( column_name [, ...] ) ] ]
[ PREDICATE COLUMNS | ALL  COLUMNS ]
```

## Parameters
<a name="r_ANALYZE-parameters"></a>

詳細   
此子句會傳回有關 ANALYZE 操作的進度資訊訊息。若您不指定資料表，此選項會很實用。

 *table\$1name*   
您可以分析特定資料表，包括臨時資料表。您可以利用結構描述名稱限定資料表。您可以選擇性的指定 table\$1name 來分析單一資料表。您無法在單一 ANALYZE *table\$1name* 陳述式中指定多個 *table\$1name*。如果您未指定 *table\$1name* 值，則目前連接的資料庫中所有資料表都會加以分析，包括系統目錄中的永久性資料表。如果自上次 ANALYZE 之後變更的資料列百分比低於分析閾值，Amazon Redshift 會略過分析資料表。如需詳細資訊，請參閱[分析閾值](#r_ANALYZE-threshold)。  
您不需要分析 Amazon Redshift 系統資料表 (STL 和 STV 資料表)。

 *column\$1name*   
若您指定 *table\$1name*，則您也可以在資料表中指定一個或多個資料欄 (括號內以資料欄分隔的清單)。若指定了資料欄清單，則只會分析列出的資料欄。

 PREDICATE COLUMNS \$1 ALL COLUMNS   
這些子句會指出，ANALYZE 是否應該只包含述詞資料欄。指定 PREDICATE COLUMNS 時，只會分析已在先前查詢中做為述詞使用的資料欄，或可能做為述詞使用的候選資料欄。指定 ALL COLUMNS 則會分析所有資料欄。預設值是 ALL COLUMNS。  
若下列任一條件為真，表示資料欄包含在一組述詞資料欄中：  
+ 資料欄已在查詢中做為篩選的一部分、聯結條件或 group by 子句使用。
+ 資料欄是分佈索引鍵。
+ 資料欄是排序索引鍵的一部分。
如果資料表尚未經過查詢，因而未將任何資料欄標示為述詞資料欄，則即使指定了 PREDICATE COLUMNS，仍會分析所有資料欄。發生這種情況時，Amazon Redshift 可能會回應以下訊息：No predicate columns found for "*table-name*" (找不到 "table-name" 的述詞欄)。分析所有欄。如需述詞資料欄的相關資訊，請參閱 [分析資料表](t_Analyzing_tables.md)。

## 使用須知
<a name="r_ANALYZE-usage-notes"></a>

Amazon Redshift 會在您使用下列命令建立的資料表上自動執行 ANALYZE：
+ CREATE TABLE AS
+ CREATE TEMP TABLE AS 
+ SELECT INTO

 您無法分析外部資料表。

您不需要在初次建立這些資料表時，對其執行 ANALYZE 命令。若您修改這些資料表，則應依照與其他資料表相同的方式進行分析。

### 分析閾值
<a name="r_ANALYZE-threshold"></a>

為了減少處理時間並提高整體系統效能，如果自上次執行 ANALYZE 命令後變更的資料列百分比低於 [analyze\$1threshold\$1percent](r_analyze_threshold_percent.md) 參數指定的分析閾值，則 Amazon Redshift 會略過資料表的 ANALYZE 操作。`analyze_threshold_percent` 預設為 10。若要變更目前工作階段的 `analyze_threshold_percent`，請執行 [SET](r_SET.md) 命令。下列範例會將 `analyze_threshold_percent` 變更為 20%。

```
set analyze_threshold_percent to 20;
```

若要在只有少量資料列變更時分析資料表，請將 `analyze_threshold_percent` 設定為任何更小的數。例如，如果將`analyze_threshold_percent` 設為 0.01，則 100,000,000 資料列的資料表中變更的資料列大於 10,000 列資料時，便不會略過資料表。

```
set analyze_threshold_percent to 0.01;
```

若 ANALYZE 因為不符合分析閾值而略過資料表，Amazon Redshift 會傳回以下訊息。

```
ANALYZE SKIP
```

若要分析所有資料表，即使沒有任何資料列變更，請將 `analyze_threshold_percent` 設為 0。

若要檢視 ANALYZE 操作的結果，請查詢 [STL\$1ANALYZE](r_STL_ANALYZE.md) 系統資料表。

如需分析資料表的相關資訊，請參閱 [分析資料表](t_Analyzing_tables.md)。

## 範例
<a name="r_ANALYZE-examples"></a>

分析 TICKIT 資料庫中的所有資料表，並傳回進度資訊。

```
analyze verbose;
```

只分析 LISTING 資料表。

```
analyze listing;
```

分析 VENUE 資料表中的 VENUEID 和 VENUENAME 資料欄。

```
analyze venue(venueid, venuename);
```

只分析 VENUE 資料表中的述詞資料欄。

```
analyze venue predicate columns;
```

# ANALYZE COMPRESSION
<a name="r_ANALYZE_COMPRESSION"></a>

執行壓縮分析並產生報告，當中針對分析的資料表提供建議的壓縮編碼。報告中會針對每個資料欄提供相較於 RAW 編碼，可能減少的磁碟空間估計值。

## 語法
<a name="r_ANALYZE_COMPRESSION-synopsis"></a>

```
ANALYZE COMPRESSION
[ [ table_name ]
[ ( column_name [, ...] ) ] ]
[COMPROWS numrows]
```

## Parameters
<a name="r_ANALYZE_COMPRESSION-parameters"></a>

 *table\$1name*   
您可以分析特定資料表的壓縮，包括臨時資料表。您可以利用結構描述名稱限定資料表。您可以選擇性的指定 *table\$1name* 來分析單一資料表。如果您未指定 *table\$1name* 值，目前連接的資料庫中所有資料表都會加以分析。您無法在單一 ANALYZE COMPRESSION 陳述式中指定多個 *table\$1name*。

 *column\$1name*   
若您指定 *table\$1name*，則您也可以在資料表中指定一個或多個資料欄 (括號內以資料欄分隔的清單)。

COMPROWS  
資料列數，做為壓縮分析的樣本大小。分析是以每個資料配量中的列為對象。例如，假設您指定 COMPROWS 1000000 (1,000,000)，而系統總共包含 4 個分割，則每個分割最多讀取和分析 250,000 列。如果不指定 COMPROWS，則每個分割的樣本大小預設為 100,000。如果 COMPROWS 的值小於每個分割預設的 100,000 列，則會自動提高到預設值。但是，如果資料表中的資料量不足，無法產生有意義的樣本，則壓縮分析不會產生建議。如果 COMPROWS 數字大於資料表中的資料列數，ANALYZE COMPRESSION 命令仍會繼續，並對所有可用的資料列進行壓縮分析。如果未指定資料表，則使用 COMPROWS 會導致錯誤。

 *numrows*   
資料列數，做為壓縮分析的樣本大小。*numrows* 可接受的範圍是介於 1000 到 1000000000 (1,000,000,000) 之間的數字。

## 使用須知
<a name="r_ANALYZE_COMPRESSION_usage_notes"></a>

ANALYZE COMPRESSION 會取得獨佔的資料表鎖定，防止同時對資料表進行讀取和寫入操作。只有在資料表閒置時才執行 ANALYZE COMPRESSION 命令。

執行 ANALYZE COMPRESSION 可根據資料表內容的樣本，取得資料欄編碼機制的建議。ANALYZE COMPRESSION 是建議使用的工具，並且不要修改資料表的資料欄編碼。您可以透過重新建立資料表，或建立具有相同結構描述的新資料表，套用建議的編碼。利用適當的編碼機制重新建立未經壓縮的資料表，可大幅減少在磁碟上佔用的空間。此方法節省了磁碟空間，並提高 I/O 繫結工作負載的查詢效能。

ANALYZE COMPRESSION 會略過實際的分析階段，並直接在指定為 SORTKEY 的任何資料欄上傳回原始編碼類型。這樣做的原因是，當 SORTKEY 資料欄的壓縮程度比其他資料欄高出許多時，限制範圍的掃描執行效果可能較差。

## 範例
<a name="r_ANALYZE_COMPRESSION-examples"></a>

下列範例只顯示 LISTING 資料表中資料欄的編碼和估計減少的百分比：

```
analyze compression listing;
  
  Table  |     Column     | Encoding | Est_reduction_pct 
---------+----------------+----------+-------------------
 listing | listid         | az64     | 40.96
 listing | sellerid       | az64     | 46.92
 listing | eventid        | az64     | 53.37
 listing | dateid         | raw      | 0.00
 listing | numtickets     | az64     | 65.66
 listing | priceperticket | az64     | 72.94
 listing | totalprice     | az64     | 68.05
 listing | listtime       | az64     | 49.74
```

以下範例會分析 SALES 資料表中的 QTYSOLD、COMMISSION 和 SALETIME 資料欄。

```
analyze compression sales(qtysold, commission, saletime);

 Table |   Column   | Encoding | Est_reduction_pct 
-------+------------+----------+-------------------
 sales | salesid    | N/A      | 0.00
 sales | listid     | N/A      | 0.00
 sales | sellerid   | N/A      | 0.00
 sales | buyerid    | N/A      | 0.00
 sales | eventid    | N/A      | 0.00
 sales | dateid     | N/A      | 0.00
 sales | qtysold    | az64     | 83.06
 sales | pricepaid  | N/A      | 0.00
 sales | commission | az64     | 71.85
 sales | saletime   | az64     | 49.63
```

# ATTACH MASKING POLICY
<a name="r_ATTACH_MASKING_POLICY"></a>

將現有的動態資料遮罩政策附加至資料欄。如需動態資料遮罩的相關資訊，請參閱 [動態資料遮罩](t_ddm.md)。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以附加遮罩政策。

## 語法
<a name="r_ATTACH_MASKING_POLICY-synopsis"></a>

```
ATTACH MASKING POLICY 
{
  policy_name ON relation_name
  | database_name.policy_name ON database_name.schema_name.relation_name
}
( { output_column_names | output_path } )
[ USING ( { input_column_names | input_path } ) ]
TO { user_name | ROLE role_name | PUBLIC }
[ PRIORITY priority ];
```

## Parameters
<a name="r_ATTACH_MASKING_POLICY-parameters"></a>

*policy\$1name*   
欲附加的遮罩政策名稱。

database\$1name  
建立政策和關係的資料庫名稱。政策和關係必須位於相同的資料庫。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

schema\$1name  
關係所屬的結構描述名稱。

 *relation\$1name*   
欲附加遮罩政策的關係名稱。

*output\$1column\$1names*   
要套用遮罩政策的資料欄名稱。

*output\$1paths*   
套用遮罩政策之 SUPER 物件的完整路徑，包括資料欄名稱。例如，對於具有名為 SUPER 類型欄 `person` 的關係，*output\$1path* 可能是 `person.name.first_name`。

*input\$1column\$1names*   
將作為遮罩政策輸入的資料欄名稱。此為選用參數。如果未指定，遮罩政策會使用 *output\$1column\$1names* 做為輸入。

*input\$1paths*   
遮罩政策會做為輸入之 SUPER 物件的完整路徑。此為選用參數。如果未指定，遮罩政策會使用 *output\$1path* 做為輸入。

*user\$1name*   
要附加遮罩政策的使用者名稱。您無法將兩個政策附加到使用者和欄或角色和欄的相同組合。您可以將一個政策附加至使用者，並將另一個政策附加至使用者的角色。在此情況下，會套用優先順序較高的政策。  
您只能在單一 ATTACH MASKING POLICY 命令中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

*role\$1name*   
要附加遮罩政策的角色名稱。您無法將兩個政策附加至相同的資料欄/角色配對。您可以將一個政策附加至使用者，並將另一個政策附加至使用者的角色。在此情況下，會套用優先順序較高的政策。  
您只能在單一 ATTACH MASKING POLICY 命令中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

*PUBLIC*   
將遮罩政策附加至存取資料表的所有使用者。您必須為附加至特定資料欄/使用者或資料欄/角色配對的其他遮罩政策提供高於 PUBLIC 政策的優先順序，才能套用這些政策。  
您只能在單一 ATTACH MASKING POLICY 命令中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

*priority*   
遮罩政策的優先順序。當多個遮罩政策套用至指定使用者的查詢時，會套用優先順序最高的政策。  
您無法將兩個不同的政策附加到具有相同優先順序的同個資料欄，即使這兩個策略附加到不同的使用者或角色也是如此。只要附加政策的使用者或角色每次都不同，您就可以將相同的政策多次附加至同一組資料表、輸出資料欄、輸入資料欄和優先順序參數。  
您無法對資料欄套用與附加至該資料欄的另一個政策具有相同優先順序的政策，即使用於不同角色也一樣。此欄位為選用欄位。如果未指定優先順序，遮罩政策會預設套用值為 0 的優先順序。

如需在 Amazon Redshift 聯合許可目錄上使用 ATTACH MASKING POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

# ATTACH RLS POLICY
<a name="r_ATTACH_RLS_POLICY"></a>

將資料表上的資料列層級安全性政策附加至一或多個使用者或角色。

超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以附加政策。

## 語法
<a name="r_ATTACH_RLS_POLICY-synopsis"></a>

```
ATTACH RLS POLICY 
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
TO { user_name | ROLE role_name | PUBLIC } [, ...]
```

## Parameters
<a name="r_ATTACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
政策的名稱。

database\$1name  
建立政策和關係的資料庫名稱。政策和關係必須位於相同的資料庫。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

schema\$1name  
關係所屬的結構描述名稱。

table\$1name  
連接至關係之資料列層級安全政策的名稱。

TO \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
指定政策是否附加至一或多個指定的使用者或角色。

如需在 Amazon Redshift 聯合許可目錄上使用 ATTACH RLS POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

## 使用須知
<a name="r_ATTACH_RLS_POLICY-usage"></a>

使用 ATTACH RLS POLICY 陳述式時，請注意以下內容：
+ 要附加的資料表應該包含政策建立陳述式的 WITH 子句中列出的所有資料欄。
+ Amazon Redshift RLS 支援將 RLS 政策連接到下列物件：
  +  表格 
  +  檢視
  +  近期繫結檢視 
  +  具體化視觀表
+ Amazon Redshift RLS 不支援將 RLS 政策附加到下列物件：
  +  目錄表 
  +  跨資料庫關係 
  +  外部資料表 
  +  暫時資料表 
  +  政策查詢資料表
  + 具體化視觀表基礎資料表
+ 若將 RLS 政策連接至超級使用者或具有 `sys:secadmin` 許可的使用者，則會忽略政策。

## 範例
<a name="r_ATTACH_RLS_POLICY-examples"></a>

下列範例會將 RLS 政策連接至指定的資料表和角色組合。RLS 政策會在具有 `analyst` 或 `dbadmin` 角色的任何使用者存取 tickit\$1category\$1redshift 資料表時套用。

```
ATTACH RLS POLICY policy_concerts ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
```

# BEGIN
<a name="r_BEGIN"></a>

開始交易。相當於 START TRANSACTION。

交易是單一邏輯工作單位，無論是由一個命令或多個命令所組成。一般而言，交易中的所有命令會在資料庫的快照上執行，其開始時間是由 `transaction_snapshot_begin` 系統組態參數的值組所決定。

根據預設，個別 Amazon Redshift 操作 (查詢、DDL 陳述式、負載) 會自動遞交至資料庫。如果您想要暫停遞交某項操作，直到後續工作完成為止，則需使用 BEGIN 陳述式開啟交易，然後執行所需的命令，再使用 [COMMIT](r_COMMIT.md) 或 [結束](r_END.md) 陳述式關閉交易。若有需要，您可以使用 [ROLLBACK](r_ROLLBACK.md) 陳述式停止進行中的交易。此行為的例外狀況是 [TRUNCATE](r_TRUNCATE.md) 命令，它會遞交本身執行所在的交易，而且無法轉返。

## 語法
<a name="r_BEGIN-synopsis"></a>

```
BEGIN [ WORK | TRANSACTION ] [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

START TRANSACTION [ ISOLATION LEVEL option ] [ READ WRITE | READ ONLY ]

Where option is

SERIALIZABLE
| READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ

Note: READ UNCOMMITTED, READ COMMITTED, and REPEATABLE READ have no
operational impact and map to SERIALIZABLE in Amazon Redshift. You can see database isolation levels on your cluster 
by querying the stv_db_isolation_level table.
```

## Parameters
<a name="r_BEGIN-parameters"></a>

WORK   
選用的關鍵字。

TRANSACTION   
選用的關鍵字；WORK 和 TRANSACTION 為同義詞。

ISOLATION LEVEL SERIALIZABLE   
可序列化隔離是預設支援的操作，因此無論陳述式中是否包含此語法，交易的行為都一樣。如需詳細資訊，請參閱[管理並行寫入操作](c_Concurrent_writes.md)。不支援任何其他隔離層級。  
SQL 標準定義了四種交易隔離層級來防止*已變更讀取* (交易讀取的資料是由未遞交的同時交易所撰寫)、*不可重複讀取* (交易重複讀取先前讀取的資料，且發現該資料已在初次讀取後，經過其他遞交的交易變更)，以及*幽靈讀取* (交易再次執行查詢、傳回一組滿足搜尋條件的資料列，然後發現該組資料列已因為其他最近遞交的交易而變更)：  
+ 讀取未遞交資料：已變更讀取、不可重複讀取及幽靈讀取都有可能發生。
+ 讀取已遞交資料：不可重複讀取及幽靈讀取都有可能發生。
+ 可重複讀取：可能發生幽靈讀取。
+ 可序列化：防止已變更讀取、不可重複讀取及幽靈讀取。
雖然您可以使用四種交易隔離層級中的任一種，但是 Amazon Redshift 會以可序列化的方式處理所有隔離層級。

READ WRITE   
為交易提供讀取和寫入許可。

READ ONLY   
為交易提供唯讀許可。

## 範例
<a name="r_BEGIN-examples"></a>

下列範例會啟動可序列化交易區塊：

```
begin;
```

下列範例會啟動具有可序列化隔離層級和讀取與寫入許可的交易區塊：

```
begin read write;
```

# CALL
<a name="r_CALL_procedure"></a>

執行預存程序。CALL 命令必須包含程序名稱和輸入引數值。您必須使用 CALL 陳述式來呼叫預存程序。

**注意**  
CALL 不能是任何一般查詢的一部分。

## 語法
<a name="r_CALL_procedure-synopsis"></a>

```
CALL sp_name ( [ argument ] [, ...] )
```

## Parameters
<a name="r_CALL_procedure-parameters"></a>

 *sp\$1name*   
要執行的程序的名稱。

 *argument*   
輸入引數的值。此參數也可以是函數名稱，例如 `pg_last_query_id()`。您不能將查詢當作 CALL 引數。

## 使用須知
<a name="r_CALL_procedure-usage-notes"></a>

Amazon Redshift 預存程序支援巢狀和遞迴呼叫，如下所述。此外，請確定您的驅動程序支援是最新版，亦如下所述。

**Topics**
+ [巢狀呼叫](#r_CALL_procedure-nested-calls)
+ [驅動程式支援](#r_CALL_procedure-driver-support)

### 巢狀呼叫
<a name="r_CALL_procedure-nested-calls"></a>

Amazon Redshift 預存程序支援巢狀和遞迴呼叫。允許的巢狀層級數目上限為 16。巢狀呼叫可以將商業邏輯封裝成較小的程序，供多個發起人共用。

如果您呼叫的巢狀程序有輸出參數，則內部程序必須定義 INOUT 引數。在此情況下，非常數變數會傳入內部程序中。不允許 OUT 引數。發生此行為是因為需要變數來保留內部呼叫的輸出。

內層和外層程序的關係記錄在 [SVL\$1STORED\$1PROC\$1CALL](r_SVL_STORED_PROC_CALL.md) 的 `from_sp_call` 欄。

下列範例顯示透過 INOUT 引數將變數傳給巢狀程序。

```
CREATE OR REPLACE PROCEDURE inner_proc(INOUT a int, b int, INOUT c int) LANGUAGE plpgsql
AS $$
BEGIN
  a := b * a;
  c := b * c;
END;
$$;

CREATE OR REPLACE PROCEDURE outer_proc(multiplier int) LANGUAGE plpgsql
AS $$
DECLARE
  x int := 3;
  y int := 4;
BEGIN
  DROP TABLE IF EXISTS test_tbl;
  CREATE TEMP TABLE test_tbl(a int, b varchar(256));
  CALL inner_proc(x, multiplier, y);
  insert into test_tbl values (x, y::varchar);
END;
$$;

CALL outer_proc(5);

SELECT * from test_tbl;
 a  | b
----+----
 15 | 20
(1 row)
```

### 驅動程式支援
<a name="r_CALL_procedure-driver-support"></a>

建議您將 Java 資料庫連線 (JDBC) 和開放式資料庫連線 (ODBC) 驅動程式升級到支援 Amazon Redshift 預存程序的最新版本。

如果您的用戶端工具使用驅動程式 API 操作將 CALL 陳述式傳遞到伺服器，您或許能夠使用現有的驅動程式。傳回的輸出參數 (若有) 是一列的結果集。

最新版本的 Amazon Redshift JDBC 和 ODBC 驅動程式對於預存程序探索，支援中繼資料。對於自訂 Java 應用程式。還支援 `CallableStatement`。如需驅動程式的相關資訊，請參閱《Amazon Redshift 管理指南》**中的[使用 SQL 用戶端工具連線至 Amazon Redshift 叢集](https://docs.aws.amazon.com/redshift/latest/mgmt/connecting-to-cluster.html)。

下列範例顯示如何在預存程序呼叫中使用 JDBC 驅動程式的不同 API 操作。

```
void statement_example(Connection conn) throws SQLException {
  statement.execute("CALL sp_statement_example(1)");
}

void prepared_statement_example(Connection conn) throws SQLException {
  String sql = "CALL sp_prepared_statement_example(42, 84)";
  PreparedStatement pstmt = conn.prepareStatement(sql);
  pstmt.execute();
}

void callable_statement_example(Connection conn) throws SQLException {
  CallableStatement cstmt = conn.prepareCall("CALL sp_create_out_in(?,?)");
  cstmt.registerOutParameter(1, java.sql.Types.INTEGER);
  cstmt.setInt(2, 42);
  cstmt.executeQuery();
  Integer out_value = cstmt.getInt(1);
}
```

## 範例
<a name="r_CALL_procedure-examples"></a>

下列範例呼叫程序名稱 `test_spl`。

```
call test_sp1(3,'book');
INFO:  Table "tmp_tbl" does not exist and will be skipped
INFO:  min_val = 3, f2 = book
```

下列範例呼叫程序名稱 `test_spl2`。

```
call test_sp2(2,'2019');

         f2          | column2
---------------------+---------
 2019+2019+2019+2019 | 2
(1 row)
```

# 取消
<a name="r_CANCEL"></a>

取消目前正在執行的資料庫查詢。

CANCEL 命令需要執行中查詢的程序 ID 或工作階段 ID，並顯示確認訊息以確認查詢已取消。

## 所需權限
<a name="r_CANCEL-privileges"></a>

以下是 CANCEL 所需的權限：
+ 超級使用者取消自己的查詢
+ 超級使用者取消使用者的查詢
+ 具有 CANCEL 權限的使用者取消使用者的查詢
+ 使用者取消自己的查詢

## 語法
<a name="r_CANCEL-synopsis"></a>

```
CANCEL process_id [ 'message' ]
```

## Parameters
<a name="r_CANCEL-parameters"></a>

 *process\$1id*   
若要取消 Amazon Redshift 叢集中執行的查詢，請使用 [STV\$1RECENTS](r_STV_RECENTS.md) 中對應至您要取消之查詢的 `pid` (程序 ID)。  
若要取消 Amazon Redshift Serverless 工作群組中執行的查詢，請使用 [SYS\$1QUERY\$1HISTORY](SYS_QUERY_HISTORY.md) 中對應至您要取消之查詢的 `session_id`。

'*message*'  
選用的確認訊息，會在查詢取消完成時顯示。如果您未指定訊息，Amazon Redshift 會顯示預設訊息進行驗證。您必須將訊息用單引號括住。

## 使用須知
<a name="r_CANCEL-usage-notes"></a>

您無法藉由指定*查詢 ID* 的方式取消查詢；您必須指定查詢的*程序 ID* (PID) 或*工作階段 ID*。您只能取消目前由您的使用者執行的查詢。超級使用者可以取消所有查詢。

如果多個工作階段中的查詢在同一個資料表上保留鎖定，您可以使用 [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) 函數終止其中一個工作階段。這麼做可強制終止的工作階段中任何目前執行中的交易釋出所有鎖定和復原交易。若要檢視目前的鎖定情形，可查詢 [STV\$1LOCKS](r_STV_LOCKS.md) 系統資料表。

在特定內部事件後，Amazon Redshift 可能會重新啟動作用中工作階段並指派新的 PID。如果 PID 已變更，您可能會收到下列錯誤訊息。

```
Session <PID> does not exist. The session PID might have changed. Check the stl_restarted_sessions system table for details.
```

若要尋找新的 PID，請查詢 [STL\$1RESTARTED\$1SESSIONS](r_STL_RESTARTED_SESSIONS.md) 系統資料表並依 `oldpid` 資料欄篩選。

```
select oldpid, newpid from stl_restarted_sessions where oldpid = 1234;
```

## 範例
<a name="r_CANCEL-examples"></a>

若要取消 Amazon Redshift 叢集中目前執行的查詢，請先擷取您要取消之查詢的程序 ID。若要判斷所有目前執行中查詢的處理程序 ID，請輸入下列命令：

```
select pid, starttime, duration,
trim(user_name) as user,
trim (query) as querytxt
from stv_recents
where status = 'Running';

pid |         starttime          | duration |   user   |    querytxt
-----+----------------------------+----------+----------+-----------------
802 | 2008-10-14 09:19:03.550885 |      132 | dwuser | select
venuename from venue where venuestate='FL', where venuecity not in
('Miami' , 'Orlando');
834 | 2008-10-14 08:33:49.473585 |  1250414 | dwuser | select *
from listing;
964 | 2008-10-14 08:30:43.290527 |   326179 | dwuser | select
sellerid from sales where qtysold in (8, 10);
```

查看查詢文字，以判斷哪一個處理程序 ID (PID) 對應到您要取消的查詢。

輸入下列命令，以使用 PID 802 取消該查詢：

```
cancel 802;
```

查詢執行所在的工作階段會顯示以下訊息：

```
ERROR:  Query (168) cancelled on user's request
```

其中 `168` 是查詢 ID (不是用來取消查詢的處理程序 ID)。

或者，您可以指定顯示自訂確認訊息來取代預設訊息。如要指定自訂訊息，請在 CANCEL 命令的結尾以單引號括住您的訊息：

```
cancel 802 'Long-running query';
```

查詢執行所在的工作階段會顯示以下訊息：

```
ERROR:  Long-running query
```

# CLOSE
<a name="close"></a>

(選用) 關閉所有與開啟游標相關的可用資源。[COMMIT](r_COMMIT.md)、[結束](r_END.md) 和 [ROLLBACK](r_ROLLBACK.md) 會自動關閉游標，因此不需要使用 CLOSE 命令明確關閉游標。

如需詳細資訊，請參閱 [DECLARE](declare.md)、[FETCH](fetch.md)。

## 語法
<a name="close-synopsis"></a>

```
CLOSE cursor
```

## Parameters
<a name="close-parameters"></a>

*cursor*   
要關閉的游標名稱。

## CLOSE 範例
<a name="close-example"></a>

以下命令會關閉游標並執行遞交，進而結束交易：

```
close movie_cursor;
commit;
```

# COMMENT
<a name="r_COMMENT"></a>

建立或變更有關資料庫物件的註解。

## 語法
<a name="r_COMMENT-synopsis"></a>

```
COMMENT ON
{
TABLE object_name |
COLUMN object_name.column_name |
CONSTRAINT constraint_name ON table_name |
DATABASE object_name |
VIEW object_name
}
IS 'text' | NULL
```

## Parameters
<a name="r_COMMENT-parameters"></a>

 *object\$1name*   
要加上註解之資料庫物件的名稱。您可以新增註解至下列物件：  
+ TABLE
+ COLUMN (也會取用 *column\$1name*)。
+ CONSTRAINT (也會取用 *constraint\$1name* 和 *table\$1name*)。
+ DATABASE
+ VIEW
+ 結構描述

IS '*text*' \$1 NULL  
您要對指定物件新增或取代的註解文字。*文字*字串是 TEXT 資料類型。以單引號括住註解。將值設定為 NULL 可移除註解文字。

 *column\$1name*   
要加上註解之資料欄的名稱。COLUMN 的參數。接在 `object_name` 中指定的資料表後面。

 *constraint\$1name*   
要加上註解之限制條件的名稱。CONSTRAINT 的參數。

 *table\$1name*   
包含限制條件的資料表名稱。CONSTRAINT 的參數。

## 使用須知
<a name="r_COMMENT-usage-notes"></a>

您必須是超級使用者或資料庫物件的擁有者，才能新增或更新註解。

資料庫的註解僅適用於目前資料庫。如果您嘗試對不同資料庫加上註解，則會顯示警告訊息。對不存在的資料庫加上註解時，也會顯示同樣的警告。

不支援對外部資料表、外部欄和近期繫結檢視欄的註解。

## 範例
<a name="r_COMMENT-example"></a>

下列範例會將註解新增至 SALES 資料表。

```
COMMENT ON TABLE sales IS 'This table stores tickets sales data';
```

下列範例會在 SALES 資料表上顯示註解。

```
select obj_description('public.sales'::regclass);

obj_description
-------------------------------------
This table stores tickets sales data
```

下列範例會從 SALES 資料表中移除註解。

```
COMMENT ON TABLE sales IS NULL;
```

下列範例會將註解新增至 SALES 資料表的 EVENTID 資料欄。

```
COMMENT ON COLUMN sales.eventid IS 'Foreign-key reference to the EVENT table.';
```

下列範例會在 SALES 資料表的 EVENTID 資料欄 (資料欄編號 5) 上顯示註解。

```
select col_description( 'public.sales'::regclass, 5::integer );

col_description
-----------------------------------------
Foreign-key reference to the EVENT table.
```

下列範例會將描述性註解新增至 EVENT 資料表。

```
comment on table event is 'Contains listings of individual events.';
```

若要檢視註解，請查詢 PG\$1DESCRIPTION 系統目錄。以下範例會傳回 EVENT 資料表的描述。

```
select * from pg_catalog.pg_description
where objoid =
(select oid from pg_class where relname = 'event'
and relnamespace =
(select oid from pg_catalog.pg_namespace where nspname = 'public') );

objoid | classoid | objsubid | description
-------+----------+----------+----------------------------------------
116658 |     1259 |        0 | Contains listings of individual events.
```

# COMMIT
<a name="r_COMMIT"></a>

將目前交易遞交至資料庫。此命令會使交易的資料庫更新變成永久有效。

## 語法
<a name="r_COMMIT-synopsis"></a>

```
COMMIT [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_COMMIT-parameters"></a>

WORK  
選用的關鍵字。預存程序內不支援使用此關鍵字。

TRANSACTION  
選用的關鍵字。WORK 和 TRANSACTION 為同義詞，預存程序內不支援使用這兩個關鍵字。

如需在預存程序內使用 COMMIT 的相關資訊，請參閱[管理交易](stored-procedure-transaction-management.md)。

## 範例
<a name="r_COMMIT-examples"></a>

以下每個範例都會將目前交易遞交至資料庫：

```
commit;
```

```
commit work;
```

```
commit transaction;
```

# COPY
<a name="r_COPY"></a>


|  | 
| --- |
| 自 2025 年 4 月 30 日起，COPY 和 UNLOAD 命令的用戶端加密將不再開放給新客戶使用。如果您在 2025 年 4 月 30 日之前的 12 個月內使用用戶端加密搭配 COPY 和 UNLOAD 命令，您可以繼續使用用戶端加密搭配 COPY 或 UNLOAD 命令，直到 2026 年 4 月 30 日為止。2026 年 4 月 30 日之後，您將無法再針對 COPY 和 UNLOAD 使用用戶端加密。我們建議您盡快針對 COPY 和 UNLOAD 改用伺服器端加密。如果您已針對 COPY 和 UNLOAD 使用伺服器端加密，則不會有任何變更，而且您可以繼續使用，不需更改查詢。如需 COPY 和 UNLOAD 加密的詳細資訊，請參閱下方的 ENCRYPTED 參數。 | 

從資料檔案或 Amazon DynamoDB 資料表，將資料載入資料表。檔案可能位於 Amazon Simple Storage Service (Amazon S3) 儲存貯體、Amazon EMR 叢集，或使用 Secure Shell (SSH) 連線來存取的遠端主機。

**注意**  
Amazon Redshift Spectrum 外部資料表是唯讀的。您無法 COPY 到外部資料表。

COPY 命令會將新的輸入資料附加到資料表中任何現有的列。

任何來源的單一輸入資料列最大為 4 MB。

**Topics**
+ [所需的許可](#r_COPY-permissions)
+ [COPY 語法](#r_COPY-syntax)
+ [必要參數](#r_COPY-syntax-required-parameters)
+ [選用的參數](#r_COPY-syntax-overview-optional-parameters)
+ [COPY 命令的使用注意事項和其他資源](#r_COPY-using-the-copy-command)
+ [COPY 命令範例](#r_COPY-using-the-copy-command-examples)
+ [COPY JOB](r_COPY-JOB.md)
+ [COPY 搭配 範本](r_COPY-WITH-TEMPLATE.md)
+ [COPY 參數參考](r_COPY-parameters.md)
+ [使用須知](r_COPY_usage_notes.md)
+ [COPY 範例](r_COPY_command_examples.md)

## 所需的許可
<a name="r_COPY-permissions"></a>

若要使用 COPY 命令，您必須擁有 Amazon Redshift 資料表的 [INSERT](r_GRANT.md#grant-insert) 權限。

## COPY 語法
<a name="r_COPY-syntax"></a>

```
COPY table-name 
[ column-list ]
FROM data_source
authorization
[ [ FORMAT ] [ AS ] data_format ] 
[ parameter [ argument ] [, ... ] ]
```

您可以只使用三個參數來執行 COPY 操作：資料表名稱、資料來源、存取資料的授權。

Amazon Redshift 延伸 COPY 命令的功能，可讓您從多個資料來源載入多種資料格式的資料、控制資料載入的存取權限、管理資料轉換，以及管理載入操作。

以下各節介紹必要的 COPY 命令參數，並依功能將選用參數分組。其中也會描述每個參數，並解釋如何搭配運用各種選項。您可以利用依字母順序排列的參數清單，直接跳到參數描述。

## 必要參數
<a name="r_COPY-syntax-required-parameters"></a>

COPY 命令需要三個元素：
+ [Table Name](#r_COPY-syntax-overview-table-name)
+ [Data Source](#r_COPY-syntax-overview-data-source)
+ [Authorization](#r_COPY-syntax-overview-credentials)

最簡單的 COPY 命令採用下列格式。

```
COPY table-name 
FROM data-source
authorization;
```

下列範例會建立名為 CATDEMO 的資料表，然後從 Amazon S3 中一個名為 `category_pipe.txt` 的資料檔案，將範例資料載入此資料表。

```
create table catdemo(catid smallint, catgroup varchar(10), catname varchar(10), catdesc varchar(50));
```

在下列範例中，COPY 命令的資料來源是位於名為 `category_pipe.txt` 之 Amazon S3 儲存貯體的 `tickit` 資料夾中，一個名為 `redshift-downloads` 的資料檔案。COPY 命令已獲授權，可透過 AWS Identity and Access Management (IAM) 角色存取 Amazon S3 儲存貯體。如果叢集現有的 IAM 角色已附加 Amazon S3 的存取權，您可以在下列 COPY 命令中換成此角色的 Amazon Resource Name (ARN)，再執行命令。

```
copy catdemo
from 's3://redshift-downloads/tickit/category_pipe.txt'
iam_role 'arn:aws:iam::<aws-account-id>:role/<role-name>'
region 'us-east-1';
```

如需如何使用 COPY 命令載入範例資料的完整指示，包括從其他 AWS 區域載入資料的指示，請參閱《[Amazon Redshift 入門指南》中的從 Amazon S3 載入範例資料](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)。

*table-name*  <a name="r_COPY-syntax-overview-table-name"></a>
COPY 命令的目標資料表名稱。此資料表必須已存在於資料庫中。此資料表可以是暫時性或持久性。COPY 命令會將新的輸入資料附加到資料表中任何現有的資料列。

FROM *data-source*  <a name="r_COPY-syntax-overview-data-source"></a>
在目標資料表中載入之來源資料的位置。資訊清單檔案可與一些資料來源一起指定。  
最常用的資料儲存庫是 Amazon S3 儲存貯體。您也可以從位於 Amazon EMR 叢集、Amazon EC2 執行個體或遠端主機 (叢集可利用 SSH 連線來存取) 的資料檔案載入，或直接從 DynamoDB 資料表載入。  
+ [從 Amazon S3 進行 COPY](copy-parameters-data-source-s3.md)
+ [從 Amazon EMR 進行 COPY](copy-parameters-data-source-emr.md) 
+ [從遠端主機 COPY (SSH)](copy-parameters-data-source-ssh.md)
+ [從 Amazon DynamoDB 進行 COPY](copy-parameters-data-source-dynamodb.md)

Authorization  <a name="r_COPY-syntax-overview-credentials"></a>
子句，指出叢集用於身分驗證和授權存取其他 AWS 資源的方法。COPY 命令需要授權才能存取其他 AWS 資源中的資料，包括 Amazon S3、Amazon EMR、Amazon DynamoDB 和 Amazon EC2。您可以參考叢集附加的 IAM 角色，或將存取金鑰 ID 和私密存取金鑰提供給 IAM 使用者，以提供該授權。  
+ [授權參數](copy-parameters-authorization.md) 
+ [角色類型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based) 
+ [金鑰型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based) 

## 選用的參數
<a name="r_COPY-syntax-overview-optional-parameters"></a>

您可以選擇指定 COPY 如何將欄位資料映射至目標資料表中的欄、定義來源資料屬性讓 COPY 命令正確讀取和剖析來源資料，以及管理 COPY 命令在載入過程中執行哪些操作。
+ [欄映射選項](copy-parameters-column-mapping.md)
+ [資料格式參數](#r_COPY-syntax-overview-data-format)
+ [資料轉換參數](#r_COPY-syntax-overview-data-conversion)
+ [資料載入操作](#r_COPY-syntax-overview-data-load)

### 欄映射
<a name="r_COPY-syntax-overview-column-mapping"></a>

根據預設，COPY 會依欄位在資料檔案中出現的同樣順序，將欄位值插入目標資料表的欄。如果預設欄順序不適用，您可以指定欄清單或使用 JSONPath 表達式，將來源資料欄位映射至目標欄。
+ [Column List](copy-parameters-column-mapping.md#copy-column-list)
+ [JSONPaths File](copy-parameters-column-mapping.md#copy-column-mapping-jsonpaths)

### 資料格式參數
<a name="r_COPY-syntax-overview-data-format"></a>

您可以從固定寬度、字元分隔、逗號分隔值 (CSV) 或 JSON 格式的文字檔案，或從 Avro 檔案載入資料。

根據預設，COPY 命令預期來源資料是位於字元分隔的 UTF-8 文字檔案中。預設分隔符號是縱線字元 ( \$1 )。如果來源資料是其他格式，請使用下列參數來指定資料格式。
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter) 
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth) 
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile) 
+ [AVRO](copy-parameters-data-format.md#copy-avro) 
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json) 
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [GZIP](copy-parameters-file-compression.md#copy-gzip) 
+ [LZOP](copy-parameters-file-compression.md#copy-lzop) 
+ [PARQUET](copy-parameters-data-format.md#copy-parquet) 
+ [ORC](copy-parameters-data-format.md#copy-orc) 
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd) 

### 資料轉換參數
<a name="r_COPY-syntax-overview-data-conversion"></a>

COPY 載入資料表時會嘗試隱含地將來源資料中的字串轉換為目標欄的資料類型。如果您需要指定不同於預設行為的轉換，或預設轉換造成錯誤，您可以指定下列參數來管理資料轉換。
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars) 
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding) 
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape) 
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids) 
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord) 
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines) 
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader) 
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as) 
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes) 
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 

### 資料載入操作
<a name="r_COPY-syntax-overview-data-load"></a>

指定下列參數來管理載入操作的預設行為，以進行故障排除或縮短載入時間。
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows) 
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate) 
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors) 
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror) 
+ [NOLOAD](copy-parameters-data-load.md#copy-noload) 
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate) 

## COPY 命令的使用注意事項和其他資源
<a name="r_COPY-using-the-copy-command"></a>

如需如何使用 COPY 命令的相關資訊，請參閱下列主題：
+ [使用須知](r_COPY_usage_notes.md)
+ [教學課程：從 Amazon S3 載入資料](tutorial-loading-data.md)
+ [載入資料的 Amazon Redshift 最佳實務](c_loading-data-best-practices.md)
+ [使用 COPY 命令載入資料表](t_Loading_tables_with_the_COPY_command.md)
  + [從 Amazon S3 載入資料](t_Loading-data-from-S3.md)
  + [從 Amazon EMR 載入資料](loading-data-from-emr.md)
  + [從遠端主機載入資料](loading-data-from-remote-hosts.md) 
  + [從 Amazon DynamoDB 資料表載入資料](t_Loading-data-from-dynamodb.md)
+ [針對資料載入進行故障診斷](t_Troubleshooting_load_errors.md)

## COPY 命令範例
<a name="r_COPY-using-the-copy-command-examples"></a>

如需顯示如何從不同來源、不同格式和不同 COPY 選項進行 COPY 的更多範例，請參閱[COPY 範例](r_COPY_command_examples.md)。

# COPY JOB
<a name="r_COPY-JOB"></a>

如需使用此命令的相關資訊，請參閱 [建立 S3 事件整合，以自動從 Amazon S3 儲存貯體複製檔案](loading-data-copy-job.md)。

管理將資料載入資料表的 COPY 命令。COPY JOB 命令是 COPY 命令的擴充功能，可自動從 Amazon S3 儲存貯體載入資料。當您建立 COPY 任務時，Amazon Redshift 會偵測何時在指定路徑中建立新的 Amazon S3 檔案，然後自動載入這些檔案，而無需您介入。載入資料時，會使用原始 COPY 命令中使用的相同參數。Amazon Redshift 會追蹤載入的檔案 (根據檔案名稱)，以確認檔案只載入一次。

**注意**  
如需 COPY 命令的相關資訊，包括用法、參數和許可，請參閱[COPY](r_COPY.md)。

## 所需的許可
<a name="r_COPY-JOB-privileges"></a>

若要使用 COPY JOB 命令，除了使用 COPY 的所有必要許可之外，您還必須擁有下列其中一項許可：
+ 超級使用者
+  下列全部：
  +  您要執行 COPY 之資料庫中 COPY JOBS 的相關 CREATE、ALTER 或 DROP 限定範圍許可。
  +  您要執行 COPY 之結構描述的 USAGE 許可，或您要執行 COPY 之資料庫中結構描述的 USAGE 限定範圍許可。
  +  您要執行 COPY 之資料表的 INSERT 許可，或您要執行 COPY 之結構描述或資料庫中資料表的 INSERT 限定範圍許可。

使用 COPY 命令指定的 IAM 角色必須具有存取要載入之資料的許可。如需詳細資訊，請參閱[COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)。

## 語法
<a name="r_COPY-JOB-syntax"></a>

建立複製任務。COPY 命令的參數會與複製任務一起儲存。

您無法在交易區塊的範圍內執行 COPY JOB CREATE。

```
COPY copy-command JOB CREATE job-name
[AUTO ON | OFF]
```

變更複製任務的組態。

```
COPY JOB ALTER job-name
[AUTO ON | OFF]
```

執行複製任務。會使用儲存的 COPY 命令參數。

```
COPY JOB RUN job-name
```

列出所有複製任務。

```
COPY JOB LIST
```

顯示複製任務的詳細資訊。

```
COPY JOB SHOW job-name
```

刪除複製任務。

您無法在交易區塊的範圍內執行 COPY JOB DROP。

```
COPY JOB DROP job-name
```

## Parameters
<a name="r_COPY-JOB-parameters"></a>

*copy-command*  
將資料從 Amazon S3 載入到 Amazon Redshift 的 COPY 命令。該子句包含 COPY 參數，用於定義 Amazon S3 儲存貯體、目標資料表、IAM 角色和載入資料時使用的其他參數。支援 Amazon S3 資料載入的所有 COPY 命令參數，但以下參數除外：  
+ COPY JOB 不會將預先存在的資料夾內擷取 COPY 命令所指向的檔案。只有在 COPY JOB 建立時間戳記之後建立的檔案才會被擷取。
+ 您無法使用 MAXERROR 或 IGNOREALLERRORS 選項來指定 COPY 命令。
+ 您不能指定資訊清單檔案。COPY JOB 需要指定的 Amazon S3 位置來監控新建立的檔案。
+ 您不能指定具有存取金鑰和私密金鑰等授權類型的 COPY 命令。僅支援使用 `IAM_ROLE` 參數進行授權的 COPY 命令。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。
+ COPY JOB 不支援與叢集相關聯的預設 IAM 角色。您必須在 COPY 命令中指定 `IAM_ROLE`。
如需詳細資訊，請參閱[從 Amazon S3 進行 COPY](copy-parameters-data-source-s3.md)。

*job-name*  
用來參考 COPY 任務之任務的名稱。*job-name* 不可包含連字號 (-)。

 [AUTO ON \$1 OFF]   
指出是否將 Amazon S3 資料自動載入 Amazon Redshift 資料表的子句。  
+ `ON` 時，Amazon Redshift 會監控新建立檔案的來源 Amazon S3 路徑，如果找到，則會使用任務定義中的 COPY 參數執行 COPY 命令。這是預設值。
+ `OFF` 時，Amazon Redshift 不會自動執行 COPY JOB。

## 使用須知
<a name="r_COPY-JOB-usage-notes"></a>

COPY 命令的選項直到執行時間才驗證。例如，COPY JOB 開始時，無效的 `IAM_ROLE` 或 Amazon S3 資料來源會導致執行期錯誤。

如果叢集已暫停，則不會執行 COPY JOBS。

若要查詢載入的 COPY 命令檔案和載入錯誤，請參閱 [STL\$1LOAD\$1COMMITS](r_STL_LOAD_COMMITS.md)、[STL\$1LOAD\$1ERRORS](r_STL_LOAD_ERRORS.md)、[STL\$1LOADERROR\$1DETAIL](r_STL_LOADERROR_DETAIL.md)。如需詳細資訊，請參閱[驗證資料已正確載入](verifying-that-data-loaded-correctly.md)。

零 ETL 資料庫不支援 COPY JOBS，因為它們以唯讀模式運作。

## 範例
<a name="r_COPY-JOB-examples"></a>

下列範例示範建立 COPY JOB，以從 Amazon S3 儲存貯體載入資料。

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName' 
JOB CREATE my_copy_job_name
AUTO ON;
```

# COPY 搭配 範本
<a name="r_COPY-WITH-TEMPLATE"></a>

您可以使用 Redshift 範本搭配 COPY 命令來簡化命令語法，並確保資料載入操作之間的一致性。您不需要重複指定相同的格式參數，而是在範本中定義一次參數，並在 COPY 命令中參考範本。當您使用範本時，COPY 命令會將範本中的參數與直接在命令中指定的任何參數結合。如果相同的參數同時出現在範本和命令中，則命令參數優先。如需詳細資訊，請參閱[建立 範本](r_CREATE_TEMPLATE.md)。

COPY 命令的範本可以使用下列項目建立：
+ [資料格式參數](copy-parameters-data-format.md)
+ [檔案壓縮參數](copy-parameters-file-compression.md)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)

如需支援參數的完整清單，請參閱 [COPY](r_COPY.md)命令。

## 所需的許可
<a name="r_COPY-WITH-TEMPLATE-privileges"></a>

若要在 COPY 命令中使用範本，您必須具有：
+ 執行 COPY 命令所需的所有必要許可 （請參閱 [所需的許可](r_COPY.md#r_COPY-permissions) )
+ 下列其中一個範本許可：
  + 超級使用者權限
  + 範本上的 USAGE 權限和包含範本之結構描述上的 USAGE 權限

## 語法
<a name="r_COPY-WITH-TEMPLATE-syntax"></a>

```
COPY target_table FROM 's3://...'
authorization
[ option, ...]
USING TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_COPY-WITH-TEMPLATE-parameters"></a>

 *database\$1name*   
（選用） 範本存在的資料庫名稱。如果未指定，則會使用目前的資料庫。

 *schema\$1name*   
（選用） 範本所在的結構描述名稱。如果未指定，則會在目前的搜尋路徑中搜尋範本。

 *template\$1name*   
要在 COPY 中使用的範本名稱。

## 使用須知
<a name="r_COPY-WITH_TEMPLATE-usage-notes"></a>
+ 命令特定的參數 （來源、目的地、授權） 仍必須在 COPY 命令中指定。
+ 範本不能包含 COPY 命令的資訊清單檔案規格。

## 範例
<a name="r_COPY-WITH-TEMPLATE-examples"></a>

下列範例示範如何建立範本，並在 COPY 命令中使用範本：

```
CREATE TEMPLATE public.test_template FOR COPY AS
CSV DELIMITER '|' IGNOREHEADER 1 MAXERROR 100;

COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
USING TEMPLATE public.test_template;
```

當範本和命令中都存在參數時，命令參數優先。在此範例中，如果範本`public.test_template`包含 ，`DELIMITER '|'`但 COPY 命令指定 `DELIMITER ','`，則會使用命令中的逗號分隔符號 (`,`)，而不是範本中的管道分隔符號 (`|`)。

```
COPY public.target_table
FROM 's3://amzn-s3-demo-bucket/staging-folder'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyLoadRoleName'
DELIMITER ','
USING TEMPLATE public.test_template;
```

# COPY 參數參考
<a name="r_COPY-parameters"></a>

COPY 具有許多參數，可以在許多情況下使用。但是，並非每種情況都支援所有參數。例如，若要從 ORC 或 PARQUET 檔案載入，支援的參數數目有限。如需詳細資訊，請參閱[從單欄資料格式 COPY](copy-usage_notes-copy-from-columnar.md)。

**Topics**
+ [資料來源](copy-parameters-data-source.md)
+ [授權參數](copy-parameters-authorization.md)
+ [欄映射選項](copy-parameters-column-mapping.md)
+ [資料格式參數](copy-parameters-data-format.md)
+ [檔案壓縮參數](copy-parameters-file-compression.md)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)
+ [依字母排序的參數清單](r_COPY-alphabetical-parm-list.md)

# 資料來源
<a name="copy-parameters-data-source"></a>

您可以從位於 Amazon S3 儲存貯體、Amazon EMR 叢集或遠端主機 (叢集可利用 SSH 連線來存取) 的文字檔案來載入資料。您也可以直接從 DynamoDB 資料表載入資料。

任何來源的單一輸入資料列最大為 4 MB。

若要將資料表中的資料匯出至 Amazon S3 中的一組檔案，請使用 [UNLOAD](r_UNLOAD.md) 命令。

**Topics**
+ [從 Amazon S3 進行 COPY](copy-parameters-data-source-s3.md)
+ [從 Amazon EMR 進行 COPY](copy-parameters-data-source-emr.md)
+ [從遠端主機 COPY (SSH)](copy-parameters-data-source-ssh.md)
+ [從 Amazon DynamoDB 進行 COPY](copy-parameters-data-source-dynamodb.md)

# 從 Amazon S3 進行 COPY
<a name="copy-parameters-data-source-s3"></a>

若要從位於一或多個 S3 儲存貯體的檔案載入資料，請使用 FROM 子句來指出 COPY 如何尋找 Amazon S3 中的檔案。您可以在 FROM 子句中提供資料檔案的物件路徑，或提供資訊清單檔案 (包含 Amazon S3 物件路徑清單) 的位置。來自 Amazon S3 的 COPY 會使用 HTTPS 連線。確定 S3 IP 範圍已新增至您的允許清單。若要進一步了解所需的 S3 IP 範圍，請參閱[網路隔離](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)。

**重要**  
如果存放資料檔案的 Amazon S3 儲存貯體不在與叢集相同的 AWS 區域中，您必須使用 [REGION](#copy-region) 參數來指定資料所在的區域。

**Topics**
+ [語法](#copy-parameters-data-source-s3-syntax)
+ [範例](#copy-parameters-data-source-s3-examples)
+ [選用的參數](#copy-parameters-data-source-s3-optional-parms)
+ [不支援的參數](#copy-parameters-data-source-s3-unsupported-parms)

## 語法
<a name="copy-parameters-data-source-s3-syntax"></a>

```
FROM { 's3://objectpath' | 's3://manifest_file' }
authorization
| MANIFEST
| ENCRYPTED
| REGION [AS] 'aws-region'
| optional-parameters
```

## 範例
<a name="copy-parameters-data-source-s3-examples"></a>

下列範例使用物件路徑以從 Amazon S3 載入資料。

```
copy customer
from 's3://amzn-s3-demo-bucket/customer' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

下列範例使用資訊清單檔案以從 Amazon S3 載入資料。

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

### Parameters
<a name="copy-parameters-data-source-s3-parameters"></a>

FROM  <a name="copy-parameters-from"></a>
載入的資料來源。如需 Amazon S3 檔案編碼的相關資訊，請參閱[資料轉換參數](copy-parameters-data-conversion.md)。

's3://*copy\$1from\$1s3\$1objectpath*'  <a name="copy-s3-objectpath"></a>
指定含有資料之 Amazon S3 物件的路徑 Amazon S3 - 例如 `'s3://amzn-s3-demo-bucket/custdata.txt'`。*s3://copy\$1from\$1s3\$1objectpath* 參數可以參考單一檔案，或一組有相同金鑰前綴的物件或資料夾。例如，`custdata.txt` 這個名稱是參考一些實體檔案的金鑰前綴：`custdata.txt`、`custdata.txt.1`、`custdata.txt.2`、`custdata.txt.bak` 等。金鑰前綴也可以參考一些資料夾。例如，`'s3://amzn-s3-demo-bucket/custfolder'` 參考資料夾 `custfolder`、`custfolder_1`、`custfolder_2` 等。如果金鑰前綴參考多個資料夾，則會載入這些資料夾中的所有檔案。如果金鑰前綴符合檔案又符合資料夾，例如 `custfolder.log`，COPY 也會嘗試載入此檔案。如果金鑰前綴可能導致 COPY 嘗試載入不需要的檔案，請使用資訊清單檔案。如需詳細資訊，請參閱下列 [copy_from_s3_manifest_file](#copy-manifest-file)。  
如果存放資料檔案的 S3 儲存貯體不是位於與叢集相同的 AWS 區域，您必須使用 [REGION](#copy-region) 參數來指定資料所在的區域。
如需詳細資訊，請參閱[從 Amazon S3 載入資料](t_Loading-data-from-S3.md)。

's3://*copy\$1from\$1s3\$1manifest\$1file*'  <a name="copy-manifest-file"></a>
指定資訊清單檔案 (列出要載入的資料檔案) 的 Amazon S3 物件金鑰。*'s3://*copy\$1from\$1s3\$1manifest\$1file'** 引數必須明確參考單一檔案 - 例如 `'s3://amzn-s3-demo-bucket/manifest.txt'`。無法參考金鑰前綴。  
清單檔案是 JSON 格式的文字檔案，其中列出要從 Amazon S3 載入之每個檔案的 URL。URL 包含檔案的儲存貯體名稱和完整物件路徑。資訊清單中指定的檔案可以位於不同的儲存貯體，但所有儲存貯體都必須位於與 Amazon Redshift 叢集相同的 AWS 區域。如果某個檔案列出兩次，則該檔案會載入兩次。下列範例顯示資訊清單的 JSON，此資訊清單會載入三個檔案。  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1","mandatory":false}
  ]
}
```
雙引號字元是必要的，且必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。資訊清單中的每個項目可以選擇性包含 `mandatory` 旗標。如果 `mandatory` 設為 `true`，COPY 找不到該項目的檔案時會終止；否則，COPY 會繼續。`mandatory` 的預設值為 `false`。  
載入格式為 ORC 或 Parquet 的資料檔案時，需要 `meta` 欄位，如下列範例所示。  

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```
即使指定 ENCRYPTED、GZIP、LZOP、BZIP2 或 ZSTD 選項，也不可對資訊清單檔案進行加密或壓縮。如果找不到指定的資訊清單檔案，或資訊清單檔案的格式不正確，COPY 會傳回錯誤。  
如果使用資訊清單檔案，則必須使用 COPY 命令指定 MANIFEST 參數。如果未指定 MANIFEST 參數，COPY 會假設 FROM 指定的檔案是資料檔案。  
如需詳細資訊，請參閱[從 Amazon S3 載入資料](t_Loading-data-from-S3.md)。

*authorization*  
COPY 命令需要取得授權來存取另一個 AWS 資源中 (包括在 Amazon S3、Amazon EMR、Amazon DynamoDB 和 Amazon EC2 中) 的資料。您可以參考連接至叢集的 AWS Identity and Access Management (IAM) 角色 （以角色為基礎的存取控制），或提供使用者的存取憑證 （以金鑰為基礎的存取控制），以提供該授權。為了提高安全性和彈性，建議使用 IAM 角色型存取控制。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。

MANIFEST  <a name="copy-manifest"></a>
指定使用清單檔案來指出要從 Amazon S3 載入的資料檔案。如果使用 MANIFEST 參數，COPY 會從 *'s3://copy\$1from\$1s3\$1manifest\$1file'* 參考的資訊清單中所列的檔案載入資料。如果找不到資訊清單檔案，或此檔案的格式不正確，COPY 會失敗。如需詳細資訊，請參閱[使用資訊清單指定資料檔案](loading-data-files-using-manifest.md)。

ENCRYPTED  <a name="copy-encrypted"></a>
此子句指定 Amazon S3 上的輸入檔案是以用戶端加密搭配客戶管理金鑰來加密。如需詳細資訊，請參閱[從 Amazon S3 載入加密的資料檔案](c_loading-encrypted-files.md)。如果輸入檔案是以 Amazon S3 伺服器端加密 (SSE-KMS 或 SSE-S3) 所加密，請勿指定 ENCRYPTED。COPY 會自動讀取伺服器端加密檔案。  
如果指定 ENCRYPTED 參數，則還必須指定 [MASTER_SYMMETRIC_KEY](#copy-master-symmetric-key) 參數，或在 [使用 CREDENTIALS 參數](copy-parameters-authorization.md#copy-credentials) 字串中包含 **master\$1symmetric\$1key** 值。  
如果加密檔案是壓縮格式，請增加 GZIP、LZOP、BZIP2 或 ZSTD 參數。  
即使指定 ENCRYPTED 選項，也不得對資訊清單檔案和 JSONPaths 檔案進行加密。

MASTER\$1SYMMETRIC\$1KEY '*root\$1key*'  <a name="copy-master-symmetric-key"></a>
用於將 Amazon S3 上的資料檔案加密的根對稱金鑰。如果指定 MASTER\$1SYMMETRIC\$1KEY，則還必須指定 [ENCRYPTED](#copy-encrypted) 參數。MASTER\$1SYMMETRIC\$1KEY 不能與 CREDENTIALS 參數一起使用。如需詳細資訊，請參閱[從 Amazon S3 載入加密的資料檔案](c_loading-encrypted-files.md)。  
如果加密檔案是壓縮格式，請增加 GZIP、LZOP、BZIP2 或 ZSTD 參數。

REGION [AS] '*aws-region*'  <a name="copy-region"></a>
指定來源資料所在的 AWS 區域。當含有資料的 AWS 資源所在區域與 Amazon Redshift 叢集的區域不是同一個區域時，從 Amazon S3 儲存貯體或 DynamoDB 資料表的 COPY 需要 REGION。  
*aws\$1region* 的值必須符合 [Amazon Redshift 區域與端點](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region)資料表所列的區域。  
如果指定 REGION 參數，則所有資源 (包括資訊清單檔案或多個 Amazon S3 儲存貯體) 都必須位於指定的區域。  
跨區域傳輸資料需要為含有資料的 Amazon S3 儲存貯體或 DynamoDB 資料表另外付費。如需定價的詳細資訊，請參閱 **Amazon S3 定價頁面上從 Amazon S3 傳出至其他 AWS 區域的資料傳輸**，以及 [Amazon DynamoDB 定價](https://aws.amazon.com/dynamodb/pricing/)頁面上的 **傳出資料傳輸**。 [Amazon S3 ](https://aws.amazon.com/s3/pricing/) 
根據預設，COPY 會假設資料與 Amazon Redshift 叢集位於相同區域。

## 選用的參數
<a name="copy-parameters-data-source-s3-optional-parms"></a>

從 Amazon S3 COPY 時，您可以選擇性指定下列參數：
+ [欄映射選項](copy-parameters-column-mapping.md)
+ [資料格式參數](copy-parameters-data-format.md#copy-data-format-parameters)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)

## 不支援的參數
<a name="copy-parameters-data-source-s3-unsupported-parms"></a>

從 Amazon S3 COPY 時，您不能使用下列參數：
+ SSH
+ READRATIO

# 從 Amazon EMR 進行 COPY
<a name="copy-parameters-data-source-emr"></a>

您可以使用 COPY 命令從 Amazon EMR 叢集平行載入資料，而該叢集設定為以固定寬度檔案、字元分隔檔案、CSV 檔案、JSON 格式檔案或 Avro 檔案的形式，將文字檔案寫入叢集的 Hadoop 分散式檔案系統 (HDFS)。

**Topics**
+ [語法](#copy-parameters-data-source-emr-syntax)
+ [範例](#copy-parameters-data-source-emr-example)
+ [Parameters](#copy-parameters-data-source-emr-parameters)
+ [支援的參數](#copy-parameters-data-source-emr-optional-parms)
+ [不支援的參數](#copy-parameters-data-source-emr-unsupported-parms)

## 語法
<a name="copy-parameters-data-source-emr-syntax"></a>

```
FROM 'emr://emr_cluster_id/hdfs_filepath'  
authorization
[ optional_parameters ]
```

## 範例
<a name="copy-parameters-data-source-emr-example"></a>

下列範例從 Amazon EMR 叢集載入資料。

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## Parameters
<a name="copy-parameters-data-source-emr-parameters"></a>

FROM  
載入的資料來源。

 'emr://*emr\$1cluster\$1id*/*hdfs\$1file\$1path*'  <a name="copy-emr"></a>
Amazon EMR 叢集的唯一識別碼，以及 HDFS 檔案路徑 (參考 COPY 命令的資料檔案)。HDFS 資料檔案名稱不能包含萬用字元星號 (\$1) 和問號 (?)。  
Amazon EMR 叢集必須一直運作到 COPY 操作完成為止。如果 COPY 操作完成之前有任何 HDFS 資料檔案經變更或遭刪除，可能會發生非預期的結果，COPY 操作也可能失敗。
您可以在 *hdfs\$1file\$1path* 引數中使用萬用字元星號 (\$1) 和問號 (?) 來指定要載入的多個檔案。例如，`'emr://j-SAMPLE2B500FC/myoutput/part*'` 表示檔案 `part-0000`、`part-0001`，以此類推。如果檔案路徑不含萬用字元，則視為字串常值。如果僅指定資料夾名稱，COPY 會嘗試載入該資料夾中的所有檔案。  
如果使用萬用字元或只使用資料夾名稱，請確認不會載入不需要的檔案。例如，某些程序可能將日誌檔案寫入至輸出資料夾。
如需詳細資訊，請參閱[從 Amazon EMR 載入資料](loading-data-from-emr.md)。

*authorization*  
COPY 命令需要取得授權來存取另一個 AWS 資源中 (包括在 Amazon S3、Amazon EMR、Amazon DynamoDB 和 Amazon EC2 中) 的資料。您可以參考連接至叢集的 AWS Identity and Access Management (IAM) 角色 （以角色為基礎的存取控制），或提供使用者的存取憑證 （以金鑰為基礎的存取控制），以提供該授權。為了提高安全性和彈性，建議使用 IAM 角色型存取控制。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。

## 支援的參數
<a name="copy-parameters-data-source-emr-optional-parms"></a>

從 Amazon EMR COPY 時，您可以選擇性指定下列參數：
+ [欄映射選項](copy-parameters-column-mapping.md)
+ [資料格式參數](copy-parameters-data-format.md#copy-data-format-parameters)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)

## 不支援的參數
<a name="copy-parameters-data-source-emr-unsupported-parms"></a>

從 Amazon EMR COPY 時，您不能使用下列參數：
+ ENCRYPTED
+ MANIFEST
+ REGION
+ READRATIO
+ SSH

# 從遠端主機 COPY (SSH)
<a name="copy-parameters-data-source-ssh"></a>

您可以使用 COPY 命令從一或多台遠端主機平行載入資料，例如 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或其他電腦。COPY 會使用 Secure Shell (SSH) 連接至遠端主機，然後在遠端主機執行命令來產生文字輸出。遠端主機可以是 EC2 Linux 執行個體，或另一台設定為接受 SSH 連線的 Unix 或 Linux 電腦。Amazon Redshift 可以連線到多台主機，而且可以對每台主機開啟多個 SSH 連線。Amazon Redshift 會透過每個連線傳送一個唯一的命令，將文字輸出產生到主機的標準輸出，然後 Amazon Redshift 會像讀取文字檔一樣讀取該輸出。

使用 FROM 子句來指定資訊清單檔案的 Amazon S3 物件金鑰，此資訊清單檔案提供讓 COPY 用來開啟 SSH 連線和執行遠端命令的資訊。

**Topics**
+ [語法](#copy-parameters-data-source-ssh-syntax)
+ [範例](#copy-parameters-data-source-ssh-examples)
+ [Parameters](#copy-parameters-data-source-ssh-parameters)
+ [選用的參數](#copy-parameters-data-source-ssh-optional-parms)
+ [不支援的參數](#copy-parameters-data-source-ssh-unsupported-parms)

**重要**  
 如果存放資訊清單檔案的 S3 儲存貯體所在區域與叢集的 AWS 區域不是同一個，您必須使用 REGION 參數來指定儲存貯體所在的區域。

## 語法
<a name="copy-parameters-data-source-ssh-syntax"></a>

```
FROM 's3://'ssh_manifest_file' }
authorization
SSH
| optional-parameters
```

## 範例
<a name="copy-parameters-data-source-ssh-examples"></a>

下列範例使用資訊清單檔案，以利用 SSH 從遠端主機載入資料。

```
copy sales
from 's3://amzn-s3-demo-bucket/ssh_manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
ssh;
```

## Parameters
<a name="copy-parameters-data-source-ssh-parameters"></a>

FROM  
載入的資料來源。

's3://*copy\$1from\$1ssh\$1manifest\$1file*'  <a name="copy-ssh-manifest"></a>
COPY 命令可以使用 SSH 來連接至多台主機，也可以對每台主機建立多個 SSH 連線。COPY 會透過每個主機連線執行命令，然後將命令的輸出平行載入資料表。*s3://copy\$1from\$1ssh\$1manifest\$1file* 引數會指定資訊清單檔案的 Amazon S3 物件金鑰，此清單檔案會提供讓 COPY 用來開啟 SSH 連線和執行遠端命令的資訊。  
*s3://copy\$1from\$1ssh\$1manifest\$1file* 引數必須明確參考單一檔案；不能是金鑰字首。如下列範例所示：  

```
's3://amzn-s3-demo-bucket/ssh_manifest.txt'
```
資訊清單檔案是 JSON 格式的文字檔案，供 Amazon Redshift 用來連接至主機。資訊清單檔案指定 SSH 主機端點，以及要在主機上執行以將資料傳回給 Amazon Redshift 的命令。您可以選擇在每個項目中包含主機公有金鑰、登入使用者名稱及 mandatory 旗標。下列範例顯示的資訊清單檔案會建立兩個 SSH 連線：  

```
{ 
    "entries": [ 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"}, 
	    {"endpoint":"<ssh_endpoint_or_IP>", 
           "command": "<remote_command>",
           "mandatory":true, 
           "publickey": "<public_key>", 
           "username": "<host_user_name>"} 
     ] 
}
```
資訊清單檔案包含一個 `"entries"` 結構來含括每個 SSH 連線。您可以對單一主機建立多個連線，也可以對多台主機建立多個連線。如圖所示，欄位名稱和值都需要雙引號字元。引號字元必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。唯一不需要雙引號字元的值是 `"mandatory"` 欄位的布林值 `true` 或 `false`。  
下列清單描述資訊清單檔案中的欄位。    
端點  <a name="copy-ssh-manifest-endpoint"></a>
主機的 URL 地址或 IP 地址，例如 `"ec2-111-222-333.compute-1.amazonaws.com"` 或 `"198.51.100.0"`。  
command  <a name="copy-ssh-manifest-command"></a>
主機執行的命令，會產生文字輸出或 gzip、lzop、bzip2 或 zstd 格式的二進位輸出。命令可以是使用者 *"host\$1user\$1name"* 有許可執行的任何命令。命令可能像是列印檔案這麼簡單，也可能是查詢資料庫或啟動指令碼。輸出 (文字檔案、gzip 二進位檔案、lzop 二進位檔案，或 bzip2 二進位檔案) 必須是 Amazon Redshift COPY 命令可擷取的格式。如需詳細資訊，請參閱[準備您的輸入資料](t_preparing-input-data.md)。  
publickey  <a name="copy-ssh-manifest-publickey"></a>
(選用) 主機的公有金鑰。如果提供，Amazon Redshift 會使用公有金鑰來識別主機。如果未提供公有金鑰，Amazon Redshift 不會嘗試識別主機。例如，若遠端主機的公有金鑰是 `ssh-rsa AbcCbaxxx…Example root@amazon.com`，請在公有金鑰欄位中輸入下列文字：`"AbcCbaxxx…Example"`  
mandatory  <a name="copy-ssh-manifest-mandatory"></a>
(選用) 此子句指出如果嘗試連線失敗，COPY 命令是否就應該失敗。預設值為 `false`。如果 Amazon Redshift 未成功建立至少一個連線，則 COPY 命令會失敗。  
使用者名稱  <a name="copy-ssh-manifest-username"></a>
(選用) 用來登入主機系統並執行遠端命令的使用者名稱。使用者登入名稱與用來將 Amazon Redshift 叢集公有金鑰新增至主機授權金鑰檔案的登入必須相同。預設使用者名稱為 `redshift`。
如需建立資訊清單檔案的相關資訊，請參閱[載入資料程序](loading-data-from-remote-hosts.md#load-from-host-process)。  
若要從遠端主機進行 COPY，則必須使用 COPY 命令指定 SSH 參數。如果未指定 SSH 參數，COPY 會假設 FROM 指定的檔案是資料檔案，而且將會失敗。  
如果您使用自動壓縮，COPY 命令會執行兩次資料讀取操作，也就是會執行遠端命令兩次。第一次讀取操作會提供資料樣本進行壓縮分析，第二次讀取操作就會實際載入資料。如果遠端命令的兩次執行可能造成問題，請停用自動壓縮。若要停用自動壓縮，請在執行 COPY 命令時將 COMPUPDATE 參數設為 OFF。如需詳細資訊，請參閱[利用自動壓縮載入資料表](c_Loading_tables_auto_compress.md)。  
關於使用從 SSH COPY 的詳細程序，請參閱[從遠端主機載入資料](loading-data-from-remote-hosts.md)。

*authorization*  
COPY 命令需要取得授權來存取另一個 AWS 資源中 (包括在 Amazon S3、Amazon EMR、Amazon DynamoDB 和 Amazon EC2 中) 的資料。您可以參考連接至叢集的 AWS Identity and Access Management (IAM) 角色 （以角色為基礎的存取控制），或提供使用者的存取憑證 （以金鑰為基礎的存取控制），以提供該授權。為了提高安全性和彈性，建議使用 IAM 角色型存取控制。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。

SSH  <a name="copy-ssh"></a>
此子句指定從使用 SSH 通訊協定的遠端主機載入資料。如果指定 SSH，則還必須使用 [s3://copy_from_ssh_manifest_file](#copy-ssh-manifest) 引數提供資訊清單檔案。  
如果您使用 SSH 從位在遠端 VPC 使用私有 IP 地址的主機複製，該 VPC 必須已啟用增強型 VPC 路由。如需增強型 VPC 路由的相關資訊，請參閱 [Amazon Redshift 增強型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/enhanced-vpc-routing.html)。

## 選用的參數
<a name="copy-parameters-data-source-ssh-optional-parms"></a>

從 SSH COPY 時，您可以選擇性指定下列參數：
+ [欄映射選項](copy-parameters-column-mapping.md)
+ [資料格式參數](copy-parameters-data-format.md#copy-data-format-parameters)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)

## 不支援的參數
<a name="copy-parameters-data-source-ssh-unsupported-parms"></a>

從 SSH COPY 時，您不能使用下列參數：
+ ENCRYPTED
+ MANIFEST
+ READRATIO

# 從 Amazon DynamoDB 進行 COPY
<a name="copy-parameters-data-source-dynamodb"></a>

若要從現有的 DynamoDB 資料表載入資料，請使用 FROM 子句來指定 DynamoDB 資料表名稱。

**Topics**
+ [語法](#copy-parameters-data-source-dynamodb-syntax)
+ [範例](#copy-parameters-data-source-dynamodb-examples)
+ [選用的參數](#copy-parameters-data-source-dynamodb-optional-parms)
+ [不支援的參數](#copy-parameters-data-source-dynamodb-unsupported-parms)

**重要**  
如果 DynamoDB 資料表所在區域與 Amazon Redshift 叢集的區域不是同一個，您必須使用 REGION 參數來指定資料所在的區域。

## 語法
<a name="copy-parameters-data-source-dynamodb-syntax"></a>

```
FROM 'dynamodb://table-name' 
authorization
READRATIO ratio
| REGION [AS] 'aws_region'  
| optional-parameters
```

## 範例
<a name="copy-parameters-data-source-dynamodb-examples"></a>

下列範例從 DynamoDB 資料表載入資料。

```
copy favoritemovies from 'dynamodb://ProductCatalog'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
readratio 50;
```

### Parameters
<a name="copy-parameters-data-source-dynamodb-parameters"></a>

FROM  
載入的資料來源。

'dynamodb://*table-name*'  <a name="copy-dynamodb"></a>
包含資料之 DynamoDB 資料表的名稱，例如 `'dynamodb://ProductCatalog'`。如需 DynamoDB 屬性如何映射至 Amazon Redshift 欄的詳細資訊，請參閱[從 Amazon DynamoDB 資料表載入資料](t_Loading-data-from-dynamodb.md)。  
DynamoDB 資料表名稱對 AWS 帳戶是唯一的，由 AWS 存取憑證識別。

*authorization*  
COPY 命令需要取得授權來存取另一個 AWS 資源中 (包括在 Amazon S3、Amazon EMR、DynamoDB 和 Amazon EC2 中) 的資料。您可以參考連接至叢集的 AWS Identity and Access Management (IAM) 角色 （以角色為基礎的存取控制），或提供使用者的存取憑證 （以金鑰為基礎的存取控制），以提供該授權。為了提高安全性和彈性，建議使用 IAM 角色型存取控制。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。

READRATIO [AS] *比率*  <a name="copy-readratio"></a>
DynamoDB 資料表的佈建輸送量中用於資料載入的百分比。從 DynamoDB 的 COPY 需要 READRATIO。此項目不能用於從 Amazon S3 的 COPY。強烈建議將此比率設定為小於平均未用佈建輸送量的值。有效值為整數 1–200。  
將 READRATIO 設為 100 或更高會使 Amazon Redshift 完全耗盡 DynamoDB 資料表的佈建輸送量，導致 COPY 工作階段期間對相同資料表同時執行的讀取操作效能嚴重降低。寫入流量不受影響。在 Amazon Redshift 無法滿足資料表的佈建輸送量的罕見情況下，允許使用高於 100 的值來排解此問題。如果您持續從 DynamoDB 將資料載入 Amazon Redshift，請考慮以時間序列來組織 DynamoDB 資料表，以分隔來自 COPY 操作的即時流量。

## 選用的參數
<a name="copy-parameters-data-source-dynamodb-optional-parms"></a>

從 Amazon DynamoDB COPY 時，您可以選擇性指定下列參數：
+ [欄映射選項](copy-parameters-column-mapping.md)
+ 支援下列資料轉換參數：
  + [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate) 
  + [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull) 
  + [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat) 
  + [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull) 
  + [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 
  + [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat) 
  + [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks) 
  + [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns) 
+ [資料載入操作](copy-parameters-data-load.md)

## 不支援的參數
<a name="copy-parameters-data-source-dynamodb-unsupported-parms"></a>

從 DynamoDB COPY 時，您不能使用下列參數：
+ 所有資料格式參數
+ ESCAPE
+ FILLRECORD
+ IGNOREBLANKLINES
+ IGNOREHEADER
+ NULL
+ REMOVEQUOTES
+ ACCEPTINVCHARS
+ MANIFEST
+ ENCRYPTED

# 授權參數
<a name="copy-parameters-authorization"></a>

COPY 命令需要授權才能存取其他 AWS 資源中的資料，包括 Amazon S3、Amazon EMR、Amazon DynamoDB 和 Amazon EC2。您可以透過參考附加到叢集的 [AWS Identity and Access Management (IAM) 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) 來提供此授權 (*角色型存取控制*)。您可以在 Amazon S3 上加密載入資料。

下列主題提供身分驗證選項的詳細資訊和範例：
+ [COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)
+ [角色類型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)
+ [金鑰型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based)

使用下列其中一項來提供 COPY 命令的授權：
+ [使用 IAM\$1ROLE 參數](#copy-iam-role) 參數
+ [使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數](#copy-access-key-id) 參數
+ [使用 CREDENTIALS 參數](#copy-credentials) 子句

## 使用 IAM\$1ROLE 參數
<a name="copy-iam-role"></a>

### IAM\$1ROLE
<a name="copy-iam-role-iam"></a>

使用預設關鍵字，讓 Amazon Redshift 使用設定為預設值並在 COPY 命令執行時與叢集關聯的 IAM 角色。

對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。如果指定 IAM\$1ROLE，則不能使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY、SESSION\$1TOKEN 或 CREDENTIALS。

以下顯示 IAM\$1ROLE 參數的語法。

```
IAM_ROLE { default | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' }
```

如需詳細資訊，請參閱[角色類型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)。

## 使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數
<a name="copy-access-key-id"></a>

### ACCESS\$1KEY\$1ID、SECRET\$1ACCESS\$1KEY
<a name="copy-access-key-id-access"></a>

不建議使用此授權方法。

**注意**  
除了以純文字提供存取登入資料，強烈建議指定 IAM\$1ROLE 參數來使用角色型身分驗證。如需詳細資訊，請參閱[角色類型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)。

### SESSION\$1TOKEN
<a name="copy-token"></a>

用於暫時存取登入資料的工作階段字符。指定 SESSION\$1TOKEN 時，您還必須使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 來提供暫時存取金鑰登入資料。如果指定 SESSION\$1TOKEN，則不能使用 IAM\$1ROLE 或 CREDENTIALS。如需詳細資訊，請參閱《IAM 使用者指南》中的[暫時安全憑證](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials)。

**注意**  
除了建立暫時安全登入資料，強烈建議使用角色型身分驗證。使用 IAM 角色來授權時，Amazon Redshift 會自動為每個工作階段建立暫時使用者憑證。如需詳細資訊，請參閱[角色類型存取控制](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based)。

以下顯示 SESSION\$1TOKEN 參數及 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數的語法。

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

如果指定 SESSION\$1TOKEN，則不能使用 CREDENTIALS 或 IAM\$1ROLE。

## 使用 CREDENTIALS 參數
<a name="copy-credentials"></a>

### CREDENTIALS
<a name="copy-credentials-cred"></a>

子句，指出您的叢集在存取包含資料檔案或資訊清單檔案的其他 AWS 資源時將使用的方法。CREDENTIALS 參數不能與 IAM\$1ROLE 或 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 一起使用。

以下顯示 CREDENTIALS 參數的語法。

```
[WITH] CREDENTIALS [AS] 'credentials-args'
```

**注意**  
若要提高彈性，建議使用 [IAM\$1ROLE](#copy-iam-role-iam) 參數，而不是 CREDENTIALS 參數。

(選用) 如果使用 [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 參數，則 *credentials-args* 字串也提供加密金鑰。

*credentials-args* 字串區分大小寫，且不得包含空格。

關鍵字 WITH 和 AS 是選用的且會被忽略。

您可指定為 [role-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-role-based.phrase) 或 [key-based access control](copy-usage_notes-access-permissions.md#copy-usage_notes-access-key-based.phrase)。在任一情況下，IAM 角色或使用者必須具有存取指定之 AWS 資源所需的許可。如需詳細資訊，請參閱[COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](copy-usage_notes-access-permissions.md#copy-usage_notes-iam-permissions)。

**注意**  
為了保護您的 AWS 登入資料和保護敏感資料，我們強烈建議使用角色型存取控制。

若要指定角色型存取控制，請依下列格式提供 *credentials-args* 字串。

```
'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
```

若要使用暫時字符登入資料，您必須提供暫時存取金鑰 ID、暫時私密存取金鑰及暫時字符。*credentials-args* 字串採用下列格式。

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;token=<temporary-token>'
```

使用角色型存取控制搭配臨時憑證的 COPY 命令類似下列範例陳述式：

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key-id>;token=<temporary-token>'
```

 如需詳細資訊，請參閱[暫時安全憑證](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials)。

如果使用 [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 參數，則 *credentials-args* 字串採用下列格式，其中 *<root-key>* 是用於加密檔案之根金鑰的值。

```
CREDENTIALS
'<credentials-args>;master_symmetric_key=<root-key>'
```

使用角色型存取控制搭配加密金鑰的 COPY 命令類似下列範例陳述式：

```
COPY customer FROM 's3://amzn-s3-demo-bucket/mydata' 
CREDENTIALS 
'aws_iam_role=arn:aws:iam::<account-id>:role/<role-name>;master_symmetric_key=<root-key>'
```

# 欄映射選項
<a name="copy-parameters-column-mapping"></a>

根據預設，COPY 會依欄位在資料檔案中出現的同樣順序，將值插入目標資料表的欄。如果預設欄順序不適用，您可以指定欄清單或使用 JSONPath 表達式，將來源資料欄位映射至目標欄。
+ [Column List](#copy-column-list)
+ [JSONPaths File](#copy-column-mapping-jsonpaths)

## 資料欄清單
<a name="copy-column-list"></a>

您可以指定逗號分隔的欄名稱清單，以便將來源資料欄位載入特定的目標欄。COPY 陳述式中的欄可以是任何順序，但從純文字檔 (例如 Amazon S3 儲存貯體) 載入時，欄的順序必須符合來源資料的順序。

從 Amazon DynamoDB 資料表載入時，順序並不重要。COPY 命令會將擷取自 DynamoDB 資料表之項目中的屬性名稱，與 Amazon Redshift 資料表中的欄名稱進行比對。如需詳細資訊，請參閱[從 Amazon DynamoDB 資料表載入資料](t_Loading-data-from-dynamodb.md)

 欄清單的格式如下。

```
COPY tablename (column1 [,column2, ...]) 
```

如果從欄清單中省略目標資料表的某一欄，COPY 會載入目標欄的 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 表達式。

如果目標欄沒有預設值，COPY 會嘗試載入 NULL。

如果 COPY 嘗試將 NULL 指派給定義為 NOT NULL 的欄，COPY 命令會失敗。

如果欄清單包含 [IDENTITY](r_CREATE_TABLE_NEW.md#identity-clause) 欄，則還必須指定 [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)；如果 IDENTITY 欄遭省略，則不能指定 EXPLICIT\$1IDS。如果未指定欄清單，則命令的行為會如同已指定完整、按順序的欄清單一樣，而如果也未指定 EXPLICIT\$1IDS，則會 IDENTITY 欄會遭到省略。

如果資料欄是使用 GENERATED BY DEFAULT AS IDENTITY 定義的，則可以複製它。值是利用您提供的值來產生或更新。EXPLICIT\$1IDS 不是必要選項。COPY 不會更新身分高浮水印。如需詳細資訊，請參閱[GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause)。

## JSONPaths 檔案
<a name="copy-column-mapping-jsonpaths"></a>

從 JSON 或 Avro 格式的資料檔案載入時，COPY 會自動將 JSON 或 Avro 來源資料中的資料元素映射至目標資料表的欄。它會比對 Avro 結構定義中的欄位名稱與目標資料表或欄清單中的欄名稱，以達到這個目標。

在某些情況下，您的欄名稱和欄位名稱不相符，或者您需要映射至資料階層中的更深層級。在這些情況下，您可以使用 JSONPaths 檔案將 JSON 或 Avro 資料元素明確地映射至欄。

如需詳細資訊，請參閱[JSONPaths 檔案](copy-parameters-data-format.md#copy-json-jsonpaths)。

# 資料格式參數
<a name="copy-parameters-data-format"></a>

根據預設，COPY 命令會預期來源資料是字元分隔的 UTF-8 文字。預設分隔符號是縱線字元 ( \$1 )。如果來源資料是其他格式，請使用下列參數來指定資料格式：
+ [FORMAT](#copy-format)
+ [CSV](#copy-csv)
+ [DELIMITER](#copy-delimiter) 
+ [FIXEDWIDTH](#copy-fixedwidth) 
+ [SHAPEFILE](#copy-shapefile) 
+ [AVRO](#copy-avro) 
+ [JSON format for COPY](#copy-json) 
+ [PARQUET](#copy-parquet) 
+ [ORC](#copy-orc) 

從 Amazon S3 COPY 時，除了標準資料格式，COPY 還支援下列單欄資料格式：
+ [ORC](#copy-orc) 
+ [PARQUET](#copy-parquet) 

支援從單欄格式進行 COPY，但有某些限制。如需詳細資訊，請參閱[從單欄資料格式 COPY](copy-usage_notes-copy-from-columnar.md)。<a name="copy-data-format-parameters"></a>資料格式參數

FORMAT [AS]  <a name="copy-format"></a>
(選用) 識別資料格式關鍵字。FORMAT 引數描述如下。

CSV [ QUOTE [AS] *'quote\$1character'* ]  <a name="copy-csv"></a>
在輸入資料中啟用 CSV 格式。若要自動逸出分隔符號、新行字元及換行字元，請以 QUOTE 參數指定的字元來括住欄位。預設引號字元為雙引號 ( " )。在欄位內使用引號字元時，請多加一個引號字元來逸出此字元。例如，假設引號字元是雙引號，若要插入 `A "quoted" word` 字串，則輸入檔案應該包含 `"A ""quoted"" word"` 字串。使用 CSV 參數時，預設分隔字元為逗號 ( , )。您可以使用 DELIMITER 參數來指定不同的分隔字元。  
以引號括住欄位時，分隔字元和引號字元之間的空格會被忽略。如果分隔字元是空格字元 (例如 Tab 字元)，則不會將分隔字元視為空格。  
CSV 不能與 FIXEDWIDTH、REMOVEQUOTES 或 ESCAPE 一起使用。    
QUOTE [AS] *'quote\$1character'*  <a name="copy-csv-quote"></a>
選用。指定字元做為使用 CSV 參數時的引號字元。預設值為雙引號 ( " )。如果使用 QUOTE 參數來定義雙引號以外的引號字元，則不需要在欄位內逸出雙引號。QUOTE 參數只能與 CSV 參數一起使用。AS 關鍵字為選用。

DELIMITER [AS] ['*delimiter\$1char*']   <a name="copy-delimiter"></a>
指定用來分隔輸入檔案中不同欄位的字元，例如縱線字元 (`|`)、逗號 (`,`) 或 Tab (`\t`)，或是指定多個字元，例如 `|~|`。支援非列印字元。字元也可以用八進位表示，如其 UTF-8 字碼單位。採用八進位時，請使用格式 '\$1ddd'，其中 'd' 是八進位數字 (0-7)。預設分隔字元為縱線字元 (`|`)，除非使用 CSV 參數 (在此情況下，預設分隔字元為逗號 (`,`)。AS 關鍵字為選用。DELIMITER 不能與 FIXEDWIDTH 一起使用。

FIXEDWIDTH '*fixedwidth\$1spec*'  <a name="copy-fixedwidth"></a>
從每個欄寬是固定長度 (而不是以分隔字元隔開的欄) 的檔案載入資料。*fixedwidth\$1spec* 是字串，指定使用者定義的欄標籤和欄寬。欄標籤可以是文字字串或整數 (視使用者的選擇而定)。欄標籤與欄名稱無關。標籤/寬度配對的順序必須完全符合資料表欄的順序。FIXEDWIDTH 不能與 CSV 或 DELIMITER 一起使用。在 Amazon Redshift 中，CHAR 和 VARCHAR 欄的長度以位元組表示，因此在準備要載入的檔案時，請確保您指定的欄寬可容納多位元組字元的二進位長度。如需詳細資訊，請參閱[字元類型](r_Character_types.md)。  
*fixedwidth\$1spec* 的格式如下所示：  

```
'colLabel1:colWidth1,colLabel:colWidth2, ...'
```

SHAPEFILE [ SIMPLIFY [AUTO] [*'tolerance'*] ]  <a name="copy-shapefile"></a>
在輸入資料中啟用 SHAPEFILE 格式。依預設，Shapefile 的第一欄是 `GEOMETRY` 或 `IDENTITY` 欄。所有後續的欄都遵循 Shapefile 中指定的順序。  
您不能使用具有 FIXEDWIDTH、REMOVEQUOTES 或 ESCAPE 的 SHAPEFILE。  
若要搭配 `GEOGRAPHY` 物件使用 `COPY FROM SHAPEFILE`，請先擷取至 `GEOMETRY` 欄中，然後將物件轉換為 `GEOGRAPHY` 物件。    
SIMPLIFY [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(選用) 使用 Ramer-Douglas-Peucker 演算法和指定的公差，簡化擷取過程中的所有幾何。  
SIMPLIFY AUTO [*tolerance*]  <a name="copy-shapefile-simplify"></a>
(選用) 僅簡化大於最大幾何大小的幾何。此簡化使用 Ramer-Douglas-Peucker 演算法和自動計算的公差 (如果未超過指定的公差)。此演算法會在指定公差內計算儲存物件的大小。*tolerance* 值是選用的。
如需載入 Shapefile 的範例，請參閱 [將 Shapefile 載入 Amazon Redshift](r_COPY_command_examples.md#copy-example-spatial-copy-shapefile)。

AVRO [AS] '*avro\$1option*'  <a name="copy-avro"></a>
指定來源資料是 Avro 格式。  
從這些服務和通訊協定進行 COPY 時，支援 Avro 格式：  
+ Amazon S3 
+ Amazon EMR 
+ 遠端主機 (SSH) 
從 DynamoDB 進行 COPY 時不支援 Avro。  
Avro 是資料序列化通訊協定。Avro 來源檔案包含結構描述來定義資料的結構。Avro 結構描述類型必須是 `record`。COPY 接受使用預設未壓縮解碼器及 `deflate` 和 `snappy` 壓縮解碼器建立的 Avro 檔案。如需 Avro 的相關資訊，請前往 [Apache Avro](https://avro.apache.org/)。  
*avro\$1option* 的有效值如下所示：  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
預設值為 `'auto'`。  
COPY 會自動將 Avro 來源資料中的資料元素映射至目標資料表中的欄。它會比對 Avro 結構描述中的欄位名稱與目標資料表中的欄名稱。`'auto'` 的比對區分大小寫，而 `'auto ignorecase'` 的比對不區分大小寫。  
Amazon Redshift 資料表中的欄名稱一律為小寫，因此當您使用 `'auto'` 選項時，相符欄位名稱也必須是小寫。如果欄位名稱並非全部小寫，您可以使用 `'auto ignorecase'` 選項。使用預設 `'auto'` 引數，COPY 只會識別結構中的第一層欄位 (或*外部欄位*)。  
若要將欄名稱明確映射至 Avro 欄位名稱，您可以使用 [JSONPaths 檔案](#copy-json-jsonpaths)。  
根據預設，COPY 會嘗試將目標資料表中的所有欄與 Avro 欄位名稱進行比對。若要載入欄子集，您可以選擇性指定欄清單。如果從欄清單中省略目標資料表的某一欄，COPY 會載入目標欄的 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 運算式。如果目標欄沒有預設值，COPY 會嘗試載入 NULL。如果某一欄出現在欄清單中，且 COPY 在 Avro 資料中找不到相符欄位，則 COPY 會嘗試將 NULL 載入此欄。  
如果 COPY 嘗試將 NULL 指派給定義為 NOT NULL 的欄，COPY 命令會失敗。  
<a name="copy-avro-schema"></a>**Avro 結構描述**  
Avro 來源資料檔案包含結構描述來定義資料的結構。COPY 會讀取 Avro 來源資料檔案中的結構描述，以便將資料元素映射至目標資料表欄。下列範例顯示 Avro 結構描述。  

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"}]
}
```
Avro 結構描述定義方式是 JSON 格式。最上層 JSON 物件包含三個名稱值對，包含名稱 (或*金鑰*)、`"name"`、`"type"` 和 `"fields"`。  
內含物件陣列的 `"fields"` 金鑰對會定義資料結構中每個欄位的名稱和資料類型。根據預設，COPY 會自動將欄位名稱與欄名稱進行比對。欄名稱一律為小寫，因此相符的欄位名稱也必須是小寫，除非您指定 `‘auto ignorecase’` 選項。不符合欄名稱的任何欄位名稱會被忽略。順序並不重要。在上述範例中，COPY 映射至欄名稱 `id`、`guid`、`name` 和 `address`。  
使用預設的 `'auto'` 引數時，COPY 只會將第一層物件與欄進行比對。若要映射至結構描述中更深的層級，或欄位名稱和欄名稱不相符，請使用 JSONPaths 檔案來定義映射。如需詳細資訊，請參閱[JSONPaths 檔案](#copy-json-jsonpaths)。  
如果與金鑰相關聯的值是複合 Avro 資料類型 (例如位元組、陣列、記錄、映射或連結)，COPY 會以字串形式載入值。在這裡，字串是資料的 JSON 表示法。COPY 會以字串形式載入 Avro 列舉資料類型，其中內容是類型的名稱。如需範例，請參閱 [從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)。  
Avro 檔案標頭 (包括結構描述和檔案中繼資料) 的大小上限為 1 MB。    
單一 Avro 資料區塊的大小上限為 4 MB。這不同於資料列大小上限。如果超過單一 Avro 資料區塊的大小上限，即使產生的資料列小於 4 MB 資料列大小限制，COPY 命令也會失敗。  
在計算列大小時，Amazon Redshift 會在內部將縱線字元 ( \$1 ) 計算兩次。如果輸入資料包含非常多的縱線字元，即使資料區塊小於 4 MB，資料列大小仍可能超過 4 MB。

JSON [AS] '*json\$1option*'  <a name="copy-json"></a>
來源資料是 JSON 格式。  
從這些服務和通訊協定 COPY 時，支援 JSON 格式：  
+ Amazon S3
+ 從 Amazon EMR 進行 COPY
+ 從 SSH COPY
從 DynamoDB 進行 COPY 時不支援 JSON。  
*json\$1option* 的有效值如下所示：  
+ `'auto'`
+ `'auto ignorecase'`
+ `'s3://jsonpaths_file'` 
+ `'noshred'` 
預設值為 `'auto'`。載入 JSON 文件時，Amazon Redshift 不會將 JSON 結構的屬性分解為多個欄。  
根據預設，COPY 會嘗試將目標資料表中的所有欄與 JSON 欄位名稱金鑰配對。若要載入欄子集，您可以選擇性指定欄清單。如果 JSON 欄位名稱金鑰不是全部小寫，您可以使用 `'auto ignorecase'` 選項或 [JSONPaths 檔案](#copy-json-jsonpaths)，明確地將欄名稱映射至 JSON 欄位名稱金鑰。  
如果從欄清單中省略目標資料表的某一欄，COPY 會載入目標欄的 [DEFAULT](r_CREATE_TABLE_NEW.md#create-table-default) 表達式。如果目標欄沒有預設值，COPY 會嘗試載入 NULL。如果某一欄出現在欄清單中，且 COPY 在 JSON 資料中找不到相符欄位，則 COPY 會嘗試將 NULL 載入此欄。  
如果 COPY 嘗試將 NULL 指派給定義為 NOT NULL 的欄，COPY 命令會失敗。  
COPY 會將 JSON 來源資料中的資料元素映射至目標資料表的欄。它會將來源名稱值對中的*物件金鑰* (或名稱) 比對目標資料表中的欄名稱來達成此目標。  
請參閱每個 *json\$1option* 值的下列詳細資訊：    
'auto'  <a name="copy-json-auto"></a>
使用此選項，比對會區分大小寫。Amazon Redshift 資料表中的欄名稱一律為小寫，當您使用 `'auto'` 選項時，相符的 JSON 欄位名稱也必須是小寫。  
'auto ignorecase'  <a name="copy-json-auto-ignorecase"></a>
使用此選項，比對不會區分大小寫。Amazon Redshift 資料表中的欄名稱一律為小寫，因此，當您使用 `'auto ignorecase'` 選項時，對應的 JSON 欄位名稱可以是小寫、大寫或大小寫混合。  
's3://*jsonpaths\$1file*'  <a name="copy-json-pathfile"></a>
使用此選項，COPY 會使用指名的 JSONPaths 檔案，將 JSON 來源資料中的資料元素映射至目標資料表的欄。*`s3://jsonpaths_file`* 引數必須是明確參考單一檔案的 Amazon S3 物件金鑰。例如 `'s3://amzn-s3-demo-bucket/jsonpaths.txt`'。引數不能是索引鍵字首。如需使用 JSONPaths 檔案的相關資訊，請參閱 [JSONPaths 檔案](#copy-json-jsonpaths)。  
在某些情況下，由 `jsonpaths_file` 指定的檔案具有與 `copy_from_s3_objectpath` 為資料檔指定的路徑相同的字首。如果是這樣，COPY 會將 JSONPaths 檔案讀取為資料檔案並傳回錯誤。例如，假設您的資料檔案使用物件路徑 `s3://amzn-s3-demo-bucket/my_data.json`，而您的 JsonPath 檔案是 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`。在此情況下，COPY 會嘗試將 `my_data.jsonpaths` 載入為資料檔案。  
'noshred'  <a name="copy-json-noshred"></a>
使用此選項，在載入 JSON 文件時，Amazon Redshift 不會將 JSON 結構的屬性分解為多個欄。

## JSON 資料檔案
<a name="copy-json-data-file"></a>

JSON 資料檔案包含一組物件或陣列。COPY 會將每個 JSON 物件或陣列載入目標資料表中的每一列。對應到一列的每個物件或陣列必須是獨立的根層級結構；亦即，不能是另一個 JSON 結構的成員。

JSON *物件*的開頭和結尾是大括號  ( \$1 \$1 )，且包含一組未排序的名稱值對。每一對名稱和值以冒號分隔，而配對以逗號分隔。根據預設，名稱值對中的*物件金鑰* (或名稱) 必須符合資料表中相應欄的名稱。Amazon Redshift 資料表中的欄名稱一律為小寫，因此相符的 JSON 欄位名稱金鑰也必須是小寫。如果欄名稱與 JSON 金鑰不符，請使用 [JSONPaths 檔案](#copy-json-jsonpaths) 明確地將欄映射至金鑰。

JSON 物件中的順序並不重要。不符合欄名稱的任何名稱會被忽略。以下顯示簡易 JSON 物件的結構。

```
{
  "column1": "value1",
  "column2": value2,
  "notacolumn" : "ignore this value"
}
```

JSON *陣列* 的開頭和結尾是方括號 ( [ ] )，且包含一組已排序的值 (以逗號分隔)。如果資料檔案使用陣列，您必須指定 JSONPaths 檔案將值與欄配對。以下顯示簡易 JSON 陣列的結構。

```
["value1", value2]
```

JSON 必須格式正確。例如，不能以逗號或其他任何字元 (空格除外) 來分隔物件或陣列。必須以雙引號字元括住字串。引號字元必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。

單一 JSON 物件或陣列的大小上限 (包括大括號或方括號) 為 4 MB。這不同於資料列大小上限。如果超過單一 JSON 物件或陣列的大小上限，即使產生的資料列小於 4 MB 資料列大小限制，COPY 命令也會失敗。

在計算列大小時，Amazon Redshift 會在內部將縱線字元 ( \$1 ) 計算兩次。如果輸入資料包含非常多的縱線字元，即使物件小於 4 MB，資料列大小仍可能超過 4 MB。

COPY 會載入 `\n` 做為新行字元，也會載入 `\t` 做為 Tab 字元。若要載入反斜線，請加上反斜線 ( `\\` ) 來逸出。

COPY 會在指定的 JSON 來源中搜尋格式正確、有效的 JSON 物件或陣列。如果 COPY 在找到可用 JSON 結構之前或在有效的 JSON 物件或陣列之間遇到任何非空白字元，COPY 會針對每個例項傳回錯誤。這些錯誤都計入 MAXERROR 錯誤計數內。當錯誤計數等於或超過 MAXERROR 時，COPY 會失敗。

對於每個錯誤，Amazon Redshift 會在 STL\$1LOAD\$1ERRORS 系統資料表中記錄一列。LINE\$1NUMBER 欄會記錄造成錯誤之 JSON 物件的最後一行。

如果指定 IGNOREHEADER，COPY 會在 JSON 資料中忽略指定的行數。IGNOREHEADER 計算時一律計數 JSON 資料中的新行字元。

根據預設，COPY 會將空字串載入為空欄位。如果指定 EMPTYASNULL，COPY 會將 CHAR 和 VARCHAR 欄位的空字串載入為 NULL。一律會將其他資料類型 (例如 INT) 的空字串載入為 NULL。

JSON 不支援下列選項：
+ CSV
+ DELIMITER 
+ ESCAPE
+ FILLRECORD 
+ FIXEDWIDTH
+ IGNOREBLANKLINES
+ NULL AS
+ READRATIO
+ REMOVEQUOTES 

如需詳細資訊，請參閱[從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)。如需 JSON 資料結構的相關資訊，請前往 [www.json.org](https://www.json.org/)。

## JSONPaths 檔案
<a name="copy-json-jsonpaths"></a>

如果您從 JSON 格式或 Avro 來源資料載入，根據預設，COPY 預設會將來源資料中的第一層資料元素映射至目標資料表的欄。它會將名稱值對中的每個名稱 (或物件金鑰) 比對目標資料表中的欄名稱來達成此目標。

如果欄名稱和物件金鑰不符，或若要映射至資料階層中更深的層級，您可以使用 JSONPaths 檔案，以明確地將 JSON 或 Avro 資料元素映射至欄。JSONPaths 檔案會比對目標資料表或欄清單中的欄順序，以便將 JSON 資料元素映射至欄。

JSONPaths 檔案只能包含單一 JSON 物件 (不是陣列)。JSON 物件是名稱值對。*物件金鑰* (名稱值對中的名稱) 必須是 `"jsonpaths"`。名稱值對中的*值*是 *JSONPath 運算式*陣列。每個 JSONPath 表達式都參考 JSON 資料階層或 Avro 結構描述中的單一元素，類似於 XPath 表達式參考 XML 文件中元素的方式。如需詳細資訊，請參閱[JSONPath 表達式](#copy-json-jsonpath-expressions)。

若要使用 JSONPath 檔案，請將 JSON 或 AVRO 關鍵字加入 COPY 命令。使用下列格式指定 JSONPath 檔案的 S3 儲存貯體名稱和物件路徑。

```
COPY tablename 
FROM 'data_source' 
CREDENTIALS 'credentials-args' 
FORMAT AS { AVRO | JSON } 's3://jsonpaths_file';
```

`s3://jsonpaths_file` 值必須是明確參考單一檔案的 Amazon S3 物件金鑰，例如 `'s3://amzn-s3-demo-bucket/jsonpaths.txt'`。它不能是索引鍵字首。

在某些情況下，如果您是從 Amazon S3 載入，則 `jsonpaths_file` 指定的檔案具有與 `copy_from_s3_objectpath` 為資料檔指定的路徑相同的字首。如果是這樣，COPY 會將 JSONPaths 檔案讀取為資料檔案並傳回錯誤。例如，假設您的資料檔案使用物件路徑 `s3://amzn-s3-demo-bucket/my_data.json`，而您的 JsonPath 檔案是 `s3://amzn-s3-demo-bucket/my_data.jsonpaths`。在此情況下，COPY 會嘗試將 `my_data.jsonpaths` 載入為資料檔案。

 如果金鑰名稱是 `"jsonpaths"` 以外的任何字串，COPY 命令不會傳回錯誤，但會忽略 *jsonpaths\$1file*，並改用 `'auto'` 引數。

如果發生下列任何情形，COPY 命令會失敗：
+ JSON 格式不正確。
+ 有多個 JSON 物件。
+ 物件外面存在空格以外的任何字元。
+ 陣列元素是空字串或不是字串。

MAXERROR 不會套用至 JSONPaths 檔案。

即使指定 [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted) 選項，也不可對 JSONPaths 檔案進行加密。

如需詳細資訊，請參閱[從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)。

## JSONPath 表達式
<a name="copy-json-jsonpath-expressions"></a>

JSONPaths 檔案使用 JSONPath 表達式將資料欄位映射至目標欄。每個 JSONPath 運算式都對應至 Amazon Redshift 目標資料表中的一欄。JSONPath 陣列元素的順序必須符合目標資料表或欄清單 (如果使用欄清單) 中的欄順序。

如圖所示，欄位名稱和值都需要雙引號字元。引號字元必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。

如果在 JSON 資料中找不到 JSONPath 表達式所參考的物件元素，COPY 會嘗試載入 NULL 值。如果參考的物件格式不正確，COPY 會傳回載入錯誤。

如果在 JSON 或 Avro 資料中找不到 JSONPath 表達式所參考的陣列元素，COPY 會失敗並傳回下列錯誤：`Invalid JSONPath format: Not an array or index out of range.` 請從 JSONPaths 中移除任何不存在於來源資料中的陣列元素，並確認來源資料中的陣列格式正確。  

JSONPath 運算式可以使用方括號標記法或點標記法，但您不能混用標記法。下列範例示範使用方括號標記法的 JSONPath 表達式。

```
{
    "jsonpaths": [
        "$['venuename']",
        "$['venuecity']",
        "$['venuestate']",
        "$['venueseats']"
    ]
}
```

下列範例示範使用點標記法的 JSONPath 表達式。

```
{
    "jsonpaths": [
        "$.venuename",
        "$.venuecity",
        "$.venuestate",
        "$.venueseats"
    ]
}
```

在 Amazon Redshift COPY 語法的內容中，JSONPath 運算式必須指定 JSON 或 Avro 階層式資料結構中單一名稱元素的明確路徑。Amazon Redshift 不支援任何可能解析為不明確路徑或多個名稱元素的 JSONPath 元素，例如萬用字元或篩選條件運算式。

如需詳細資訊，請參閱[從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)。

## 使用 JSONPaths 處理 Avro 資料
<a name="using-jsonpath-with-avro"></a>

下列範例示範多個層級的 Avro 結構描述。

```
{
    "name": "person",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "guid", "type": "string"},
        {"name": "isActive", "type": "boolean"},
        {"name": "age", "type": "int"},
        {"name": "name", "type": "string"},
        {"name": "address", "type": "string"},
        {"name": "latitude", "type": "double"},
        {"name": "longitude", "type": "double"},
        {
            "name": "tags",
            "type": {
                        "type" : "array",
                        "name" : "inner_tags",
                        "items" : "string"
                    }
        },
        {
            "name": "friends",
            "type": {
                        "type" : "array",
                        "name" : "inner_friends",
                        "items" : {
                                    "name" : "friends_record",
                                    "type" : "record",
                                    "fields" : [
                                                 {"name" : "id", "type" : "int"},
                                                 {"name" : "name", "type" : "string"}
                                               ]
                                  }
                    }
        },
        {"name": "randomArrayItem", "type": "string"}
    ]
}
```

下列範例示範一個 JSONPaths 檔案使用 AvroPath 表達式，來參考上面的結構描述。

```
{
    "jsonpaths": [
        "$.id",
        "$.guid",
        "$.address",
        "$.friends[0].id"
    ]
}
```

JSONPaths 範例包含下列元素：

jsonpaths  
JSON 物件的名稱，其中包含 AvroPath 表達式。

[ … ]  
方括號括住含有路徑元素的 JSON 陣列。

\$1  
貨幣符號表示 Avro 結構描述中的根元素，即 `"fields"` 陣列。

"\$1.id",  
AvroPath 表達式的目標。在此例子中，目標是 `"fields"` 陣列中名稱為 `"id"` 的元素。表達式以逗號分隔。

"\$1.friends[0].id"  
方括號表示陣列索引。JSONPath 表達式採用以零為基礎的索引，所以此表達式是參考 `"friends"` 陣列中名稱為 `"id"` 的第一個元素。

Avro 結構描述語法需要使用*內部欄位*來定義記錄和陣列資料類型的結構。AvroPath 表達式會忽略內部欄位。例如，欄位 `"friends"` 定義名為 `"inner_friends"` 的陣列，此陣列接著定義名為 `"friends_record"` 的記錄。參考欄位 `"id"` 的 AvroPath 表達式可以忽略額外欄位，而直接參考目標欄位。下列 AvroPath 表達式參考兩個屬於 `"friends"` 陣列的欄位。

```
"$.friends[0].id"
"$.friends[0].name"
```

## 單欄資料格式參數
<a name="copy-parameters-columnar-data"></a>

從 Amazon S3 COPY 時，除了標準資料格式，COPY 還支援下列單欄資料格式。支援從單欄格式 COPY，但有某些限制。如需詳細資訊，請參閱[從單欄資料格式 COPY](copy-usage_notes-copy-from-columnar.md)。

ORC  <a name="copy-orc"></a>
從採用「最佳化資料列單欄式 (ORC)」檔案格式的檔案載入資料。

PARQUET  <a name="copy-parquet"></a>
從採用 Parquet 檔案格式的檔案載入資料。

# 檔案壓縮參數
<a name="copy-parameters-file-compression"></a>

您可以指定下列參數，以便從壓縮資料檔案載入。檔案壓縮參數

BZIP2   <a name="copy-bzip2"></a>
此值指定一或多個 bzip2 壓縮格式的輸入檔案 (.bz2 檔案)。COPY 操作會讀取每個壓縮檔案，並於載入時將資料解壓縮。

GZIP   <a name="copy-gzip"></a>
此值指定一或多個 gzip 壓縮格式的輸入檔案 (.gz 檔案)。COPY 操作會讀取每個壓縮檔案，並於載入時將資料解壓縮。

LZOP   <a name="copy-lzop"></a>
此值指定一或多個 lzop 壓縮格式的輸入檔案 (.lzo 檔案)。COPY 操作會讀取每個壓縮檔案，並於載入時將資料解壓縮。  
COPY 不支援以 lzop *--filter* 選項壓縮的檔案。

ZSTD   <a name="copy-zstd"></a>
此值指定一或多個壓縮 Zstandard 格式的輸入檔案 (.zst 檔案)。COPY 操作會讀取每個壓縮檔案，並於載入時將資料解壓縮。  
ZSTD 僅支援從 Amazon S3 使用 COPY。

# 資料轉換參數
<a name="copy-parameters-data-conversion"></a>

COPY 載入資料表時會嘗試隱含地將來源資料中的字串轉換為目標欄的資料類型。如果您需要指定不同於預設行為的轉換，或預設轉換造成錯誤，您可以指定下列參數來管理資料轉換。如需這些參數語法的相關資訊，請參閱 [COPY 語法](https://docs.aws.amazon.com/redshift/latest/dg/r_COPY.html#r_COPY-syntax)。
+ [ACCEPTANYDATE](#copy-acceptanydate) 
+ [ACCEPTINVCHARS](#copy-acceptinvchars) 
+ [BLANKSASNULL](#copy-blanksasnull) 
+ [DATEFORMAT](#copy-dateformat) 
+ [EMPTYASNULL](#copy-emptyasnull) 
+ [ENCODING](#copy-encoding) 
+ [ESCAPE](#copy-escape) 
+ [EXPLICIT_IDS](#copy-explicit-ids) 
+ [FILLRECORD](#copy-fillrecord) 
+ [IGNOREBLANKLINES](#copy-ignoreblanklines) 
+ [IGNOREHEADER](#copy-ignoreheader) 
+ [NULL AS](#copy-null-as) 
+ [REMOVEQUOTES](#copy-removequotes) 
+ [ROUNDEC](#copy-roundec) 
+ [TIMEFORMAT](#copy-timeformat) 
+ [TRIMBLANKS](#copy-trimblanks) 
+ [TRUNCATECOLUMNS](#copy-truncatecolumns) <a name="copy-data-conversion-parameters"></a>資料轉換參數

ACCEPTANYDATE   <a name="copy-acceptanydate"></a>
允許載入任何日期格式而不會產生錯誤，包括無效格式，例如 `00/00/00 00:00:00`。此參數僅適用於 TIMESTAMP 和 DATE 欄。ACCEPTANYDATE 一定要與 DATEFORMAT 參數一起使用。如果資料的日期格式不符合 DATEFORMAT 規格，Amazon Redshift 會在該欄位中插入 NULL 值。

ACCEPTINVCHARS [AS] ['*replacement\$1char*']   <a name="copy-acceptinvchars"></a>
即使資料包含無效 UTF-8 字元，也允許將資料載入 VARCHAR 欄。指定 ACCEPTINVCHARS 時，COPY 會以 *replacement\$1char* 指定之字元所組成相同長度的字串，取代每個無效 UTF-8 字元。例如，假設替換字元是 '`^`'，則會以 '`^^^`' 取代無效的三位元組字元。  
 替換字元可以是 NULL 除外的任何 ASCII 字元。預設值為問號 ( ? )。如需無效 UTF-8 字元的相關資訊，請參閱[多位元組字元載入錯誤](multi-byte-character-load-errors.md)。  
COPY 會傳回包含無效 UTF-8 字元的列數，並針對每個受影響的列，在 [STL\$1REPLACEMENTS](r_STL_REPLACEMENTS.md) 系統資料表中新增一筆項目，而每個節點配量最多 100 列。也會取代其他無效 UTF-8 字元，但不會記錄那些取代事件。  
如果不指定 ACCEPTINVCHARS，COPY 只要遇到無效 UTF-8 字元就會傳回錯誤。  
ACCEPTINVCHARS 僅適用於 VARCHAR 欄。

BLANKSASNULL   <a name="copy-blanksasnull"></a>
將只包含空格字元的空白欄位載入為 NULL。此選項僅適用於 CHAR 和 VARCHAR 欄。一律會將其他資料類型 (例如 INT) 的空白欄位載入為 NULL。例如，會將包含連續三個空白字元 (沒有其他任何字元) 的字串載入為 NULL。預設行為 (不使用此選項時) 是依原狀載入空白字元。

DATEFORMAT [AS] \$1'*dateformat\$1string*' \$1 'auto' \$1  <a name="copy-dateformat"></a>
如果不指定 DATEFORMAT，則預設格式為 `'YYYY-MM-DD'`。例如，另一種有效格式為 `'MM-DD-YYYY'`。  
如果 COPY 命令無法辨識日期或時間值的格式，或者，日期或時間值使用不同的格式，請使用 `'auto'` 引數來搭配 DATEFORMAT 或 TIMEFORMAT 參數。`'auto'` 引數可以辨識使用 DATEFORMAT 和 TIMEFORMAT 字串時不支援的多種格式。`'auto'` 關鍵字區分大小寫。如需詳細資訊，請參閱[對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識](automatic-recognition.md)。  
日期格式可以包含時間資訊 (時、分、秒)，但此資訊會遭到忽略。AS 關鍵字為選用。如需詳細資訊，請參閱[DATEFORMAT 和 TIMEFORMAT 字串範例](r_DATEFORMAT_and_TIMEFORMAT_strings.md)。

EMPTYASNULL   <a name="copy-emptyasnull"></a>
指出 Amazon Redshift 應該將空的 CHAR 和 VARCHAR 欄位載入為 NULL。其他資料類型 (例如 INT) 的空欄位一律載入為 NULL。當資料包含連續兩個分隔符號，且分隔符號之間沒有字元時，就形成空欄位。EMPTYASNULL 和 NULL AS '' (空字串) 會引起相同的行為。

ENCODING [AS] *file\$1encoding*  <a name="copy-encoding"></a>
指定載入資料的編碼類型。COPY 命令會於載入期間將資料從指定的編碼轉換為 UTF-8。  
*file\$1encoding* 的有效值如下所示：  
+ `UTF8`
+ `UTF16`
+ `UTF16LE`
+ `UTF16BE`
+ `ISO88591`
預設值為 `UTF8`。  
來源檔案名稱必須使用 UTF-8 編碼。  
即使對載入資料指定不同的編碼，下列檔案仍必須使用 UTF-8 編碼：  
+ 資訊清單檔案
+ JSONPaths 檔案
下列參數隨附的引數字串必須使用 UTF-8：  
+ FIXEDWIDTH '*fixedwidth\$1spec*'
+ ACCEPTINVCHARS '*replacement\$1char*'
+ DATEFORMAT '*dateformat\$1string*'
+ TIMEFORMAT '*timeformat\$1string*'
+ NULL AS '*null\$1string*'
固定寬度資料檔案必須使用 UTF-8 編碼。欄位寬度是根據字元數，而不是位元組數。  
所有載入資料必須使用指定的編碼。如果 COPY 遇到不同的編碼，則會略過檔案並傳回錯誤。  
如果您指定 `UTF16`，則資料必須有位元組順序標記 (BOM)。如果知道您的 UTF-16 資料是位元組由小到大 (LE) 或位元組由大到小 (BE)，則不論是否有 BOM，您都可以使用 `UTF16LE` 或 `UTF16BE`。  
若要使用 ISO-8859-1 編碼，請指定 `ISO88591`。如需詳細資訊，請參閱*維基百科*中的 [ISO/IEC 8859-1](https://en.wikipedia.org/wiki/ISO/IEC_8859-1)。

ESCAPE   <a name="copy-escape"></a>
指定此參數時，輸入資料中的反斜線字元 (`\`) 就視為逸出字元。反斜線字元後面緊接的字元即使通常做為特殊用途，一樣會載入資料表中成為目前欄值的一部分。例如，當分隔符號字元、引號、內嵌的換行符號字元或逸出字元本身是欄值的正當部分時，您可以使用此參數來逸出這些字元。  
如果同時指定 ESCAPE 參數和 REMOVEQUOTES 參數，您可以逸出並保留原本可能移除的引號 (`'` 或 `"`)。預設 null 字串 (`\N`) 不受影響，但也可以在輸入資料中以 `\\N` 逸出。只要不以 NULL AS 參數指定替代 null 字串，`\N` 和 `\\N` 會產生相同的結果。  
控制字元 `0x00` (NUL) 不能逸出，應該從輸入資料中移除或轉換。此字元視為記錄結束 (EOR) 標記，用於截斷記錄的剩餘部分。
您不能對 FIXEDWIDTH 載入使用 ESCAPE 參數，也不可指定逸出字元本身；逸出字元一律為反斜線字元。您還必須確定輸入資料包含的逸出字元是在適當的位置。  
以下一些範例示範輸入資料，以及指定 ESCAPE 參數時載入的資料結果。第 4 列的結果假設也指定 REMOVEQUOTES 參數。輸入資料由縱線分隔的兩個欄位組成：  

```
1|The quick brown fox\[newline]
jumped over the lazy dog.
2| A\\B\\C
3| A \| B \| C
4| 'A Midsummer Night\'s Dream'
```
載入第 2 欄的資料如下所示：  

```
The quick brown fox
jumped over the lazy dog.
A\B\C
A|B|C
A Midsummer Night's Dream
```
使用者必須負責將逸出字元套用至載入的輸入資料。當您重新載入先前以 ESCAPE 參數來卸載的資料時，此規定就沒有必要。在此情況下，資料一定包含必要的逸出字元。
ESCAPE 參數不會解譯八進位、十六進位、Unicode 或其他逸出序列標記法。例如，假設來源資料包含八進位換行值 (`\012`)，且您嘗試以 ESCAPE 參數載入此資料，Amazon Redshift 會將值 `012` 載入資料表，但不會將此值解譯為要逸出的換行字元。  
在源自 Microsoft Windows 平台的資料中，若要逸出新行字元，您可能需要使用兩個逸出字元：一個用於換行字元，另一個用於新行字元。或者，您可以在載入檔案之前移除換行字元 (例如，使用 dos2unix 公用程式)。

EXPLICIT\$1IDS   <a name="copy-explicit-ids"></a>
對於有 IDENTITY 欄的資料表，如果您想要以資料表的來源資料檔案中的明確值來覆寫自動產生的值，請使用 EXPLICIT\$1IDS。如果命令包含欄清單，則此清單必須包含 IDENTITY 欄，才能使用此參數。EXPLICIT\$1IDS 值的資料格式必須符合 CREATE TABLE 定義所指定的 IDENTITY 格式。  
在您以 EXPLICIT\$1IDS 選項對資料表執行 COPY 命令之後，Amazon Redshift 將不再檢查資料表中的 IDENTITY 欄的唯一性。  
如果資料欄是使用 GENERATED BY DEFAULT AS IDENTITY 定義的，則可以複製它。值是利用您提供的值來產生或更新。EXPLICIT\$1IDS 不是必要選項。COPY 不會更新身分高浮水印。  
 如需使用 EXPLICIT\$1IDS 的 COPY 命令範例，請參閱[載入 VENUE 時將明確值提供給 IDENTITY 欄](r_COPY_command_examples.md#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)。

FILLRECORD   <a name="copy-fillrecord"></a>
當某些記錄的結尾缺少連續的欄時，允許載入資料檔案。遺失的欄會載入為 NULL。對於文字和 CSV 格式，如果遺失的欄是 VARCHAR 欄，則會載入長度為零的字串，而非 NULL。若要將 NULL 從文字和 CSV 載入至 VARCHAR 欄，請指定 EMPTYASNULL 關鍵字。只有在欄定義允許 NULL 時，才會進行 NULL 替換。  
例如，假設資料表定義包含四個可為 Null 的 CHAR 欄，且有一筆記錄包含值 `apple, orange, banana, mango`，則 COPY 命令可以載入並填入只包含值 `apple, orange` 的記錄。會將缺少的 CHAR 值載入為 NULL 值。

IGNOREBLANKLINES   <a name="copy-ignoreblanklines"></a>
忽略資料檔案中只含有換行字元的空白行，而不嘗試載入這些空白行。

IGNOREHEADER [ AS ] *number\$1rows*   <a name="copy-ignoreheader"></a>
將指定的 *number\$1rows* 視為檔案標頭而不載入。使用 IGNOREHEADER 來略過平行載入之所有檔案中的檔案標頭。

NULL AS '*null\$1string*'  <a name="copy-null-as"></a>
將符合 *null\$1string* 的欄位載入為 NULL，其中 *null\$1string* 可以是任何字串。如果資料包含 null 結束字元 (也稱為 NUL (UTF-8 0000) 或二進位零 (0x000))，COPY 會將其視為任何其他字元。例如，包含 '1' \$1\$1 NUL \$1\$1 '2' 的記錄被複製為長度為 3 個位元組的字串。如果欄位只包含 NUL，您可以使用 NULL AS 並指定 `'\0'` 或 `'\000'`，而以 NULL 取代 null 結束字元 - 例如 `NULL AS '\0'` 或 `NULL AS '\000'`。如果欄位包含以 NUL 結尾的字串，且指定 NULL AS，則會在字串結尾插入 NUL。請勿在 *null\$1string* 值使用 '\$1n' (換行符號)。Amazon Redshift 保留 '\$1 n' 用作行分隔符號。預設 *null\$1string* 為 `'\N`'。  
如果嘗試將 null 載入己定義為 NOT NULL 的欄，COPY 命令會失敗。

REMOVEQUOTES   <a name="copy-removequotes"></a>
在傳入的資料中移除括住字串的引號。引號內的所有字元 (包括分隔符號) 都會保留。如果字串有起始單引號或雙引號，但沒有對應的結束標記，則 COPY 命令無法載入此列，且會傳回錯誤。下表以一些簡單的範例示範含有引號的字串及結果載入的值。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/copy-parameters-data-conversion.html)

ROUNDEC   <a name="copy-roundec"></a>
當輸入值的小數位數超過欄的小數位數時，將數值四捨五入。根據預設，COPY 會視需要截斷值，以符合欄的小數位數。例如，假設將值 `20.259` 載入 DECIMAL(8,2) 欄，COPY 預設會將值截斷為 `20.25`。如果指定 ROUNDEC，則 COPY 會將值四捨五入為 `20.26`。INSERT 命令一律會視需要將值四捨五入，以符合欄的小數位數，因此，COPY 命令搭配 ROUNDEC 參數的行為就如同 INSERT 命令。

TIMEFORMAT [AS] \$1'*timeformat\$1string*' \$1 'auto' \$1 'epochsecs' \$1 'epochmillisecs' \$1  <a name="copy-timeformat"></a>
指定時間格式。如果不指定 TIMEFORMAT，則 TIMESTAMP 欄的預設格式為 `YYYY-MM-DD HH:MI:SS`，TIMESTAMPTZ 欄的預設格式為 `YYYY-MM-DD HH:MI:SSOF`，其中 `OF` 是國際標準時間 (UTC) 的時差。*timeformat\$1string* 中不可包含時區指標。若要載入不是預設格式的 TIMESTAMPTZ 資料，請指定 'auto'；如需詳細資訊，請參閱[對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識](automatic-recognition.md)。如需 *timeformat\$1string* 的相關資訊，請參閱 [DATEFORMAT 和 TIMEFORMAT 字串範例](r_DATEFORMAT_and_TIMEFORMAT_strings.md)。  
`'auto'` 引數可以辨識使用 DATEFORMAT 和 TIMEFORMAT 字串時不支援的多種格式。如果 COPY 命令無法辨識日期或時間值的格式，或者，日期和時間值使用彼此不同的格式，請使用 `'auto'` 引數來搭配 DATEFORMAT 或 TIMEFORMAT 參數。如需詳細資訊，請參閱[對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識](automatic-recognition.md)。  
如果來源資料以 ecpch 時間表示，亦即，自 1970 年 1 月 1 日 00:00:00 UTC 以來的秒數或毫秒數，請指定 `'epochsecs'` 或 `'epochmillisecs'`。  
`'auto'`、`'epochsecs'` 和 `'epochmillisecs'` 關鍵字區分大小寫。  
AS 關鍵字為選用。

TRIMBLANKS   <a name="copy-trimblanks"></a>
從 VARCHAR 字串中移除尾端空格字元。此參數僅適用於 VARCHAR 資料類型的欄。

TRUNCATECOLUMNS   <a name="copy-truncatecolumns"></a>
將欄的資料截斷為適當的字元數，以符合欄規格。僅適用於 VARCHAR 或 CHAR 資料類型的欄，以及大小為 4 MB 或更小的列。

# 資料載入操作
<a name="copy-parameters-data-load"></a>

指定下列參數來管理載入操作的預設行為，以進行故障排除或縮短載入時間。
+ [COMPROWS](#copy-comprows) 
+ [COMPUPDATE](#copy-compupdate) 
+ [IGNOREALLERRORS](#copy-ignoreallerrors) 
+ [MAXERROR](#copy-maxerror) 
+ [NOLOAD](#copy-noload) 
+ [STATUPDATE](#copy-statupdate) <a name="copy-data-load-parameters"></a>Parameters

COMPROWS *numrows*   <a name="copy-comprows"></a>
指定列數做為壓縮分析的樣本大小。分析是以每個資料配量中的列為對象。例如，假設您指定 `COMPROWS 1000000` (1,000,000)，而系統總共包含四個配量，則每個配量最多讀取和分析 250,000 列。  
如果不指定 COMPROWS，則每個配量的樣本大小預設為 100,000。如果 COMPROWS 的值小於每個配量預設的 100,000 列，則會將該值自動提高到預設值。但是，如果載入的資料量不足以構成有意義的樣本，則不會執行自動壓縮。  
如果 COMPROWS 數字大於輸入檔案中的列數，COPY 命令仍會繼續，並對所有可用的列執行壓縮分析。此引數可接受的範圍是介於 1000 到 2147483647 (2,147,483,647) 之間的數字。

COMPUPDATE [ PRESET \$1 \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-compupdate"></a>
控制在 COPY 期間是否自動套用壓縮編碼。  
COMPUPDATE 為 PRESET 時，如果目標資料表為空白，即使資料欄已有 RAW 以外的編碼，COPY 命令也會為每個資料欄選擇壓縮編碼。可以取代目前指定的資料欄編碼。每個資料欄的編碼是以資料欄的資料類型為基礎。不會對任何資料取樣。Amazon Redshift 會自動指派壓縮編碼，如下所示：  
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL 或 DOUBLE PRECISION 資料類型的資料欄會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR 或 VARCHAR 的資料欄會有指派的 LZO 壓縮。
省略 COMPUPDATE 時，只有在目標資料表為空白而您尚未為任何資料欄指定編碼 (RAW 除外) 時，COPY 命令才會為每個資料欄選擇壓縮編碼。每個欄的編碼是由 Amazon Redshift 決定。不會對任何資料取樣。  
當 COMPUPDATE 為 ON (或 TRUE) 或指定了 COMPUPDATE 但未帶選項時，如果資料表是空的，即使資料表欄已有 RAW 以外的編碼，COPY 也會套用自動壓縮。可以取代目前指定的資料欄編碼。每個資料欄的編碼會根據取樣資料的分析。如需詳細資訊，請參閱[利用自動壓縮載入資料表](c_Loading_tables_auto_compress.md)。  
將 COMPUPDATE 設為 OFF (或 FALSE) 時，會停用自動壓縮。不會變更資料欄編碼。  
如需關於分析壓縮的系統資料表資訊，請參閱 [STL\$1ANALYZE\$1COMPRESSION](r_STL_ANALYZE_COMPRESSION.md)。

IGNOREALLERRORS   <a name="copy-ignoreallerrors"></a>
您可以指定此選項來忽略載入作業期間發生的所有錯誤。  
如果您指定 MAXERROR 選項，就無法指定 IGNOREALLERRORS 選項。您無法為包括 ORC 和 Parquet 在內的單欄格式指定 IGNOREALLERRORS 選項。

MAXERROR [AS] *error\$1count*   <a name="copy-maxerror"></a>
如果載入傳回 *error\$1count* 個或更多錯誤，載入會失敗。如果載入傳回的錯誤很少，則會繼續載入，並傳回 INFO 訊息來指出無法載入的列數。當某些列因為格式錯誤或資料有其他不一致情形而無法載入到資料表時，使用此參數可讓載入繼續進行。  
如果要讓載入在發生第一個錯誤時立即失敗，請將此值設為 `0` 或 `1`。AS 關鍵字為選用。MAXERROR 預設值為 `0`，限制為 `100000`。  
 由於 Amazon Redshift 的平行本質，實際報告的錯誤數可能大於指定的 MAXERROR。如果 Amazon Redshift 叢集中的任何節點偵測到已超過 MAXERROR，每個節點會報告所有已遇到的錯誤。

NOLOAD   <a name="copy-noload"></a>
檢查資料檔案的有效性，而不實際載入資料。在執行實際資料載入之前，請使用 NOLOAD 參數來確保資料檔案可載入無誤。搭配 NOLOAD 參數來執行 COPY 的速度比載入資料快很多，因為其只會剖析檔案。

STATUPDATE [ \$1 ON \$1 TRUE \$1 \$1 \$1 OFF \$1 FALSE \$1 ]  <a name="copy-statupdate"></a>
控管在成功的 COPY 命令結束時自動運算和重新整理最佳化工具統計資料。根據預設，如果不使用 STATUPDATE 參數，只要資料表最初是空白，就會自動更新統計資料。  
每當將資料擷取到非空白資料表就會大幅改變資料表大小時，建議您執行 [ANALYZE](r_ANALYZE.md) 命令或使用 STATUPDATE ON 引數來更新統計資料。  
指定 STATUPDATE ON (或 TRUE) 時，不論資料表最初是否空白，都會自動更新統計資料。如果使用 STATUPDATE，則目前使用者必須是資料表擁有者或超級使用者。如果不指定 STATUPDATE，則只需要 INSERT 許可。  
指定 STATUPDATE OFF (或 FALSE) 時永遠不會更新統計資料。  
如需其他資訊，請參閱 [分析資料表](t_Analyzing_tables.md)。

# 依字母排序的參數清單
<a name="r_COPY-alphabetical-parm-list"></a>

下列清單提供每個 COPY 命令參數描述的連結 (依字母順序排列)。
+ [ACCEPTANYDATE](copy-parameters-data-conversion.md#copy-acceptanydate)
+ [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)
+ [ACCESS\$1KEY\$1ID、SECRET\$1ACCESS\$1KEY](copy-parameters-authorization.md#copy-access-key-id-access)
+ [AVRO](copy-parameters-data-format.md#copy-avro)
+ [BLANKSASNULL](copy-parameters-data-conversion.md#copy-blanksasnull)
+ [BZIP2](copy-parameters-file-compression.md#copy-bzip2) 
+ [COMPROWS](copy-parameters-data-load.md#copy-comprows)
+ [COMPUPDATE](copy-parameters-data-load.md#copy-compupdate)
+ [CREDENTIALS](copy-parameters-authorization.md#copy-credentials-cred)
+ [CSV](copy-parameters-data-format.md#copy-csv)
+ [DATEFORMAT](copy-parameters-data-conversion.md#copy-dateformat)
+ [DELIMITER](copy-parameters-data-format.md#copy-delimiter)
+ [EMPTYASNULL](copy-parameters-data-conversion.md#copy-emptyasnull)
+ [ENCODING](copy-parameters-data-conversion.md#copy-encoding)
+ [ENCRYPTED](copy-parameters-data-source-s3.md#copy-encrypted)
+ [ESCAPE](copy-parameters-data-conversion.md#copy-escape)
+ [EXPLICIT_IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
+ [FIXEDWIDTH](copy-parameters-data-format.md#copy-fixedwidth)
+ [FORMAT](copy-parameters-data-format.md#copy-format)
+ [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
+ [GZIP](copy-parameters-file-compression.md#copy-gzip)
+ [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role-iam)
+ [IGNOREALLERRORS](copy-parameters-data-load.md#copy-ignoreallerrors)
+ [IGNOREBLANKLINES](copy-parameters-data-conversion.md#copy-ignoreblanklines)
+ [IGNOREHEADER](copy-parameters-data-conversion.md#copy-ignoreheader)
+ [JSON format for COPY](copy-parameters-data-format.md#copy-json)
+ [LZOP](copy-parameters-file-compression.md#copy-lzop)
+ [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
+ [MASTER_SYMMETRIC_KEY](copy-parameters-data-source-s3.md#copy-master-symmetric-key)
+ [MAXERROR](copy-parameters-data-load.md#copy-maxerror)
+ [NOLOAD](copy-parameters-data-load.md#copy-noload)
+ [NULL AS](copy-parameters-data-conversion.md#copy-null-as)
+ [READRATIO](copy-parameters-data-source-dynamodb.md#copy-readratio)
+ [REGION](copy-parameters-data-source-s3.md#copy-region)
+ [REMOVEQUOTES](copy-parameters-data-conversion.md#copy-removequotes)
+ [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec)
+ [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token)
+ [SHAPEFILE](copy-parameters-data-format.md#copy-shapefile)
+ [SSH](copy-parameters-data-source-ssh.md#copy-ssh)
+ [STATUPDATE](copy-parameters-data-load.md#copy-statupdate)
+ [TIMEFORMAT](copy-parameters-data-conversion.md#copy-timeformat)
+ [TRIMBLANKS](copy-parameters-data-conversion.md#copy-trimblanks)
+ [TRUNCATECOLUMNS](copy-parameters-data-conversion.md#copy-truncatecolumns)
+ [ZSTD](copy-parameters-file-compression.md#copy-zstd)

# 使用須知
<a name="r_COPY_usage_notes"></a>

**Topics**
+ [存取其他 AWS 資源的許可](copy-usage_notes-access-permissions.md)
+ [將 COPY 與 Amazon S3 存取點別名搭配使用](copy-usage_notes-s3-access-point-alias.md)
+ [從 Amazon S3 載入多位元組資料](copy-usage_notes-multi-byte.md)
+ [載入 GEOMETRY 或 GEOGRAPHY 資料類型的欄](copy-usage_notes-spatial-data.md)
+ [載入 HLLSKETCH 資料類型](copy-usage_notes-hll.md)
+ [載入 VARBYTE 資料類型的欄](copy-usage-varbyte.md)
+ [讀取多個檔案時發生錯誤](copy-usage_notes-multiple-files.md)
+ [從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)
+ [從單欄資料格式 COPY](copy-usage_notes-copy-from-columnar.md)
+ [DATEFORMAT 和 TIMEFORMAT 字串](r_DATEFORMAT_and_TIMEFORMAT_strings.md)
+ [對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識](automatic-recognition.md)

# 存取其他 AWS 資源的許可
<a name="copy-usage_notes-access-permissions"></a>

 若要在叢集與其他 AWS 資源之間移動資料，例如 Amazon S3、Amazon DynamoDB、Amazon EMR 或 Amazon EC2，您的叢集必須具有存取資源和執行必要動作的許可。例如，若要從 Amazon S3 載入資料，COPY 必須具備儲存貯體的 LIST 存取權和儲存貯體物件的 GET 存取權。如需最低許可的相關資訊，請參閱 [COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](#copy-usage_notes-iam-permissions)。

叢集必須經過驗證，才能獲得授權來存取資源。您可以選擇下列任一種身分驗證方法：
+ [角色類型存取控制](#copy-usage_notes-access-role-based) – 對於角色型存取控制，您可以指定叢集用於身分驗證和授權的 AWS Identity and Access Management (IAM) 角色。為了保護您的 AWS 登入資料和敏感資料，強烈建議使用角色型身分驗證。
+ [金鑰型存取控制](#copy-usage_notes-access-key-based) – 對於金鑰型存取控制，請以純文字形式提供使用者的 AWS 存取憑證 （存取金鑰 ID 和私密存取金鑰）。

## 角色類型存取控制
<a name="copy-usage_notes-access-role-based"></a>

使用<a name="copy-usage_notes-access-role-based.phrase"></a>角色型存取控制時，叢集會暫時代表您擔任 IAM 角色。然後，根據角色獲予的授權，叢集即可存取所需的 AWS 資源。

建立 IAM *角色*類似於授予許可給使用者，因為它是 AWS 身分，具有判定其在 AWS中可執行和不可執行的操作之許可政策。但是，角色可以由任何需要此角色的實體來擔任，而不必與一個使用者產生獨特的關聯。此外，角色沒有任何相關聯的登入資料 (密碼或存取金鑰)。反之，如果角色與叢集相關聯，則會動態建立存取金鑰並將該金鑰提供給叢集。

我們建議您使用角色型存取控制，因為它除了保護您的 AWS 登入資料之外，還提供更安全、更精細的資源 AWS 和敏感使用者資料的存取控制。

角色型身分驗證提供下列優點：
+ 您可以使用 AWS 標準 IAM 工具來定義 IAM 角色，並將角色與多個叢集建立關聯。修改角色的存取政策時，會將變更自動套用至所有使用該角色的叢集。
+ 您可以定義精細的 IAM 政策，授予特定叢集和資料庫使用者存取特定 AWS 資源和動作的許可。
+ 您的叢集會在執行時間取得臨時工作階段登入資料，並視需要重新整理登入資料，直到操作完成。如果您使用金鑰型臨時登入資料，萬一臨時登入資料在操作完成之前就過期，則操作會失敗。
+ 不會在 SQL 程式碼中儲存或傳輸存取金鑰 ID 和私密存取金鑰。

若要使用角色型存取控制，您必須先使用 Amazon Redshift 服務角色類型建立 IAM 角色，再將該角色連接至叢集。角色至少必須具備 [COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](#copy-usage_notes-iam-permissions)中列出的許可。如需建立 IAM 角色並將其連接至叢集的步驟，請參閱《[Amazon Redshift 管理指南》中的授權 Amazon Redshift 代表您存取 AWS 其他服務](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html)。 **

您可以使用 Amazon Redshift 管理主控台、CLI 或 API 將角色新增至叢集，或檢視與叢集相關聯的角色。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[將 IAM 角色與叢集建立關聯](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html)。

建立 IAM 角色時，IAM 會傳回角色的 Amazon Resource Name (ARN)。若要指定 IAM 角色，請使用 [使用 IAM\$1ROLE 參數](copy-parameters-authorization.md#copy-iam-role) 參數或 [使用 CREDENTIALS 參數](copy-parameters-authorization.md#copy-credentials) 參數來提供角色 ARN。

例如，假設下列角色已附加至叢集。

```
"IamRoleArn": "arn:aws:iam::0123456789012:role/MyRedshiftRole"
```

下列 COPY 命令範例使用 IAM\$1ROLE 參數，搭配上一個範例中的 ARN，以驗證身分並存取 Amazon S3。

```
copy customer from 's3://amzn-s3-demo-bucket/mydata'  
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

下列 COPY 命令範例使用 CREDENTIALS 參數來指定 IAM 角色。

```
copy customer from 's3://amzn-s3-demo-bucket/mydata' 
credentials 
'aws_iam_role=arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

此外，超級使用者可以將 ASSUMEROLE 權限授與資料庫使用者和群組，以提供 COPY 操作角色的存取權。如需相關資訊，請參閱[GRANT](r_GRANT.md)。

## 金鑰型存取控制
<a name="copy-usage_notes-access-key-based"></a>

使用<a name="copy-usage_notes-access-key-based.phrase"></a>金鑰型存取控制，您可以為有權存取包含資料的 AWS 資源的 IAM 使用者提供存取金鑰 ID 和私密存取金鑰。您可以將 [使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數](copy-parameters-authorization.md#copy-access-key-id) 參數一起使用，或使用 [使用 CREDENTIALS 參數](copy-parameters-authorization.md#copy-credentials) 參數。

**注意**  
強烈建議使用 IAM 角色來驗證身分，而不要提供純文字存取金鑰 ID 和私密存取金鑰。如果您選擇以金鑰為基礎的存取控制，則絕不要使用 AWS 您的帳戶 （根） 登入資料。請一律建立 IAM 使用者，並提供該使用者的存取金鑰 ID 和私密存取金鑰。關於建立 IAM 使用者的步驟，請參閱[在您的 AWS 帳戶中建立 IAM 使用者](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html)。

若要使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 來驗證身分，請以授權使用者的存取金鑰 ID 和完整私密存取金鑰，取代 *<access-key-id>* 和 *<secret-access-key>*，如下所示。

```
ACCESS_KEY_ID '<access-key-id>'
SECRET_ACCESS_KEY '<secret-access-key>';
```

若要使用 CREDENTIALS 參數來驗證身分，請以授權使用者的存取金鑰 ID 和完整私密存取金鑰，取代 *<access-key-id>* 和 *<secret-access-key>*，如下所示。

```
CREDENTIALS
'aws_access_key_id=<access-key-id>;aws_secret_access_key=<secret-access-key>';
```

IAM 使用者至少必須具備[COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可](#copy-usage_notes-iam-permissions)中列出的許可。

### 暫時安全憑證
<a name="r_copy-temporary-security-credentials"></a>

 如果使用金鑰型存取控制，您可以利用臨時安全性登入資料，以進一步限制使用者有何權限存取您的資料。角色型身分驗證會自動使用臨時登入資料。

**注意**  
強烈建議使用[role-based access control](#copy-usage_notes-access-role-based.phrase)，而不要建立臨時登入資料並以純文字提供存取金鑰 ID 和私密存取金鑰。角色型存取控制會自動使用暫時憑證。

暫時安全憑證提供加強的安全性，因為有效期限較短，且過期之後不能重複使用。與字符一起產生的存取金鑰 ID 和私密存取金鑰一定要有字符才能使用，而具有這些暫時安全憑證的使用者只能在憑證到期之前存取您的資源。

若要授予使用者暫時存取 資源的權限，請呼叫 AWS Security Token Service (AWS STS) API 操作。 AWS STS API 操作會傳回暫時性安全登入資料，其中包含安全字符、存取金鑰 ID 和私密存取金鑰。如果某使用者需要暫時存取您的資源，您可以將臨時安全性登入資料發行給該使用者。這些使用者可以是現有的 IAM 使用者，或非AWS 使用者。如需建立暫時安全憑證的相關資訊，請參閱《IAM 使用者指南》中的[使用暫時安全憑證](https://docs.aws.amazon.com/STS/latest/UsingSTS/Welcome.html)。

您可以將 [使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數](copy-parameters-authorization.md#copy-access-key-id) 參數與 [SESSION\$1TOKEN](copy-parameters-authorization.md#copy-token) 參數或 [使用 CREDENTIALS 參數](copy-parameters-authorization.md#copy-credentials) 參數一起使用。您也必須提供字符隨附的存取金鑰 ID 和私密存取金鑰。

若要使用 ACCESS\$1KEY\$1ID、SECRET\$1ACCESS\$1KEY 和 SESSION\$1TOKEN 來驗證身分，請取代 *<temporary-access-key-id>*、*<temporary-secret-access-key>* 和 *<temporary-token>*，如下所示。

```
ACCESS_KEY_ID '<temporary-access-key-id>'
SECRET_ACCESS_KEY '<temporary-secret-access-key>'
SESSION_TOKEN '<temporary-token>';
```

若要使用 CREDENTIALS 來驗證身分，請在登入資料字串中包含 `session_token=<temporary-token>`，如下所示。

```
CREDENTIALS
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>';
```

下列範例顯示使用臨時安全性登入資料的 COPY 命令。

```
copy table-name
from 's3://objectpath'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>';
```

下列範例使用臨時登入資料和檔案加密來載入 LISTING 資料表。

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
access_key_id '<temporary-access-key-id>'
secret_access_key '<temporary-secret-access-key>'
session_token '<temporary-token>'
master_symmetric_key '<root-key>'
encrypted;
```

下列範例使用 CREDENTIALS 參數搭配臨時登入資料和檔案加密來載入 LISTING 資料表。

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt'
credentials 
'aws_access_key_id=<temporary-access-key-id>;aws_secret_access_key=<temporary-secret-access-key>;session_token=<temporary-token>;master_symmetric_key=<root-key>'
encrypted;
```

**重要**  
臨時安全性登入資料在 COPY 或 UNLOAD 操作的整個期間內必須有效。如果臨時安全性登入資料在操作期間過期，則命令會失敗，而交易會回復。例如，假設臨時安全性登入資料在 15 分鐘之後過期，而 COPY 操作需要 1 小時，則 COPY 操作在完成之前就會失敗。如果您使用角色型存取，臨時安全性登入資料會自動重新整理，直到操作完成。

## COPY、UNLOAD 和 CREATE LIBRARY 的 IAM 許可
<a name="copy-usage_notes-iam-permissions"></a>

CREDENTIALS 參數所參考的 IAM 角色或使用者至少必須具備下列許可：
+ 從 Amazon S3 COPY 時，具備許可來 LIST Amazon S3 儲存貯體及 GET 要載入的 Amazon S3 物件和資訊清單檔案 (如果使用)。
+ 從 Amazon S3、Amazon EMR 和遠端主機 (SSH) COPY JSON 格式的資料時，具備許可來 LIST 和 GET Amazon S3 上的 JSONPaths 檔案 (如果使用)。
+ 從 DynamoDB COPY 時，具備許可來 SCAN 和 DESCRIBE 要載入的 DynamoDB 資料表。
+ 從 Amazon EMR 叢集 COPY 時，具備許可在 Amazon EMR 叢集上執行 `ListInstances` 動作。
+ UNLOAD 到 Amazon S3 時，對於 Amazon S3 儲存貯體 (要將資料檔案卸載到此處)，具備 GET、LIST 和 PUT 許可。
+ 從 Amazon S3 CREATE LIBRARY 時，具備許可來 LIST Amazon S3 儲存貯體及 GET 要匯入的 Amazon S3 物件。

**注意**  
執行 COPY、UNLOAD 或 CREATE LIBRARY 命令時，如果出現錯誤訊息 `S3ServiceException: Access Denied`，表示叢集沒有 Amazon S3 的適當存取許可。

您可以將 IAM 政策附加至 IAM 角色，而該角色附加至叢集、使用者或使用者所屬的群組，以此來管理 IAM 許可。例如，`AmazonS3ReadOnlyAccess` 受管政策授予 Amazon S3 資源的 LIST 和 GET 許可。如需管理政策的相關資訊，請參閱《IAM 使用者指南》**中的[管理 IAM 政策](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage.html)。

# 將 COPY 與 Amazon S3 存取點別名搭配使用
<a name="copy-usage_notes-s3-access-point-alias"></a>

COPY 支援 Amazon S3 存取點別名。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的[為您的存取點使用儲存貯體型別名](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-alias.html)。

# 從 Amazon S3 載入多位元組資料
<a name="copy-usage_notes-multi-byte"></a>

如果資料包含非 ASCII 多位元組字元 (例如中文或斯拉夫文字元)，您必須將資料載入 VARCHAR 欄。VARCHAR 資料類型支援四位元組 UTF-8 字元，但 CHAR 資料類型只接受單位元組 ASCII 字元。您無法將五位元組或更長的字元載入 Amazon Redshift 資料表。如需詳細資訊，請參閱[多位元組字元](c_Supported_data_types.md#c_Supported_data_types-multi-byte-characters)。

# 載入 GEOMETRY 或 GEOGRAPHY 資料類型的欄
<a name="copy-usage_notes-spatial-data"></a>

您可以將以字元分隔的文字檔案 (例如 CSV 檔案) 中的資料複製到 `GEOMETRY` 或 `GEOGRAPHY` 欄。資料的格式必須是已知二進位格式 (WKB 或 EWKB) 或已知文字格式 (WKT 或 EWKT) 的十六進位形式，並且符合 COPY 命令的單一輸入列的大小上限。如需詳細資訊，請參閱[COPY](r_COPY.md)。

如需有關如何從 Shapefile 中載入的資訊，請參閱[將 Shapefile 載入 Amazon Redshift](spatial-copy-shapefile.md)。

如需 `GEOMETRY` 或 `GEOGRAPHY` 資料類型的相關資訊，請參閱[在 Amazon Redshift 中查詢空間資料](geospatial-overview.md)。

# 載入 HLLSKETCH 資料類型
<a name="copy-usage_notes-hll"></a>

您只能以 Amazon Redshift 支援的稀疏或密集格式複製 HLL 草圖。若要在 HyperLogLog 草圖上使用 COPY 命令，請針對密集 HyperLogLog 草圖使用 Base64 格式，並針對稀疏 HyperLogLog 草圖使用 JSON 格式。如需詳細資訊，請參閱[HyperLogLog 檔函數](hyperloglog-functions.md)。

下列範例使用 CREATE TABLE 和 COPY，將資料從 CSV 檔案匯入資料表。首先，這個範例使用 CREATE TABLE 建立資料表 `t1`。

```
CREATE TABLE t1 (sketch hllsketch, a bigint);
```

然後它使用 COPY 將資料從 CSV 檔案匯入資料表 `t1`。

```
COPY t1 FROM s3://amzn-s3-demo-bucket/unload/' IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' CSV;
```

# 載入 VARBYTE 資料類型的欄
<a name="copy-usage-varbyte"></a>

您可以從 CSV、Parquet 和 ORC 格式的檔案載入資料。對於 CSV，資料會以十六進位表示的 VARBYTE 資料從檔案載入。您無法使用 `FIXEDWIDTH` 選項載入 VARBYTE 資料。不支援 COPY 的 `ADDQUOTES` 或 `REMOVEQUOTES` 選項。VARBYTE 欄不能用作分割欄。

# 讀取多個檔案時發生錯誤
<a name="copy-usage_notes-multiple-files"></a>

COPY 命令是不可分割和交易式。換言之，即使 COPY 命令從多個檔案讀取資料，整個程序仍視為單一交易。如果 COPY 在讀取檔案時發生錯誤，則會自動重試，直到程序逾時為止 (請參閱 [statement\$1timeout](r_statement_timeout.md))，或如果經過很久 (15 到 30 分鐘) 仍無法從 Amazon S3 下載資料，請確定每個檔案只載入一次。如果 COPY 命令失敗，整個交易會取消，而所有變更都會回復。如需如何處理載入錯誤的相關資訊，請參閱[針對資料載入進行故障診斷](t_Troubleshooting_load_errors.md)。

COPY 命令成功起始之後，即使工作階段終止 (例如用戶端中斷連線)，命令也不會失敗。不過，如果 COPY 命令在 BEGIN … END 交易區塊內，而交易區塊因為工作階段終止而未完成，則整個交易 (包括 COPY) 會回復。如需交易的相關資訊，請參閱 [BEGIN](r_BEGIN.md)。

# 從 JSON 格式 COPY
<a name="copy-usage_notes-copy-from-json"></a>

JSON 資料結構由一組物件或陣列組成。JSON *物件*的開頭和結尾是大括號，且包含一組未排序的名稱值對。每一個名稱和值以冒號分隔，而配對以逗號分隔。名稱是以雙引號括住的字串。引號字元必須是簡單引號 (0x22)，而不是斜向或「智慧型」引號。

JSON *陣列* 的開頭和結尾是方括號，且包含一組已排序的值 (以逗號分隔)。值可以是以雙引號括住的字串、數字、布林值 true 或 false、null、JSON 物件或陣列。

JSON 物件和陣列可以是巢狀，以支援階層資料結構。下列範例顯示具有兩個有效物件的 JSON 資料結構。

```
{
    "id": 1006410,
    "title": "Amazon Redshift Database Developer Guide"
}
{
    "id": 100540,
    "name": "Amazon Simple Storage Service User Guide"
}
```

下面以兩個 JSON 陣列顯示同樣的資料。

```
[
    1006410,
    "Amazon Redshift Database Developer Guide"
]
[
    100540,
    "Amazon Simple Storage Service User Guide"
]
```

## 適用於 JSON 的 COPY 選項
<a name="copy-usage-json-options"></a>

將 COPY 與 JSON 格式資料搭配使用時，可以指定下列選項：
+ `'auto' ` - COPY 會自動從 JSON 檔案載入欄位。
+ `'auto ignorecase'` - COPY 會自動從 JSON 檔案載入欄位，同時忽略欄位名稱的大小寫。
+ `s3://jsonpaths_file` - COPY 會使用 JSONPaths 檔案來剖析 JSON 來源資料。*JSONPaths 檔案*是包含單一 JSON 物件的文字檔案，此物件的名稱為 `"jsonpaths"`，並與 JSONPath 表達式陣列搭配成對。如果名稱是 `"jsonpaths"` 以外的任何字串，COPY 會使用 `'auto'` 引數，而不使用 JSONPaths 檔案。

關於如何使用 `'auto'`、`'auto ignorecase'` 或 JSONPaths 檔案及使用 JSON 物件或陣列來載入資料的範例，請參閱[從 JSON 複製的範例](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json)。

## JSONPath 選項
<a name="copy-usage-json-options"></a>

在 Amazon Redshift COPY 語法中，JSONPath 運算式會使用括號或點符號，指定 JSON 階層式資料結構中單一名稱元素的明確路徑。Amazon Redshift 不支援任何可能解析為不明確路徑或多個名稱元素的 JSONPath 元素，例如萬用字元或篩選條件運算式。因此，Amazon Redshift 無法剖析複雜、多層級的資料結構。

以下是 JSONPaths 檔案的範例，其中的 JSONPath 表達式使用方括號標記法。貨幣符號 (\$1) 代表根層級結構。

```
{
    "jsonpaths": [
       "$['id']",
       "$['store']['book']['title']",
	"$['location'][0]" 
    ]
}
```

 在上述範例中，`$['location'][0]` 參考陣列的第一個元素。JSON 採用以零為基礎的陣列索引。陣列索引必須是正整數 (大於或等於零)。

下列範例使用點標記法來示範前一個 JSONPaths 檔案。

```
{
    "jsonpaths": [
       "$.id",
       "$.store.book.title",
	"$.location[0]"
    ]
}
```

`jsonpaths` 陣列中不能混用方括號標記法和點標記法。方括號標記法和點標記法中都可以使用方括號來參考陣列元素。

使用點標記法時，JSONPath 運算式不可包含下列字元：
+ 一般單引號 ( ' ) 
+ 句點，或點 ( . ) 
+ 方括號 ( [ ] )，除非用來參考陣列元素 

如果 JSONPath 運算式所參考的名稱值對中的值是物件或陣列，則會將整個物件或陣列載入為字串，包括大括號或方括號。例如，假設 JSON 資料包含下列物件。

```
{
    "id": 0,
    "guid": "84512477-fa49-456b-b407-581d0d851c3c",
    "isActive": true,
    "tags": [
        "nisi",
        "culpa",
        "ad",
        "amet",
        "voluptate",
        "reprehenderit",
        "veniam"
    ],
    "friends": [
        {
            "id": 0,
            "name": "Martha Rivera"
        },
        {
            "id": 1,
            "name": "Renaldo"
        }
    ]
}
```

JSONPath 表達式 `$['tags']` 會傳回下列值。

```
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]" 
```

JSONPath 表達式 `$['friends'][1]` 會傳回下列值。

```
"{"id": 1,"name": "Renaldo"}" 
```

`jsonpaths` 陣列中的每個 JSONPath 運算式都對應至 Amazon Redshift 目標資料表中的一欄。`jsonpaths` 陣列元素的順序必須符合目標資料表或欄清單 (如果使用欄清單) 中的欄順序。

關於如何使用 `'auto'` 引數或 JSONPaths 檔案及使用 JSON 物件或陣列來載入資料的範例，請參閱[從 JSON 複製的範例](r_COPY_command_examples.md#r_COPY_command_examples-copy-from-json)。

如需如何複製多個 JSON 檔案的相關資訊，請參閱[使用資訊清單指定資料檔案](loading-data-files-using-manifest.md)。

## JSON 中的逸出字元
<a name="copy-usage-json-escape-characters"></a>

COPY 會載入 `\n` 做為新行字元，也會載入 `\t` 做為 Tab 字元。若要載入反斜線，請加上反斜線 ( `\\` ) 來逸出。

例如，假設您在 `escape.json` 儲存貯體的一個名為 `s3://amzn-s3-demo-bucket/json/` 檔案中有下列 JSON。

```
{
  "backslash": "This is a backslash: \\",
  "newline": "This sentence\n is on two lines.",
  "tab": "This sentence \t contains a tab."
}
```

執行下列命令來建立 ESCAPES 資料表並載入 JSON。

```
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35));

copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as json 'auto';
```

查詢 ESCAPES 資料表來檢視結果。

```
select * from escapes;

       backslash        |      newline      |               tab
------------------------+-------------------+----------------------------------
 This is a backslash: \ | This sentence     | This sentence    contains a tab.
                        :  is on two lines.
(1 row)
```

## 遺失數值精確度
<a name="copy-usage-json-rounding"></a>

從 JSON 格式的資料檔案中將數字載入已定義為數值資料類型的欄時，可能會遺失精確度。電腦系統中無法精確表示某些浮點值。因此，從 JSON 檔案複製的資料可能不會如預期般四捨五入。為了避免遺失精確度，建議您使用下列其中一個替代方法：
+ 以字串來表示數字，用雙引號括住值。
+ 使用 [ROUNDEC](copy-parameters-data-conversion.md#copy-roundec) 將數字四捨五入而非截斷。
+ 使用 CSV、字元分隔或固定寬度的文字檔案，而不要使用 JSON 或 Avro 檔案。

# 從單欄資料格式 COPY
<a name="copy-usage_notes-copy-from-columnar"></a>

COPY 可以從 Amazon S3 載入下列單欄格式的資料：
+ ORC
+ Parquet

如需從單欄式資料格式使用 COPY 的範例，請參閱[COPY 範例](r_COPY_command_examples.md)。

COPY 支援單欄格式資料，但有下列考量事項：
+ Amazon S3 儲存貯體必須與 Amazon Redshift 資料庫位於相同的 AWS 區域。
+ 若要透過 VPC 端點存取您的 Amazon S3 資料，請按照《Amazon Redshift 管理指南》**中的[使用 Amazon Redshift Spectrum 搭配增強型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html)所述，使用 IAM 政策和 IAM 角色來設定存取。
+ COPY 不會自動套用壓縮編碼。
+ 僅支援下列 COPY 參數：
  + [ACCEPTINVCHARS](copy-parameters-data-conversion.md#copy-acceptinvchars)：從 ORC 或 Parquet 檔案複製時。
  + [FILLRECORD](copy-parameters-data-conversion.md#copy-fillrecord)
  + [FROM](copy-parameters-data-source-s3.md#copy-parameters-from)
  + [IAM\$1ROLE](copy-parameters-authorization.md#copy-iam-role)
  + [CREDENTIALS](copy-parameters-authorization.md#copy-credentials)
  + [STATUPDATE ](copy-parameters-data-load.md#copy-statupdate)
  + [MANIFEST](copy-parameters-data-source-s3.md#copy-manifest)
  + [EXPLICIT\$1IDS](copy-parameters-data-conversion.md#copy-explicit-ids)
+ 如果 COPY 於載入時發生錯誤，命令會失敗。單欄資料類型不支援 ACCEPTANYDATE 和 MAXERROR。
+ 錯誤訊息會傳送給 SQL 用戶端。一些錯誤會記錄在 STL\$1LOAD\$1ERRORS 和 STL\$1ERROR 中。
+ COPY 會依欄在單欄資料檔案中出現的同樣順序，將值插入目標資料表的欄。目標資料表的欄數和資料檔案的欄數必須相符。
+ 如果您在 COPY 操作中指定的檔案包含下列其中一個副檔名，則不需要新增任何參數，我們就會將資料解壓縮：
  + `.gz`
  + `.snappy`
  + `.bz2`
+ 從 Parquet 和 ORC 檔案格式 COPY 需用到 Redshift Spectrum 和儲存貯體存取權。若要針對這些格式使用 COPY，請確定沒有任何 IAM 政策會封鎖使用 Amazon S3 預先簽章的 URL。Amazon Redshift 產生的預先簽章 URL 有效期為 1 小時，如此 Amazon Redshift 就有足夠的時間從 Amazon S3 儲存貯體載入所有檔案。COPY 從單欄資料格式掃描的每個檔案都會產生唯一的預先簽章 URL。對於包含 `s3:signatureAge` 動作的儲存貯體政策，請務必將值設定為至少 3,600,000 毫秒。如需詳細資訊，請參閱[使用 Amazon Redshift Spectrum 搭配增強型 VPC 路由](https://docs.aws.amazon.com/redshift/latest/mgmt/spectrum-enhanced-vpc.html)。
+ 單欄資料格式的 COPY 不支援搭配 REGION 參數使用。即使您的 Amazon S3 儲存貯體和資料庫位於相同的 中 AWS 區域，您可能會遇到錯誤，例如 PARQUET 型 COPY 不支援 REGION 引數。
+ 單欄格式的 COPY 現在支援並行擴展。若要啟用並行擴展，請參閱[設定並行擴展佇列](https://docs.aws.amazon.com/redshift/latest/dg/concurrency-scaling.html#concurrency-scaling-queues)。

# DATEFORMAT 和 TIMEFORMAT 字串
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings"></a>

COPY 命令使用 DATEFORMAT 和 TIMEFORMAT 選項來剖析來源資料中的日期和時間值。DATEFORMAT 和 TIMEFORMAT 是格式化字串，必須符合來源資料的日期和時間值的格式。例如，使用日期值 `Jan-01-1999` 載入來源資料的 COPY 命令必須包含下列 DATEFORMAT 字串：

```
COPY ...
            DATEFORMAT AS 'MON-DD-YYYY'
```

如需管理 COPY 資料轉換的相關資訊，請參閱[資料轉換參數](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-conversion.html)。

DATEFORMAT 和 TIMEFORMAT 字串可以包含日期時間分隔符號 (例如 '`-`'、'`/`' 或 '`:`')，以及下表中的日期部分和時間部分格式。

**注意**  
如果您的日期或時間值的格式無法符合以下日期部分和時間部分，或者您的日期和時間值使用的格式彼此不同，請使用 `'auto'` 引數來搭配 DATEFORMAT 或 TIMEFORMAT 參數。`'auto'` 引數可以辨識使用 DATEFORMAT 或 TIMEFORMAT 字串時不支援的多種格式。如需詳細資訊，請參閱[對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識](automatic-recognition.md)。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

預設日期格式為 YYYY-MM-DD。不含時區的預設時間戳記 (TIMESTAMP) 格式為 YYYY-MM-DD HH:MI:SS。具有時區 (TIMESTAMPTZ) 格式的預設時間戳記為 YYYY-MM-DD HH:MI:SSOF，其中 OF 是與 UTC 的偏移量 (例如 -8:00。不能在 timeformat\$1string 中包含時區指標 (TZ、tz 或 OF)。秒 (SS) 欄位也支援小數秒到微秒的詳細程度。若要載入非預設格式的 TIMESTAMPTZ 資料，請指定 'auto'。

以下是可能在來源資料中遇到的一些範例日期或時間，以及對應的 DATEFORMAT 或 TIMEFORMAT 字串。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_DATEFORMAT_and_TIMEFORMAT_strings.html)

## 範例
<a name="r_DATEFORMAT_and_TIMEFORMAT_strings-examples"></a>

如需使用 TIMEFORMAT 的範例，請參閱[載入時間戳記或日期戳記](r_COPY_command_examples.md#r_COPY_command_examples-load-a-time-datestamp)。

# 對 DATEFORMAT 和 TIMEFORMAT 使用自動辨識
<a name="automatic-recognition"></a>

如果指定 `'auto'` 做為 DATEFORMAT 或 TIMEFORMAT 參數的引數，Amazon Redshift 會自動辨識和轉換來源資料中的日期格式或時間格式。下列顯示一個範例。

```
copy favoritemovies from 'dynamodb://ProductCatalog' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
dateformat 'auto';
```

搭配 DATEFORMAT 和 TIMEFORMAT 的 `'auto'` 引數一起使用時，COPY 會辨識和轉換 [DATEFORMAT 和 TIMEFORMAT 字串範例](r_DATEFORMAT_and_TIMEFORMAT_strings.md) 中資料表所列出的日期和時間格式。此外，`'auto'` 引數還可以辨識下列格式 (使用 DATEFORMAT 和 TIMEFORMAT 字串時不支援這些格式)。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/automatic-recognition.html)

自動辨識不支援 epoch 秒和 epoch 毫秒。

若要測試日期或時間戳記值是否會自動轉換，請使用 CAST 函數來嘗試將字串轉換為日期或時間戳記值。例如，下列命令測試時間戳記值 `'J2345678 04:05:06.789'`：

```
create table formattest (test char(21));
insert into formattest values('J2345678 04:05:06.789');
select test, cast(test as timestamp) as timestamp, cast(test as date) as date from formattest;

        test          |      timestamp      |	date
----------------------+---------------------+------------
J2345678 04:05:06.789   1710-02-23 04:05:06	1710-02-23
```

如果 DATE 欄的來源資料包含時間資訊，則會截斷時間部分。如果 TIMESTAMP 欄的來源資料省略時間資訊，則時間部分會使用 00:00:00。

# COPY 範例
<a name="r_COPY_command_examples"></a>

**注意**  
這些範例包含換行以方便閱讀。請勿在 *credentials-args* 字串中包含換行或空格。

**Topics**
+ [從 DynamoDB 資料表載入 FAVORITEMOVIES](#r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table)
+ [從 Amazon S3 儲存貯體載入 LISTING](#r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket)
+ [從 Amazon EMR 叢集載入 LISTING](#copy-command-examples-emr)
+ [Example: COPY from Amazon S3 using a manifest](#copy-command-examples-manifest)
+ [從縱線分隔檔案 (預設分隔符號) 載入 LISTING](#r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter)
+ [使用 Parquet 格式的單欄資料載入 LISTING](#r_COPY_command_examples-load-listing-from-parquet)
+ [使用 ORC 格式的單欄資料載入 LISTING](#r_COPY_command_examples-load-listing-from-orc)
+ [使用選項載入 EVENT](#r_COPY_command_examples-load-event-with-options)
+ [從固定寬度資料檔案載入 VENUE](#r_COPY_command_examples-load-venue-from-a-fixed-width-data-file)
+ [從 CSV 檔案載入 CATEGORY](#load-from-csv)
+ [載入 VENUE 時將明確值提供給 IDENTITY 欄](#r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column)
+ [從縱線分隔 GZIP 檔案載入 TIME](#r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file)
+ [載入時間戳記或日期戳記](#r_COPY_command_examples-load-a-time-datestamp)
+ [從含有預設值的檔案載入資料](#r_COPY_command_examples-load-data-from-a-file-with-default-values)
+ [搭配 ESCAPE 選項來 COPY 資料](#r_COPY_command_examples-copy-data-with-the-escape-option)
+ [從 JSON 複製的範例](#r_COPY_command_examples-copy-from-json)
+ [從 Avro 複製的範例](#r_COPY_command_examples-copy-from-avro)
+ [準備要搭配 ESCAPE 選項來 COPY 的檔案](#r_COPY_preparing_data)
+ [將 Shapefile 載入 Amazon Redshift](#copy-example-spatial-copy-shapefile)
+ [具有 NOLOAD 選項的 COPY 命令](#r_COPY_command_examples-load-noload-option)
+ [COPY 命令搭配多位元組分隔符號和 ENCODING 選項](#r_COPY_command_examples-load-encoding-multibyte-delimiter-option)

## 從 DynamoDB 資料表載入 FAVORITEMOVIES
<a name="r_COPY_command_examples-load-favoritemovies-from-an-amazon-dynamodb-table"></a>

 AWS SDKs 包含建立名為*電影*之 DynamoDB 資料表的簡單範例。(關於此範例，請參閱 [DynamoDB 入門](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GettingStarted.html)。) 下列範例將 DynamoDB 資料表中的資料載入 Amazon Redshift MOVIES 資料表。Amazon Redshift 資料表必須已存在於資料庫中。

```
copy favoritemovies from 'dynamodb://Movies'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
readratio 50;
```

## 從 Amazon S3 儲存貯體載入 LISTING
<a name="r_COPY_command_examples-load-listing-from-an-amazon-s3-bucket"></a>

以下範例從 Amazon S3 儲存貯體載入 LISTING。COPY 命令會載入 `/data/listing/` 資料夾中的所有檔案。

```
copy listing
from 's3://amzn-s3-demo-bucket/data/listing/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## 從 Amazon EMR 叢集載入 LISTING
<a name="copy-command-examples-emr"></a>

下列範例從 Amazon EMR 叢集的 lzop 壓縮檔案中，將 Tab 字元分隔資料載入 SALES 資料表。COPY 會載入 `myoutput/` 資料夾中開頭為 `part-` 的每個檔案。

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/part-*' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '\t' lzop;
```

下列範例將 Amazon EMR 叢集上的 JSON 格式資料載入 SALES 資料表。COPY 會載入 `myoutput/json/` 資料夾中的每個檔案。

```
copy sales
from 'emr://j-SAMPLE2B500FC/myoutput/json/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON 's3://amzn-s3-demo-bucket/jsonpaths.txt';
```

## 使用資訊清單指定資料檔案
<a name="copy-command-examples-manifest"></a>

您可以使用清單檔案來確保 COPY 命令從 Amazon S3 載入所有必要檔案 (且只有必要檔案)。需要從不同儲存貯體載入多個檔案，或載入不共用相同字首的檔案時，您也可以使用資訊清單。

例如，假設您需要載入下列三個檔案：`custdata1.txt`、`custdata2.txt` 和 `custdata3.txt`。您可以使用下列命令指定字首，以載入 `amzn-s3-demo-bucket` 中開頭為 `custdata` 的所有檔案：

```
copy category
from 's3://amzn-s3-demo-bucket/custdata' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

如果因為錯誤而只有兩個檔案存在，則 COPY 只會載入那兩個檔案，然後就順利完成，導致資料載入不完整。如果儲存貯體中有一個不需要的檔案剛好也使用相同的字首，例如名為 `custdata.backup` 的檔案，則 COPY 也會載入此檔案，導致載入不需要的資料。

若要確保載入所有必要檔案並防止載入不需要的檔案，您可以使用資訊清單檔案。資訊清單是 JSON 格式的文字檔案，其中列出要由 COPY 命令處理的檔案。例如，下列資訊清單會載入上述範例中的三個檔案。

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.1",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.2",
         "mandatory":true
      },
      {  
         "url":"s3://amzn-s3-demo-bucket/custdata.3",
         "mandatory":true
      }
   ]
}
```

選用的 `mandatory` 旗標指出如果檔案不存在，則 COPY 是否應該終止。預設值為 `false`。不考慮任何必要設定，只要找不到檔案，COPY 就會終止。在此範例中，如果找不到任何檔案，COPY 會傳回錯誤。如果您僅指定金鑰前綴 (例如 `custdata.backup`)，則可能已挑選的不必要檔案會被忽略，因為這些檔案不在資訊清單上。

載入格式為 ORC 或 Parquet 的資料檔案時，需要 `meta` 欄位，如下列範例所示。

```
{  
   "entries":[  
      {  
         "url":"s3://amzn-s3-demo-bucket1/orc/2013-10-04-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      },
      {  
         "url":"s3://amzn-s3-demo-bucket2/orc/2013-10-05-custdata",
         "mandatory":true,
         "meta":{  
            "content_length":99
         }
      }
   ]
}
```

以下範例使用名為 `cust.manifest` 的資訊清單。

```
copy customer
from 's3://amzn-s3-demo-bucket/cust.manifest' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc
manifest;
```

您可以使用資訊清單從不同儲存貯體載入檔案，或載入不共用相同字首的檔案。下列範例示範的 JSON 會從名稱開頭為日期戳記的檔案載入資料。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/2013-10-04-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-05-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-06-custdata.txt","mandatory":true},
    {"url":"s3://amzn-s3-demo-bucket/2013-10-07-custdata.txt","mandatory":true}
  ]
}
```

只要儲存貯體與叢集位於相同的 AWS 區域，資訊清單就可以列出位於不同儲存貯體中的檔案。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata1.txt","mandatory":false},
    {"url":"s3://amzn-s3-demo-bucket2/custdata2.txt","mandatory":false}
  ]
}
```

## 從縱線分隔檔案 (預設分隔符號) 載入 LISTING
<a name="r_COPY_command_examples-load-listing-from-a-pipe-delimited-file-default-delimiter"></a>

下列範例是非常簡單的案例，其中沒有指定任何選項，且輸入檔案包含預設分隔符號，即縱線字元 ('\$1')。

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

## 使用 Parquet 格式的單欄資料載入 LISTING
<a name="r_COPY_command_examples-load-listing-from-parquet"></a>

下列範例從 Amazon S3 上名為 parquet 的資料夾載入資料。

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/parquet/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as parquet;
```

## 使用 ORC 格式的單欄資料載入 LISTING
<a name="r_COPY_command_examples-load-listing-from-orc"></a>

下列範例從 Amazon S3 上名為 `orc` 的資料夾載入資料。

```
copy listing 
from 's3://amzn-s3-demo-bucket/data/listings/orc/' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as orc;
```

## 使用選項載入 EVENT
<a name="r_COPY_command_examples-load-event-with-options"></a>

下列範例將縱線分隔資料載入 EVENT 資料表，並套用下列規則：
+ 如果使用成對的引號來括住任何字元字串，則會移除引號。
+ 都會將空字串和含有空白的字串載入為 NULL 值。
+ 如果傳回 5 個以上的錯誤，載入會失敗。
+ 時間戳記值必須符合指定的格式；例如，有效時間戳記為 `2008-09-26 05:43:12`。

```
copy event
from 's3://amzn-s3-demo-bucket/data/allevents_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
removequotes
emptyasnull
blanksasnull
maxerror 5
delimiter '|'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

## 從固定寬度資料檔案載入 VENUE
<a name="r_COPY_command_examples-load-venue-from-a-fixed-width-data-file"></a>

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue_fw.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth 'venueid:3,venuename:25,venuecity:12,venuestate:2,venueseats:6';
```

上述範例假設資料檔案的格式與所顯示的樣本資料相同。在下列樣本中，空格充當預留位置，讓所有欄都是規格所指明的相同寬度：

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
```

## 從 CSV 檔案載入 CATEGORY
<a name="load-from-csv"></a>

假設您想要將下表所示的值載入 CATEGORY。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_COPY_command_examples.html)

下列範例顯示文字檔案的內容，欄位值以逗號分隔。

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,All "non-musical" theatre  
14,Shows,Opera,All opera, light, and "rock" opera
15,Concerts,Classical,All symphony, concerto, and choir concerts
```

如果您載入此檔案時使用 DELIMITER 參數來指定逗號分隔輸入，COPY 命令會失敗，因為有些輸入欄位包含逗號。您可以使用 CSV 參數，並以引號字元括住含有逗號的欄位，即可避免此問題。如果引號括住的字串內出現引號字元，則需要多加一個引號字元才能將其逸出。預設引號字元是雙引號，所以您需要多加一個雙引號來逸出每一個雙引號。新的輸入檔案如下所示。

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,"All ""non-musical"" theatre"
14,Shows,Opera,"All opera, light, and ""rock"" opera"
15,Concerts,Classical,"All symphony, concerto, and choir concerts"
```

假設檔案名稱為 `category_csv.txt`，您可以使用下列 COPY 命令來載入檔案：

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv;
```

或者，若要避免需要逸出輸入中的雙引號，您可以使用 QUOTE AS 參數來指定不同的引號字元。例如，下列的 `category_csv.txt` 版本使用 '`%`' 做為引號字元。

```
12,Shows,Musicals,Musical theatre
13,Shows,Plays,%All "non-musical" theatre%
14,Shows,Opera,%All opera, light, and "rock" opera%
15,Concerts,Classical,%All symphony, concerto, and choir concerts%
```

下列 COPY 命令使用 QUOTE AS 來載入 `category_csv.txt`：

```
copy category
from 's3://amzn-s3-demo-bucket/data/category_csv.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
csv quote as '%';
```

## 載入 VENUE 時將明確值提供給 IDENTITY 欄
<a name="r_COPY_command_examples-load-venue-with-explicit-values-for-an-identity-column"></a>

下列範例假設建立 VENUE 資料表時，至少有一欄 (例如 `venueid` 欄) 指定為 IDENTITY 欄。此命令覆寫 IDENTITY 預設行為，亦即自動產生 IDENTITY 欄的值，而改以從 venue.txt 檔案載入明確值。使用 EXLICIT\$1IDS 選項時，Amazon Redshift 不會檢查是否將重複的 IDENTITY 值載入到資料表中。

```
copy venue
from 's3://amzn-s3-demo-bucket/data/venue.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
explicit_ids;
```

## 從縱線分隔 GZIP 檔案載入 TIME
<a name="r_COPY_command_examples-load-time-from-a-pipe-delimited-gzip-file"></a>

下列範例從縱線分隔 GZIP 檔案載入 TIME 資料表：

```
copy time
from 's3://amzn-s3-demo-bucket/data/timerows.gz' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
gzip
delimiter '|';
```

## 載入時間戳記或日期戳記
<a name="r_COPY_command_examples-load-a-time-datestamp"></a>

下列範例載入含有格式化時間戳記的資料。

**注意**  
`HH:MI:SS` 的 TIMEFORMAT 也可以支援超過 `SS` 的小數秒，精細程度可達到微秒。此範例中使用的檔案 `time.txt` 包含一列，即 `2009-01-12 14:15:57.119568`。

```
copy timestamp1 
from 's3://amzn-s3-demo-bucket/data/time.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
timeformat 'YYYY-MM-DD HH:MI:SS';
```

此複製的結果如下所示：

```
select * from timestamp1;
c1
----------------------------
2009-01-12 14:15:57.119568
(1 row)
```

## 從含有預設值的檔案載入資料
<a name="r_COPY_command_examples-load-data-from-a-file-with-default-values"></a>

下列範例使用一個從 TICKIT 資料庫中的 VENUE 資料表變化而來的版本。假設 VENUE\$1NEW 資料表是使用下列陳述式來定義：

```
create table venue_new(
venueid smallint not null,
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

假設 venue\$1noseats.txt 資料檔案的 VENUESEATS 欄沒有值，如下列範例所示：

```
1|Toyota Park|Bridgeview|IL|
2|Columbus Crew Stadium|Columbus|OH|
3|RFK Stadium|Washington|DC|
4|CommunityAmerica Ballpark|Kansas City|KS|
5|Gillette Stadium|Foxborough|MA|
6|New York Giants Stadium|East Rutherford|NJ|
7|BMO Field|Toronto|ON|
8|The Home Depot Center|Carson|CA|
9|Dick's Sporting Goods Park|Commerce City|CO|
10|Pizza Hut Park|Frisco|TX|
```

下列 COPY 陳述式可成功從檔案載入資料表，並將 DEFAULT 值 ('1000') 套用至省略的欄：

```
copy venue_new(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_noseats.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

現在檢視已載入的資料表：

```
select * from venue_new order by venueid;
venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |       1000
2 | Columbus Crew Stadium      | Columbus        | OH         |       1000
3 | RFK Stadium                | Washington      | DC         |       1000
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |       1000
5 | Gillette Stadium           | Foxborough      | MA         |       1000
6 | New York Giants Stadium    | East Rutherford | NJ         |       1000
7 | BMO Field                  | Toronto         | ON         |       1000
8 | The Home Depot Center      | Carson          | CA         |       1000
9 | Dick's Sporting Goods Park | Commerce City   | CO         |       1000
10 | Pizza Hut Park             | Frisco          | TX         |       1000
(10 rows)
```

在下列範例中，除了假設檔案不含 VENUESEATS 資料，也假設不含 VENUENAME 資料：

```
1||Bridgeview|IL|
2||Columbus|OH|
3||Washington|DC|
4||Kansas City|KS|
5||Foxborough|MA|
6||East Rutherford|NJ|
7||Toronto|ON|
8||Carson|CA|
9||Commerce City|CO|
10||Frisco|TX|
```

 使用同樣的資料表定義，下列 COPY 陳述式會失敗，因為未指定 VENUENAME 的 DEFAULT 值，且 VENUENAME 是 NOT NULL 欄：

```
copy venue(venueid, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

現在假設一個使用 IDENTITY 欄的變化版 VENUE 資料表：

```
create table venue_identity(
venueid int identity(1,1),
venuename varchar(100) not null,
venuecity varchar(30),
venuestate char(2),
venueseats integer not null default '1000');
```

如同上述範例，假設 VENUESEATS 欄在來源檔案中沒有對應的值。下列 COPY 陳述式可成功載入資料表，包括預先定義的 IDENTITY 資料值，而不是自動產生那些值：

```
copy venue(venueid, venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

此陳述式會失敗，因為不含 IDENTITY 欄 (欄清單中缺少 VENUEID)，卻包含 EXPLICIT\$1IDS 參數：

```
copy venue(venuename, venuecity, venuestate) 
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|' explicit_ids;
```

此陳述式會失敗，因為不含 EXPLICIT\$1IDS 參數：

```
copy venue(venueid, venuename, venuecity, venuestate)
from 's3://amzn-s3-demo-bucket/data/venue_pipe.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter '|';
```

## 搭配 ESCAPE 選項來 COPY 資料
<a name="r_COPY_command_examples-copy-data-with-the-escape-option"></a>

下列範例示範如何載入符合分隔符號字元 (在此例子中是縱線字元) 的字元。在輸入檔案中，請確定您要載入的所有縱線字元 (\$1) 都以反斜線字元 (\$1) 逸出。載入以 ESCAPE 參數載入檔案。

```
$ more redshiftinfo.txt
1|public\|event\|dwuser
2|public\|sales\|dwuser

create table redshiftinfo(infoid int,tableinfo varchar(50));

copy redshiftinfo from 's3://amzn-s3-demo-bucket/data/redshiftinfo.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
delimiter '|' escape;

select * from redshiftinfo order by 1;
infoid |       tableinfo
-------+--------------------
1      | public|event|dwuser
2      | public|sales|dwuser
(2 rows)
```

如果不指定 ESCAPE 參數，此 COPY 命令會失敗並傳回 `Extra column(s) found` 錯誤。

**重要**  
如果您使用 COPY 搭配 ESCAPE 參數來載入資料，則在 UNLOAD 命令中也必須指定 ESCAPE 參數，以產生對等的輸出檔案。同樣地，如果使用 ESCAPE 參數來 UNLOAD，則在 COPY 相同的資料時需要使用 ESCAPE。

## 從 JSON 複製的範例
<a name="r_COPY_command_examples-copy-from-json"></a>

在下列範例中，您會將下列資料載入 CATEGORY 資料表。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [使用 'auto' 選項從 JSON 資料載入](#copy-from-json-examples-using-auto)
+ [使用 'auto ignorecase' 選項從 JSON 資料載入](#copy-from-json-examples-using-auto-ignorecase)
+ [使用 JSONPaths 檔案從 JSON 資料載入](#copy-from-json-examples-using-jsonpaths)
+ [使用 JSONPaths 檔案從 JSON 陣列載入](#copy-from-json-examples-using-jsonpaths-arrays)

### 使用 'auto' 選項從 JSON 資料載入
<a name="copy-from-json-examples-using-auto"></a>

若要使用 `'auto'` 選項從 JSON 資料載入，JSON 資料必須包含一組物件。金鑰名稱必須符合欄名稱，但順序並不重要。以下顯示一個名為 `category_object_auto.json` 之檔案的內容。

```
{
    "catdesc": "Major League Baseball",
    "catid": 1,
    "catgroup": "Sports",
    "catname": "MLB"
}
{
    "catgroup": "Sports",
    "catid": 2,
    "catname": "NHL",
    "catdesc": "National Hockey League"
}
{
    "catid": 3,
    "catname": "NFL",
    "catgroup": "Sports",
    "catdesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "catid": 4,
    "catgroup": "Sports",
    "catname": "NBA",
    "catdesc": "National Basketball Association"
}
{
    "catid": 5,
    "catgroup": "Shows",
    "catname": "Musicals",
    "catdesc": "All symphony, concerto, and choir concerts"
}
```

若要從上述範例的 JSON 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto';
```

### 使用 'auto ignorecase' 選項從 JSON 資料載入
<a name="copy-from-json-examples-using-auto-ignorecase"></a>

若要使用 `'auto ignorecase'` 選項從 JSON 資料載入，JSON 資料必須包含一組物件。索引鍵名稱的大小寫不必符合欄名稱，順序也不重要。以下顯示一個名為 `category_object_auto-ignorecase.json` 之檔案的內容。

```
{
    "CatDesc": "Major League Baseball",
    "CatID": 1,
    "CatGroup": "Sports",
    "CatName": "MLB"
}
{
    "CatGroup": "Sports",
    "CatID": 2,
    "CatName": "NHL",
    "CatDesc": "National Hockey League"
}
{
    "CatID": 3,
    "CatName": "NFL",
    "CatGroup": "Sports",
    "CatDesc": "National Football League"
}
{
    "bogus": "Bogus Sports LLC",
    "CatID": 4,
    "CatGroup": "Sports",
    "CatName": "NBA",
    "CatDesc": "National Basketball Association"
}
{
    "CatID": 5,
    "CatGroup": "Shows",
    "CatName": "Musicals",
    "CatDesc": "All symphony, concerto, and choir concerts"
}
```

若要從上述範例的 JSON 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_auto ignorecase.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 'auto ignorecase';
```

### 使用 JSONPaths 檔案從 JSON 資料載入
<a name="copy-from-json-examples-using-jsonpaths"></a>

如果 JSON 資料物件沒有直接對應至欄名稱，您可以使用 JSONPaths 檔案將 JSON 元素映射至欄。JSON 來源資料中的順序並不重要，但 JSONPaths 檔案運算式的順序必須符合欄順序。假設您有下列資料檔案，名稱為 `category_object_paths.json`。

```
{
    "one": 1,
    "two": "Sports",
    "three": "MLB",
    "four": "Major League Baseball"
}
{
    "three": "NHL",
    "four": "National Hockey League",
    "one": 2,
    "two": "Sports"
}
{
    "two": "Sports",
    "three": "NFL",
    "one": 3,
    "four": "National Football League"
}
{
    "one": 4,
    "two": "Sports",
    "three": "NBA",
    "four": "National Basketball Association"
}
{
    "one": 6,
    "two": "Shows",
    "three": "Musicals",
    "four": "All symphony, concerto, and choir concerts"
}
```

下列 JSONPaths 檔案 (名為 `category_jsonpath.json`) 將來源資料映射至資料表欄。

```
{
    "jsonpaths": [
        "$['one']",
        "$['two']",
        "$['three']",
        "$['four']"
    ]
}
```

若要從上述範例的 JSON 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_jsonpath.json';
```

### 使用 JSONPaths 檔案從 JSON 陣列載入
<a name="copy-from-json-examples-using-jsonpaths-arrays"></a>

若要從包含一組陣列的 JSON 資料載入，您必須使用 JSONPaths 檔案將陣列元素映射至欄。假設您有下列資料檔案，名稱為 `category_array_data.json`。

```
[1,"Sports","MLB","Major League Baseball"]
[2,"Sports","NHL","National Hockey League"]
[3,"Sports","NFL","National Football League"]
[4,"Sports","NBA","National Basketball Association"]
[5,"Concerts","Classical","All symphony, concerto, and choir concerts"]
```

下列 JSONPaths 檔案 (名為 `category_array_jsonpath.json`) 將來源資料映射至資料表欄。

```
{
    "jsonpaths": [
        "$[0]",
        "$[1]",
        "$[2]",
        "$[3]"
    ]
}
```

若要從上述範例的 JSON 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_array_data.json'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
json 's3://amzn-s3-demo-bucket/category_array_jsonpath.json';
```

## 從 Avro 複製的範例
<a name="r_COPY_command_examples-copy-from-avro"></a>

在下列範例中，您會將下列資料載入 CATEGORY 資料表。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_COPY_command_examples.html)

**Topics**
+ [使用 'auto' 選項從 Avro 資料載入](#copy-from-avro-examples-using-auto)
+ [使用 'auto ignorecase' 選項從 Avro 資料載入](#copy-from-avro-examples-using-auto-ignorecase)
+ [使用 JSONPaths 檔案從 Avro 資料載入](#copy-from-avro-examples-using-avropaths)

### 使用 'auto' 選項從 Avro 資料載入
<a name="copy-from-avro-examples-using-auto"></a>

若要使用 `'auto'` 引數從 Avro 資料載入，Avro 結構描述中的欄位名稱必須符合欄名稱。使用 `'auto'` 引數時，順序並不重要。以下顯示一個名為 `category_auto.avro` 之檔案的結構描述。

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "catid", "type": "int"},
        {"name": "catdesc", "type": "string"},
        {"name": "catname", "type": "string"},
        {"name": "catgroup", "type": "string"},
}
```

Avro 檔案中的資料是二進位格式，無法直接閱讀。以下顯示 `category_auto.avro` 檔案中之資料的 JSON 表示法。

```
{
   "catid": 1,
   "catdesc": "Major League Baseball",
   "catname": "MLB",
   "catgroup": "Sports"
}
{
   "catid": 2,
   "catdesc": "National Hockey League",
   "catname": "NHL",
   "catgroup": "Sports"
}
{
   "catid": 3,
   "catdesc": "National Basketball Association",
   "catname": "NBA",
   "catgroup": "Sports"
}
{
   "catid": 4,
   "catdesc": "All symphony, concerto, and choir concerts",
   "catname": "Classical",
   "catgroup": "Concerts"
}
```

若要從上述範例的 Avro 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto';
```

### 使用 'auto ignorecase' 選項從 Avro 資料載入
<a name="copy-from-avro-examples-using-auto-ignorecase"></a>

若要使用 `'auto ignorecase'` 引數從 Avro 資料載入，Avro 結構描述中欄位名稱的大小寫不必符合欄名稱的大小寫。使用 `'auto ignorecase'` 引數時，順序並不重要。以下顯示一個名為 `category_auto-ignorecase.avro` 之檔案的結構描述。

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "CatID", "type": "int"},
        {"name": "CatDesc", "type": "string"},
        {"name": "CatName", "type": "string"},
        {"name": "CatGroup", "type": "string"},
}
```

Avro 檔案中的資料是二進位格式，無法直接閱讀。以下顯示 `category_auto-ignorecase.avro` 檔案中之資料的 JSON 表示法。

```
{
   "CatID": 1,
   "CatDesc": "Major League Baseball",
   "CatName": "MLB",
   "CatGroup": "Sports"
}
{
   "CatID": 2,
   "CatDesc": "National Hockey League",
   "CatName": "NHL",
   "CatGroup": "Sports"
}
{
   "CatID": 3,
   "CatDesc": "National Basketball Association",
   "CatName": "NBA",
   "CatGroup": "Sports"
}
{
   "CatID": 4,
   "CatDesc": "All symphony, concerto, and choir concerts",
   "CatName": "Classical",
   "CatGroup": "Concerts"
}
```

若要從上述範例的 Avro 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_auto-ignorecase.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
format as avro 'auto ignorecase';
```

### 使用 JSONPaths 檔案從 Avro 資料載入
<a name="copy-from-avro-examples-using-avropaths"></a>

如果 Avro 結構描述中的欄位名稱沒有直接對應至欄名稱，您可以使用 JSONPaths 檔案將結構描述元素映射至欄。JSONPaths 檔案表達式的順序必須符合欄順序。

假設您有一個名為 `category_paths.avro` 的資料檔案，其中包含的資料與上述範例相同，但使用下列結構描述。

```
{
    "name": "category",
    "type": "record",
    "fields": [
        {"name": "id", "type": "int"},
        {"name": "desc", "type": "string"},
        {"name": "name", "type": "string"},
        {"name": "group", "type": "string"},
        {"name": "region", "type": "string"} 
     ]
}
```

下列 JSONPaths 檔案 (名為 `category_path.avropath`) 將來源資料映射至資料表欄。

```
{
    "jsonpaths": [
        "$['id']",
        "$['group']",
        "$['name']",
        "$['desc']"
    ]
}
```

若要從上述範例的 Avro 資料檔案載入，請執行下列 COPY 命令。

```
copy category
from 's3://amzn-s3-demo-bucket/category_object_paths.avro'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' 
format avro 's3://amzn-s3-demo-bucket/category_path.avropath ';
```

## 準備要搭配 ESCAPE 選項來 COPY 的檔案
<a name="r_COPY_preparing_data"></a>

下列範例描述在使用 COPY 命令搭配 ESCAPE 參數，將資料匯入 Amazon Redshift 資料表之前，如何準備資料來「逸出」換行字元。如果不準備資料來分隔換行字元，當您執行 COPY 命令時，Amazon Redshift 會傳回載入錯誤，因為換行字元通常做為記錄分隔符號。

例如，假設您想要將一個檔案或外部資料表中的一欄複製到 Amazon Redshift 資料表。如果此檔案或欄包含 XML 格式的內容或類似資料，您必須確定內容中的所有換行字元 (\$1n) 都以反斜線字元 (\$1) 逸出。

包含內嵌換行字元的檔案或資料表可提供相當簡單的比對模式。每一個內嵌的換行字元很可能都接在 `>` 字元後面，且之間可能有幾個空格字元 (`' '` 或 Tab 字元)，如下列範例所示 (在名為 `nlTest1.txt` 的文字檔案中)。

```
$ cat nlTest1.txt
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>|1000
<xml>
</xml>|2000
```

在下列範例中，您可以執行文字處理公用程式來預先處理來源檔案，並在需要的地方插入逸出字元。(當欄資料複製到 Amazon Redshift 資料表時，會將 `|` 字元主要做為分隔符號來分隔欄資料。) 

```
$ sed -e ':a;N;$!ba;s/>[[:space:]]*\n/>\\\n/g' nlTest1.txt > nlTest2.txt
```

同樣地，您可以使用 Perl 來執行類似的操作：

```
cat nlTest1.txt | perl -p -e 's/>\s*\n/>\\\n/g' > nlTest2.txt
```

為了方便將 `nlTest2.txt` 檔案中的資料載入 Amazon Redshift，我們在 Amazon Redshift 中建立一個兩欄資料表。第一欄 c1 是字元欄，將存放來自 `nlTest2.txt` 檔案的 XML 格式內容。第二欄 c2 存放從同一個檔案載入的整數值。

執行 `sed` 命令之後，您就可以使用 ESCAPE 參數，將 `nlTest2.txt` 檔案中的資料正確載入 Amazon Redshift 資料表。

**注意**  
在 COPY 命令中包含 ESCAPE 參數時，可逸出一些含有反斜線字元的特殊字元 (包括換行字元)。

```
copy t2 from 's3://amzn-s3-demo-bucket/data/nlTest2.txt' 
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'  
escape
delimiter as '|';

select * from t2 order by 2;

c1           |  c2
-------------+------
<xml start>
<newline characters provide>
<line breaks at the end of each>
<line in content>
</xml>
| 1000
<xml>
</xml>       | 2000
(2 rows)
```

您可以用類似的方法來準備從外部資料庫匯出的資料檔案。例如，假設是 Oracle 資料庫，在您要複製到 Amazon Redshift 的資料表中，您可以對每個受影響的欄使用 REPLACE 函數。

```
SELECT c1, REPLACE(c2, \n',\\n' ) as c2 from my_table_with_xml
```

此外，許多資料庫匯出及擷取、轉換、載入 (ETL) 的工具 (經常處理大量資料)，都提供選項來指定逸出和分隔符號字元。

## 將 Shapefile 載入 Amazon Redshift
<a name="copy-example-spatial-copy-shapefile"></a>

下列範例示範如何使用 COPY 來載入 Esri Shapefile。如需載入 Shapefile 的相關資訊，請參閱[將 Shapefile 載入 Amazon Redshift](spatial-copy-shapefile.md)。

### 載入 Shapefile
<a name="copy-example-spatial-copy-shapefile-loading-copy"></a>

下列步驟說明如何使用 COPY 命令從 Amazon S3 擷取 OpenStreetMap 資料。此範例假設來自 [Geofabrik 下載網站的](https://download.geofabrik.de/europe.html)挪威 shapefile 封存已上傳至您 AWS 區域中的私有 Amazon S3 儲存貯體。`.shp`、`.shx` 和 `.dbf` 檔案必須共用相同的 Amazon S3 字首和檔案名稱。

#### 不使用簡化擷取資料
<a name="spatial-copy-shapefile-loading-copy-fits"></a>

以下命令會建立資料表並擷取資料，這些資料無需任何簡化即可符合最大幾何大小。在您偏好的 GIS 軟體中開啟 `gis_osm_natural_free_1.shp`，並檢查此圖層中的欄。依預設，IDENTITY 或 GEOMETRY 欄都是第一個。當 GEOMETRY 欄是第一個，你可以建立資料表，如下所示。

```
CREATE TABLE norway_natural (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

或者，當 IDENTITY 欄是第一個，你可以建立資料表，如下所示。

```
CREATE TABLE norway_natural_with_id (
   fid INT IDENTITY(1,1),
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

現在，您可以使用 COPY 擷取資料。

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural' completed, 83891 record(s) loaded successfully
```

或者，您可以如下所示擷取資料。

```
COPY norway_natural_with_id FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO: Load into table 'norway_natural_with_id' completed, 83891 record(s) loaded successfully.
```

#### 使用簡化擷取資料
<a name="spatial-copy-shapefile-loading-copy-no-fit"></a>

下列命令會建立資料表並嘗試擷取資料，這些資料若不經簡化就無法符合最大幾何大小。檢查 `gis_osm_water_a_free_1.shp` Shapefile 並建立適當資料表，如下所示。

```
CREATE TABLE norway_water (
   wkb_geometry GEOMETRY,
   osm_id BIGINT,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

COPY 命令執行時，會導致錯誤。

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
ERROR:  Load into table 'norway_water' failed.  Check 'stl_load_errors' system table for details.
```

查詢 `STL_LOAD_ERRORS` 顯示幾何太大。

```
SELECT line_number, btrim(colname), btrim(err_reason) FROM stl_load_errors WHERE query = pg_last_copy_id();
 line_number |    btrim     |                                 btrim
-------------+--------------+-----------------------------------------------------------------------
     1184705 | wkb_geometry | Geometry size: 1513736 is larger than maximum supported size: 1048447
```

為了解決這個問題，請將 `SIMPLIFY AUTO` 參數加入 COPY 命令以簡化幾何。

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989196 record(s) loaded successfully.
```

若要檢視已簡化的列和幾何，請查詢 `SVL_SPATIAL_SIMPLIFY`。

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size |   final_tolerance
-------+-------------+-------------------+--------------+------------+------------+----------------------
    20 |     1184704 |                -1 |      1513736 | t          |    1008808 |   1.276386653895e-05
    20 |     1664115 |                -1 |      1233456 | t          |    1023584 | 6.11707814796635e-06
```

使用 SIMPLIFY AUTO *max\$1tolerance* 且公差低於自動計算的公差，可能會導致擷取錯誤。在這種情況下，請使用 MAXERROR 忽略錯誤。

```
COPY norway_water FROM 's3://bucket_name/shapefiles/norway/gis_osm_water_a_free_1.shp'
FORMAT SHAPEFILE
SIMPLIFY AUTO 1.1E-05
MAXERROR 2
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';

INFO:  Load into table 'norway_water' completed, 1989195 record(s) loaded successfully.
INFO:  Load into table 'norway_water' completed, 1 record(s) could not be loaded.  Check 'stl_load_errors' system table for details.
```

再次查詢 `SVL_SPATIAL_SIMPLIFY` 以識別 COPY 未能載入的記錄。

```
SELECT * FROM svl_spatial_simplify WHERE query = pg_last_copy_id();
 query | line_number | maximum_tolerance | initial_size | simplified | final_size | final_tolerance
-------+-------------+-------------------+--------------+------------+------------+-----------------
    29 |     1184704 |           1.1e-05 |      1513736 | f          |          0 |               0
    29 |     1664115 |           1.1e-05 |      1233456 | t          |     794432 |         1.1e-05
```

在這個範例中，第一筆記錄無法容納，因此 `simplified` 欄顯示為 false。第二筆記錄在給定的公差範圍內載入。但是，最終大小大於使用自動計算的公差而不指定最大公差。

### 從壓縮的 Shapefile 載入
<a name="copy-example-spatial-copy-shapefile-compressed"></a>

Amazon Redshift COPY 支援從壓縮的 Shapefile 中擷取資料。所有 Shapefile 元件必須具有相同的 Amazon S3 字首和相同的壓縮字尾。例如，假設您想要從上述範例中載入資料。在此情況下，`gis_osm_water_a_free_1.shp.gz`、`gis_osm_water_a_free_1.dbf.gz` 和 `gis_osm_water_a_free_1.shx.gz` 檔案必須共用相同的 Amazon S3 目錄。COPY 命令需要 GZIP 選項，並且 FROM 子句必須指定正確的壓縮檔案，如下所示。

```
COPY norway_natural FROM 's3://bucket_name/shapefiles/norway/compressed/gis_osm_natural_free_1.shp.gz'
FORMAT SHAPEFILE
GZIP
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural' completed, 83891 record(s) loaded successfully.
```

### 以不同的欄順序將資料載入到資料表中
<a name="copy-example-spatial-copy-shapefile-column-order"></a>

如果您的資料表沒有將 `GEOMETRY` 作為第一欄，則可以使用欄映射將欄映射到目標資料表。例如，建立一個將 `osm_id` 指定為第一欄的資料表。

```
CREATE TABLE norway_natural_order (
   osm_id BIGINT,
   wkb_geometry GEOMETRY,
   code INT,
   fclass VARCHAR,
   name VARCHAR);
```

然後使用欄映射擷取 Shapefile。

```
COPY norway_natural_order(wkb_geometry, osm_id, code, fclass, name) 
FROM 's3://bucket_name/shapefiles/norway/gis_osm_natural_free_1.shp'
FORMAT SHAPEFILE
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/MyRoleName';
INFO:  Load into table 'norway_natural_order' completed, 83891 record(s) loaded successfully.
```

### 將資料載入至具有地理欄的資料表
<a name="copy-example-spatial-copy-shapefile-geography"></a>

如果您有一個包含 `GEOGRAPHY` 欄的資料表，則首先擷取至 `GEOMETRY` 欄中，然後將物件轉換為 `GEOGRAPHY` 物件。例如，將 Shapefile 複製到 `GEOMETRY` 欄之後，請更改資料表以新增 `GEOGRAPHY` 資料類型的欄。

```
ALTER TABLE norway_natural ADD COLUMN wkb_geography GEOGRAPHY;
```

然後將幾何轉換為地理。

```
UPDATE norway_natural SET wkb_geography = wkb_geometry::geography;
```

您也可以選擇捨棄 `GEOMETRY` 欄。

```
ALTER TABLE norway_natural DROP COLUMN wkb_geometry;
```

## 具有 NOLOAD 選項的 COPY 命令
<a name="r_COPY_command_examples-load-noload-option"></a>

若要在實際載入資料之前先驗證資料檔案，請使用 NOLOAD 選項搭配 COPY 命令。Amazon Redshift 會剖析輸入檔案，並顯示發生的任何錯誤。下列範例使用 NOLOAD 選項，而且沒有列實際載入資料表中。

```
COPY public.zipcode1
FROM 's3://amzn-s3-demo-bucket/mydata/zipcode.csv' 
DELIMITER ';' 
IGNOREHEADER 1 REGION 'us-east-1'
NOLOAD
CREDENTIALS 'aws_iam_role=arn:aws:iam::123456789012:role/myRedshiftRole';

Warnings:
Load into table 'zipcode1' completed, 0 record(s) loaded successfully.
```

## COPY 命令搭配多位元組分隔符號和 ENCODING 選項
<a name="r_COPY_command_examples-load-encoding-multibyte-delimiter-option"></a>

下列範例會從包含多位元組資料的 Amazon S3 檔案載入 LATIN1。COPY 命令會指定八進位形式的分隔符號 `\302\246\303\254`，以分隔輸入檔案中編碼為 ISO-8859-1 的多個欄位。若要以 UTF-8 指定相同的分隔符號，請指定 `DELIMITER '¦ì'`。

```
COPY latin1
FROM 's3://amzn-s3-demo-bucket/multibyte/myfile' 
IAM_ROLE 'arn:aws:iam::123456789012:role/myRedshiftRole'
DELIMITER '\302\246\303\254'
ENCODING ISO88591
```

# CREATE DATABASE
<a name="r_CREATE_DATABASE"></a>

建立新的資料庫。

若要建立資料庫，您必須是超級使用者或具有 CREATEDB 權限。若要建立與零 ETL 整合相關聯的資料庫，您必須是超級使用者或是同時具有 CREATEDB 和 CREATEUSER 權限。

您無法在交易區塊 (BEGIN ... END) 中執行 CREATE DATABASE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

## 語法
<a name="r_CREATE_DATABASE-synopsis"></a>

```
CREATE DATABASE database_name 
[ { [ 
      FROM INTEGRATION '<integration_id>'[ DATABASE '<source_database>' ]
      [ SET ]
      [ ACCEPTINVCHARS [=] { TRUE | FALSE }]
      [ QUERY_ALL_STATES [=] { TRUE | FALSE }] 
      [ REFRESH_INTERVAL <interval> ] 
      [ TRUNCATECOLUMNS [=] { TRUE | FALSE } ]
      [ HISTORY_MODE [=] {TRUE | FALSE} ]
    ]
    [ WITH ]
    [ OWNER [=] db_owner ]
    [ CONNECTION LIMIT { limit | UNLIMITED } ]
    [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]
    [ ISOLATION LEVEL { SNAPSHOT | SERIALIZABLE } ]
  }
  | { FROM { { ARN '<arn>' } { WITH DATA CATALOG SCHEMA '<schema>' | WITH NO DATA CATALOG SCHEMA } } }
  | { IAM_ROLE  {default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' } }
  | { [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid }
]
```

## Parameters
<a name="r_CREATE_DATABASE-parameters"></a>

 *database\$1name*   
新資料庫的名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

FROM INTEGRATION '<integration\$1id>' [ DATABASE '<source\$1database>' ]   
指定是否使用零 ETL 整合識別碼建立資料庫。您可以從 SVV\$1INTEGRATION 系統檢視擷取 `integration_id`。對於 Aurora PostgreSQL 零 ETL 整合，您還需要指定 `source_database` 名稱，此名稱也可以從 SVV\$1INTEGRATION 擷取。  
如需範例，請參閱 [建立資料庫以接收零 ETL 整合的結果](#r_CREATE_DATABASE-integration)。如需使用零 ETL 整合建立資料庫的詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[在 Amazon Redshift 中建立目的地資料庫](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-using.creating-db.html)。

SET  
選用的關鍵字。

ACCEPTINVCHARS [=] \$1 TRUE \$1 FALSE \$1  
ACCEPTINVCHARS 子句會設定零 ETL 整合資料表是否在偵測到 VARCHAR 資料類型的無效字元時，仍繼續擷取。遇到無效字元時，無效字元會取代為預設的 `?` 字元。

QUERY\$1ALL\$1STATES [=] \$1 TRUE \$1 FALSE \$1  
QUERY\$1ALL\$1STATES 子句會設定零 ETL 整合資料表是否在所有狀態 (`Synced`、`Failed`、`ResyncRequired` 和 `ResyncInitiated`) 下均可供查詢。根據預設，零 ETL 整合資料表只有在 `Synced` 狀態下可供查詢。

REFRESH\$1INTERVAL <interval>  
REFRESH\$1INTERVAL 子句會設定將資料從零 ETL 來源重新整理至目標資料庫的大約時間間隔 (以秒為單位)。針對來源類型為 Aurora MySQL、Aurora PostgreSQL 或 RDS for MySQL 的零 ETL 整合，值可以設定為 0-432,000 秒 (5 天)。針對 Amazon DynamoDB 零 ETL 整合，值可以設定為 900-432,000 秒 (15 分鐘至 5 天)。針對來源類型為 Aurora MySQL、Aurora PostgreSQL 或 RDS for MySQL 的零 ETL 整合，預設 `interval` 為零 (0) 秒。對於 Amazon DynamoDB 零 ETL 整合，預設 `interval` 為 900 秒 (15 分鐘)。

TRUNCATECOLUMNS [=] \$1 TRUE \$1 FALSE \$1  
TRUNCATECOLUMNS 子句會設定，當 VARCHAR 欄或 SUPER 欄屬性的值超出限制時，零 ETL 整合資料表是否繼續擷取。當 `TRUE` 時，值會截斷至符合欄長度，而溢出 JSON 屬性的值則會截斷至符合 SUPER 欄長度。

HISTORY\$1MODE [=] \$1TRUE \$1 FALSE\$1  
此子句指定 Amazon Redshift 是否會為指定資料庫中的所有新資料表設定歷史記錄模式。此選項僅適用於針對零 ETL 整合建立的資料庫。  
HISTORY\$1MODE 子句可以設定為 `TRUE` 或 `FALSE`。預設值為 `FALSE`。如需有關 HISTORY\$1MODE 的資訊，請參閱《Amazon Redshift 管理指南》**中的[歷史記錄模式](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl-history-mode.html)。

WITH  
選用的關鍵字。

OWNER [=] db\$1owner  
指定資料庫擁有者的使用者名稱。

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
允許使用者同時開啟的資料庫連線數目上限。超級使用者不受此限制規範。使用 UNLIMITED 關鍵字可允許同時連線的最大數目。另外也可能限制每位使用者的連線數目。如需詳細資訊，請參閱[CREATE USER](r_CREATE_USER.md)。預設值為 UNLIMITED。若要檢視目前連線數目，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統畫面。  
如果同時套用使用者和資料庫連線數目限制，則必須在使用者嘗試連線時，在不超過這兩項限制的情況下提供一個未使用的連線位置。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定字串搜尋或比較區分大小寫或不區分大小寫的子句。預設為區分大小寫。  
若您從資料共用建立資料庫，則不支援 COLLATE。  
CASE\$1SENSITIVE 和 CS 可互換，並產生相同的結果。同樣地，CASE\$1INSENSITIVE 和 CI 可互換，並產生相同的結果。

ISOLATION LEVEL \$1 SNAPSHOT \$1 SERIALIZABLE \$1  
指定對資料庫執行查詢時所用隔離層級的子句。如需隔離層級的詳細資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。  
+ SNAPSHOT 隔離 - 提供隔離層級，防止更新和刪除衝突。這是佈建叢集或無伺服器命名空間中所建立資料庫的預設值。
+ SERIALIZABLE 隔離 - 為並行交易提供完整的序列化。

FROM ARN '<ARN>'  
用來建立 AWS Glue 資料庫的資料庫 ARN。

\$1 WITH DATA CATALOG SCHEMA '<schema>' \$1 WITH NO DATA CATALOG SCHEMA \$1  
只有當您的 CREATE DATABASE 命令也使用 FROM ARN 參數時，此參數才適用。
指定是否使用結構描述建立資料庫，以協助存取 AWS Glue Data Catalog中的物件。

IAM\$1ROLE \$1 default \$1 'SESSION' \$1 'arn:aws:iam::*<AWS 帳戶-id>*:role/*<role-name>*' \$1  
只有當您的 CREATE DATABASE 命令也使用 FROM ARN 參數時，此參數才適用。
如果您在執行 CREATE DATABASE 命令時指定與叢集關聯的 IAM 角色，當您在資料庫上執行查詢時，Amazon Redshift 將會使用該角色的登入資料。  
指定 `default` 關鍵字表示使用設定為預設值且與叢集相關聯的 IAM 角色。  
如果您使用聯合身分連線到 Amazon Redshift 叢集，並從使用此命令建立的外部結構描述存取資料表，請使用 `'SESSION'`。如需使用聯合身分的範例，請參閱[使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)，其中會說明如何設定聯合身分。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。IAM 角色最少須具有在所要存取的 Amazon S3 儲存貯體上執行 LIST 操作，以及在儲存貯體包含的 Amazon S3 物件上執行 GET 操作的許可。若要進一步了解如何在使用 建立資料庫 AWS Glue Data Catalog 進行資料共用時使用 IAM\$1ROLE，請參閱以[取用者身分使用 Lake Formation 管理的資料共用](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html)。  
以下顯示單一 ARN 的 IAM\$1ROLE 參數字串語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
您可以鏈結角色，以便您的叢集可以擔任其他 IAM 角色 (可能屬於其他帳戶)。您最多可以鏈結 10 個角色。如需詳細資訊，請參閱[在 Amazon Redshift Spectrum 中鏈結 IAM 角色](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)。  
 對於此 IAM 角色，請附加與以下內容相似的 IAM 許可政策。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
如需建立 IAM 角色以搭配聯合查詢使用的步驟，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。  
不要在鏈結的角色清單中包含空格。
以下顯示鏈結三個角色的語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

## 搭配資料共用使用 CREATE DATABASE 的語法
<a name="r_CREATE_DATABASE-datashare-synopsis"></a>

下列語法說明 CREATE DATABASE 命令，用於從資料共用建立資料庫，以在相同 AWS 帳戶中共用資料。

```
CREATE DATABASE database_name
[ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF [ ACCOUNT account_id ] NAMESPACE namespace_guid
```

下列語法說明用於從資料共用建立資料庫的 CREATE DATABASE 命令，以跨 AWS 帳戶共用資料。

```
CREATE DATABASE database_name
[ [ WITH PERMISSIONS ] FROM DATASHARE datashare_name OF ACCOUNT account_id NAMESPACE namespace_guid
```

### 搭配資料共用使用 CREATE DATABASE 的參數
<a name="r_CREATE_DATABASE-parameters-datashare"></a>

FROM DATASHARE   
指出資料共用所在位置的關鍵字。

 *datashare\$1name*   
建立取用者資料庫所用的資料共用名稱。

WITH PERMISSIONS  
指定從資料共用建立的資料庫需要物件層級權限，才能存取個別資料庫物件。如果沒有這個子句，被授予資料庫 USAGE 權限的使用者或角色，就會自動擁有資料庫中所有資料庫物件的存取權。

 NAMESPACE *namespace\$1guid*   
指定資料共用所屬之生產者命名空間的值。

ACCOUNT *account\$1id*  
指定資料共用所屬之生產者帳戶的值。

## 用於資料共用的 CREATE DATABASE 使用說明
<a name="r_CREATE_DATABASE-usage"></a>

身為資料庫超級使用者，當您使用 CREATE DATABASE 從 AWS 帳戶中的資料共用建立資料庫時，請指定 NAMESPACE 選項。ACCOUNT 是選用選項。當您使用 CREATE DATABASE 從跨 AWS 帳戶的資料共用建立資料庫時，請指定來自生產者的 ACCOUNT 和 NAMESPACE。

您只能為取用者叢集上的一個資料共用建立一個取用者資料庫。您無法建立參照相同資料共用的多個取用者資料庫。

## 從 建立資料庫 AWS Glue Data Catalog
<a name="r_CREATE_DATABASE_data-catalog"></a>

若要使用資料庫 ARN 建立 AWS Glue 資料庫，請在 CREATE DATABASE 命令中指定 ARN。

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA;
```

或者，您也可以為 IAM\$1ROLE 參數提供值。如需參數和接受值的相關資訊，請參閱[參數](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html#r_CREATE_DATABASE-parameters)。

以下是示範如何使用 IAM 角色從 ARN 建立資料庫的範例。

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE <iam-role-arn>
```

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH NO DATA CATALOG SCHEMA IAM_ROLE default;
```

您也可以使用 DATA CATALOG SCHEMA 建立資料庫。

```
CREATE DATABASE sampledb FROM ARN <glue-database-arn> WITH DATA CATALOG SCHEMA <sample_schema> IAM_ROLE default;
```

## 建立資料庫以接收零 ETL 整合的結果
<a name="r_CREATE_DATABASE-integration"></a>

若要使用零 ETL 整合身分建立資料庫，請在 CREATE DATABASE 命令中指定 `integration_id`。

```
CREATE DATABASE destination_db_name FROM INTEGRATION 'integration_id';
```

例如，首先從 SVV\$1INTEGRATION 擷取整合 ID；

```
SELECT integration_id FROM SVV_INTEGRATION;
```

然後使用擷取的其中一個整合 ID 來建立接收零 ETL 整合的資料庫。

```
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111';
```

例如，需要零 ETL 整合來源資料庫時則指定。

```
CREATE DATABASE sampledb FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' DATABASE sourcedb;
```

您也可以設定資料庫的重新整理間隔。例如，若要針對零 ETL 整合來源的資料將重新整理間隔設定為 7,200 秒：

```
CREATE DATABASE myacct_mysql FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET REFRESH_INTERVAL 7200;
```

查詢 SVV\$1INTEGRATION 目錄檢視以取得零 ETL 整合的相關資訊，例如 integration\$1id、target\$1database、source、fresh\$1interval 等。

```
SELECT * FROM svv_integration;
```

下列範例會從開啟歷史記錄模式的整合建立資料庫。

```
CREATE DATABASE sample_integration_db FROM INTEGRATION 'a1b2c3d4-5678-90ab-cdef-EXAMPLE11111' SET HISTORY_MODE = true;
```

## CREATE DATABASE 限制
<a name="r_CREATE_DATABASE-create-database-limits"></a>

Amazon Redshift 會針對資料庫強制執行以下限制：
+ 每個叢集最多 60 個使用者定義的資料庫。
+ 資料庫名稱最多 127 個位元組。
+ 資料庫名稱不能是保留字。

## 資料庫定序
<a name="r_CREATE_DATABASE-collation"></a>

定序是一組規則，用於定義資料庫引擎如何比較和排序 SQL 中的字元類型資料。不區分大小寫的定序是最常用的定序。Amazon Redshift 使用不區分大小寫的定序來協助從其他資料倉儲進行移轉。透過不區分大小寫定序的原生支援，Amazon Redshift 會繼續使用重要的調整或最佳化方法，例如分佈索引鍵、排序索引鍵或範圍限制掃描。

COLLATE 子句會指定資料庫中所有 CHAR 和 VARCHAR 資料欄的預設定序。如果指定 CASE\$1INSENSITIVE，則所有 CHAR 或 VARCHAR 資料欄都會使用不區分大小寫的定序。如需有關定序的資訊，請參閱 [定序序列](c_collation_sequences.md)。

在不區分大小寫的資料欄中插入或擷取的資料將會保留其原始大小寫。但是所有基於比較的字串操作 (包括排序和分組) 也都不區分大小寫。模式比對操作 (如 LIKE 述詞、類似和規則表達式函數) 也不區分大小寫。

下列 SQL 操作支援適用的定序語意：
+ 比較運算子：=、<>、<、<=、>、>=。
+ LIKE 運算子
+ ORDER BY 子句
+ GROUP BY 子句
+ 使用字串比較的彙總函數，例如 MIN、MAX 和 LISTAGG
+ 視窗函數，例如 PARTITION BY 子句與 ORDER BY 子句
+ 純量函數 greatest() 和 least()、STRPOS()、REGEXP\$1COUNT()、REGEXP\$1REPLACE()、REGEXP\$1INSTR()、REGEXP\$1SUBSTR()
+ 相異子句
+ UNION、INTERSECT 和 EXCEPT
+ IN LIST

對於外部查詢 (包括 Amazon Redshift Spectrum 和 Aurora PostgreSQL 聯合查詢)，VARCHAR 或 CHAR 資料欄的定序會與目前的資料庫層級定序相同。

下列範例會查詢 Amazon Redshift Spectrum 資料表：

```
SELECT ci_varchar FROM spectrum.test_collation
WHERE ci_varchar = 'AMAZON';

ci_varchar
----------
amazon
Amazon
AMAZON
AmaZon
(4 rows)
```

如需如何使用資料庫定序建立資料表的資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

如需 COLLATE 函數的詳細資訊，請參閱 [COLLATE 函數](r_COLLATE.md)。

### 資料庫定序限制
<a name="r_CREATE_DATABASE-collation-limitations"></a>

以下是在 Amazon Redshift 中使用資料庫定序時的限制：
+ 所有系統資料表或檢視 (包括 PG 目錄資料表和 Amazon Redshift 系統資料表) 都會區分大小寫。
+ 當取用者資料庫和生產者資料庫具有不同的資料庫層級定序時，Amazon Redshift 不支援跨資料庫和跨叢集查詢。
+ Amazon Redshift 在僅限領導節點查詢中不支援不區分大小寫的定序。

  下列範例顯示不支援的不區分大小寫查詢，以及 Amazon Redshift 傳送的錯誤：

  ```
  SELECT collate(usename, 'case_insensitive') FROM pg_user;
  ERROR:  Case insensitive collation is not supported in leader node only query.
  ```
+ Amazon Redshift 不支援區分大小寫和不區分大小寫的資料欄之間進行互動，例如比較、函數、聯結或設定操作。

  下列範例顯示區分大小寫和不區分大小寫的資料行互動時的錯誤：

  ```
  CREATE TABLE test
    (ci_col varchar(10) COLLATE case_insensitive,
     cs_col varchar(10) COLLATE case_sensitive,
     cint int,
     cbigint bigint);
  ```

  ```
  SELECT ci_col = cs_col FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT concat(ci_col, cs_col) FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT ci_col FROM test UNION SELECT cs_col FROM test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  SELECT * FROM test a, test b WHERE a.ci_col = b.cs_col;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  Select Coalesce(ci_col, cs_col) from test;
  ERROR:  Query with different collations is not supported yet.
  ```

  ```
  Select case when cint > 0 then ci_col else cs_col end from test;
  ERROR:  Query with different collations is not supported yet.
  ```

若要讓這些查詢運作，請使用 COLLATE 函數來轉換一個資料行的定序，以比對另一個資料行。如需詳細資訊，請參閱[COLLATE 函數](r_COLLATE.md)。

## 範例
<a name="r_CREATE_DATABASE-examples"></a>

**建立資料庫**  
下列範例會建立名為 TICKIT 的資料庫，並將所有權提供給使用者 DWUSER。

```
create database tickit
with owner dwuser;
```

若要檢視有關資料庫的詳細資訊，請查詢 PG\$1DATABASE\$1INFO 目錄資料表。

```
select datname, datdba, datconnlimit
from pg_database_info
where datdba > 1;

 datname     | datdba | datconnlimit
-------------+--------+-------------
 admin       |    100 | UNLIMITED
 reports     |    100 | 100
 tickit      |    100 | 100
```

下列範例會建立名稱為 **sampledb** 且具有 SNAPSHOT 隔離層級的資料庫。

```
CREATE DATABASE sampledb ISOLATION LEVEL SNAPSHOT;
```

下列範例會從資料共用 salesshare 中建立資料庫 sales\$1db。

```
CREATE DATABASE sales_db FROM DATASHARE salesshare OF NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

### 資料庫定序範例
<a name="r_CREATE_DATABASE-collation-examples"></a>

**建立不區分大小寫的資料庫**  
下列範例會建立 `sampledb` 資料庫、建立 `T1` 資料表，以及將資料插入 `T1` 資料表。

```
create database sampledb collate case_insensitive;
```

連線到您剛才使用 SQL 用戶端建立的新資料庫。使用 Amazon Redshift 查詢編輯器 v2 時，請在**編輯器**中選擇 `sampledb`。使用 RSQL 時，請使用如下所示的命令。

```
\connect sampledb;
```

```
CREATE TABLE T1 (
  col1 Varchar(20) distkey sortkey
);
```

```
INSERT INTO T1 VALUES ('bob'), ('john'), ('Mary'), ('JOHN'), ('Bob');
```

然後查詢會尋找包含 `John` 結果。

```
SELECT * FROM T1 WHERE col1 = 'John';

 col1
 ------
 john
 JOHN
(2 row)
```

**以不區分大小寫的順序排序**  
下列範例顯示資料表 T1 的不區分大小寫排序。*Bob* 和 *bob* 或 *John* 和 *john* 的排序為非確定性，因為這些在不區分大小寫的欄中是相等的。

```
SELECT * FROM T1 ORDER BY 1;

 col1
 ------
 bob
 Bob
 JOHN
 john
 Mary
(5 rows)
```

同樣地，下面範例顯示使用 GROUP BY 子句的不區分大小寫排序。*Bob* 和 *bob* 是同等的，屬於同一組。結果中會顯示哪一個是不確定的。

```
SELECT col1, count(*) FROM T1 GROUP BY 1;

 col1 | count
 -----+------
 Mary |  1
 bob  |  2
 JOHN |  2
(3 rows)
```

**在不區分大小寫的資料欄上使用視窗函數進行查詢**  
下列範例會在不區分大小寫的資料欄上查詢視窗函數。

```
SELECT col1, rank() over (ORDER BY col1) FROM T1;

 col1 | rank
 -----+------
 bob  |   1
 Bob  |   1
 john |   3
 JOHN |   3
 Mary |   5
(5 rows)
```

**使用 DISTINCT 關鍵字進行查詢**  
下列範例會使用 DISTINCT 關鍵字查詢 `T1` 資料表。

```
SELECT DISTINCT col1 FROM T1;

 col1
 ------
 bob
 Mary
 john
(3 rows)
```

**使用 UNION 子句查詢**  
下列範例顯示資料表 `T1` 和 `T2` UNION 的結果。

```
CREATE TABLE T2 AS SELECT * FROM T1;
```

```
SELECT col1 FROM T1 UNION SELECT col1 FROM T2;

 col1
 ------
 john
 bob
 Mary
(3 rows)
```

# CREATE DATASHARE
<a name="r_CREATE_DATASHARE"></a>

在目前資料庫中建立新的資料共用。此資料共用的擁有者是 CREATE DATASHARE 命令的發行者。

Amazon Redshift 會將每個資料共用與單一 Amazon Redshift 資料庫相關聯。您只可以在資料共用中新增相關聯資料庫中的物件。您可以在同一個 Amazon Redshift 資料庫上建立多個資料共用。

如需有關資料共用的資訊，請參閱 [Amazon Redshift 中的資料共用](datashare-overview.md)。

若要檢視有關資料庫的資訊，請使用 [SHOW DATASHARES](r_SHOW_DATASHARES.md)。

## 所需權限
<a name="r_CREATE_DATASHARE-privileges"></a>

以下是 CREATE DATASHARE 所需的權限：
+ 超級使用者
+ 具有 CREATE DATASHARE 權限的使用者
+ 資料庫擁有者

## 語法
<a name="r_CREATE_DATASHARE-synopsis"></a>

```
CREATE DATASHARE datashare_name
[[SET] PUBLICACCESSIBLE [=] TRUE | FALSE ];
```

## Parameters
<a name="r_CREATE_DATASHARE-parameters"></a>

*datashare\$1name*  
資料共用的名稱。資料共用名稱必須是叢集命名空間中唯一的名稱。

[[SET] PUBLICACCESSIBLE]  
該子句會指定資料共用是否可以共用至可公開存取的叢集。  
`SET PUBLICACCESSIBLE` 的預設值為 `FALSE`。

## 使用須知
<a name="r_CREATE_DATASHARE_usage"></a>

依預設，資料共用的擁有者只能有共用，不能有共用中的物件。

只有超級使用者和資料庫擁有者可以使用 CREATE DATASHARE，並將 ALTER 權限委派給其他使用者或群組。

## 範例
<a name="r_CREATE_DATASHARE_examples"></a>

下列範例會建立 `salesshare` 資料共用。

```
CREATE DATASHARE salesshare;
```

下列範例會建立 AWS Data Exchange 管理的 `demoshare` 資料共用。

```
CREATE DATASHARE demoshare SET PUBLICACCESSIBLE TRUE, MANAGEDBY ADX;
```

# CREATE EXTERNAL FUNCTION
<a name="r_CREATE_EXTERNAL_FUNCTION"></a>

根據 AWS Lambda Amazon Redshift 建立純量使用者定義函數 (UDF)。如需 Lambda 使用者定義函數的相關資訊，請參閱 [純量 Lambda UDF](udf-creating-a-lambda-sql-udf.md)。

## 所需權限
<a name="r_CREATE_EXTERNAL_FUNCTION-privileges"></a>

以下是 CREATE EXTERNAL FUNCTION 所需的權限：
+ 超級使用者
+ 具有 CREATE [ OR REPLACE ] EXTERNAL FUNCTION 權限的使用者

## 語法
<a name="r_CREATE_EXTERNAL_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] EXTERNAL FUNCTION external_fn_name ( [data_type] [, ...] )
RETURNS data_type
{ VOLATILE | STABLE }
LAMBDA 'lambda_fn_name'
IAM_ROLE { default | ‘arn:aws:iam::<AWS 帳戶-id>:role/<role-name>’
RETRY_TIMEOUT milliseconds
MAX_BATCH_ROWS count
MAX_BATCH_SIZE size [ KB | MB ];
```

## Parameters
<a name="r_CREATE_EXTERNAL_FUNCTION-parameters"></a>

OR REPLACE  
該子句會指定已有相同名稱和輸入引數資料類型 (或*簽章*) 的函數存在時，取代現有函數。您可以將函數取代為定義一組相同資料類型的新函數。您必須是超級使用者才能取代函數。  
如果您定義的函數與現有函數同名，但簽章不同，則會建立新函數。換言之，函數名稱將會過載。如需詳細資訊，請參閱[多載函數名稱](udf-naming-udfs.md#udf-naming-overloading-function-names)。

*external\$1fn\$1name*  
外部函數的名稱。如果您指定結構描述名稱 (例如 myschema.myfunction)，則會使用指定的結構描述建立函數。否則，函數會在目前結構描述中建立。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
我們建議您在所有 UDF 名稱前加上 `f_`。Amazon Redshift 會保留 UDF 名稱的 `f_` 字首。透過使用 `f_` 字首，您可以協助確保您的 UDF 名稱不會與目前或未來 Amazon Redshift 的任何內建 SQL 函數名稱衝突。如需詳細資訊，請參閱[防止 UDF 命名衝突](udf-naming-udfs.md)。

*data\$1type*  
輸入引數的資料類型。如需詳細資訊，請參閱[純量 Python UDF](udf-creating-a-scalar-udf.md)及[純量 Lambda UDF](udf-creating-a-lambda-sql-udf.md)。

RETURNS *data\$1type*  
函數所傳回值的資料類型。RETURNS 資料類型可以是任何標準 Amazon Redshift 資料類型。如需詳細資訊，請參閱[純量 Python UDF](udf-creating-a-scalar-udf.md)及[純量 Lambda UDF](udf-creating-a-lambda-sql-udf.md)。

VOLATILE \$1 STABLE  
通知查詢最佳化工具有關函數的波動情形。  
若要得到最理想的最佳化，請將函數標示為最嚴格的有效波動類別。從最低嚴格程度開始，依嚴格程度排列的波動類別如下所示：  
+ VOLATILE
+ STABLE
VOLATILE  
假設引數相同，即使是針對單一陳述式中的資料列，函數也可能在後續呼叫中傳回不同的結果。查詢最佳化工具無法假設波動函數的行為。使用波動函數的查詢必須重新評估每個輸入的函數。  
STABLE  
假設引數相同，函數一定會針對單一陳述式內處理的連續呼叫傳回相同結果。在不同陳述式中呼叫函數時，函數可能傳回不同結果。此類別可這麼做，所以最佳化工具可以減少在單個陳述式中調用函數的次數。  
請注意，如果選擇的嚴格性對函數無效，則最佳化工具可能會有根據此嚴格性而略過某些呼叫的風險。這可能會導致不正確的結果集。  
Lambda UDF 目前不支援 IMMUTABLE 子句。

LAMBDA *'lambda\$1fn\$1name'*  
 Amazon Redshift 呼叫的函數名稱。  
如需建立 AWS Lambda 函數的步驟，請參閱《 *AWS Lambda 開發人員指南*》中的[使用 主控台建立 Lambda 函數](https://docs.aws.amazon.com/lambda/latest/dg/getting-started-create-function.html)。  
如需 Lambda 函數所需權限的相關資訊，請參閱《AWS Lambda 開發人員指南》**中的 [AWS Lambda 權限](https://docs.aws.amazon.com/lambda/latest/dg/lambda-permissions.html)。

IAM\$1ROLE \$1 default \$1 ‘arn:aws:iam::*<AWS 帳戶-id>*:role/*<role-name>*’   
使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE EXTERNAL FUNCTION 命令時與叢集關聯的 IAM 角色。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。CREATE EXTERNAL FUNCTION 已獲得授權，可透過此 IAM 角色調用 Lambda 函數。如果您的叢集已附加有權調用 Lambda 函數的現有 IAM 角色，則可以替換角色的 ARN。如需詳細資訊，請參閱[設定 Lambda UDF 的授權參數](udf-creating-a-lambda-sql-udf.md#udf-lambda-authorization)。  
以下顯示 IAM\$1ROLE 參數的語法。  

```
IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'
```

RETRY\$1TIMEOUT *milliseconds*   
Amazon Redshift 用於重試退避延遲的總時間 (以毫秒為單位)。  
Amazon Redshift 不會針對任何失敗的查詢立即重試，而是執行退選，並在重試之間等待一段時間。然後，Amazon Redshift 會重試請求以重新執行失敗的查詢，直到所有延遲的總和等於或超過您指定的 RETRY\$1TIMEOUT 值為止。預設值為 20,000 毫秒。  
調用 Lambda 函數時，Amazon Redshift 會針對接收到錯誤 (例如 `TooManyRequestsException`、`EC2ThrottledException` 和 `ServiceException`) 的查詢重試。  
您可以將 RETRY\$1TIMEOUT 參數設定為 0 毫秒，以防止 Lambda UDF 進行任何重試。

MAX\$1BATCH\$1ROWS *計數*  
 Amazon Redshift 在單一批次請求中針對單一 Lambda 調用傳送的資料列數目上限。  
 此參數的最小值為 1。最大值為 INT\$1MAX 或 2,147,483,647。  
 此為選用參數。預設值為 INT\$1MAX 或 2,147,483,647。

MAX\$1BATCH\$1SIZE *size* [ KB \$1 MB ]   
 Amazon Redshift 在單一批次請求中針對單一 Lambda 調用傳送的資料承載大小上限。  
 此參數的最小值為 1 KB。最大值為 5 MB。  
 此參數的預設值為 5 MB。  
 您可以選擇 KB 和 MB。如果未設定測量單位，Amazon Redshift 會預設為使用 KB。

## 使用須知
<a name="r_CREATE_FUNCTION-usage-notes"></a>

建立 Lambda UDF 時應考慮下列事項：
+ 輸入引數上的 Lambda 函數調用順序不是固定或可保證的。其可能會因執行查詢的執行個體而有所不同，具體取決於叢集組態。
+ 函數不能保證一次且僅一次地套用到每個輸入引數。Amazon Redshift 與 之間的互動 AWS Lambda 可能會導致具有相同輸入的重複呼叫。

## 範例
<a name="r_CREATE_FUNCTION-examples"></a>

以下是使用純量 Lambda 使用者定義函數 (UDF) 的範例。

### 使用 Node.js Lambda 函數的純量 Lambda UDF 範例
<a name="r_CREATE_FUNCTION-lambda-example-node"></a>

下列範例會建立名為 `exfunc_sum` 的外部函數，該函數會接受兩個整數做為輸入引數。該函數會傳回作為整數輸出的總和。要呼叫的 Lambda 函數名稱為 `lambda_sum`。用於此 Lambda 函數的語言是 Node.js 12.x。請務必指定 IAM 角色。此範例使用 `'arn:aws:iam::123456789012:user/johndoe'` 做為 IAM 角色。

```
CREATE EXTERNAL FUNCTION exfunc_sum(INT,INT)
RETURNS INT
VOLATILE
LAMBDA 'lambda_sum'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

Lambda 函數會接受請求承載並逐一查看每一列。單列中的所有值都會加入以計算該列的總和，而這會保存在回應陣列中。結果陣列中的資料列數會與請求承載中接收的資料列數相似。

JSON 回應承載必須在「結果」欄位中包含結果資料，才能由外部函數辨識。在傳送至 Lambda 函數的請求中，引數欄位會包含資料承載。在批次處理請求的情況下，資料承載中可以有多個資料列。下列 Lambda 函數會逐一查看請求資料承載中的所有資料列。也會單獨逐一查看單一資料列中的所有值。

```
exports.handler = async (event) => {
    // The 'arguments' field in the request sent to the Lambda function contains the data payload.
    var t1 = event['arguments'];

    // 'len(t1)' represents the number of rows in the request payload.
    // The number of results in the response payload should be the same as the number of rows received.
    const resp = new Array(t1.length);

    // Iterating over all the rows in the request payload.
    for (const [i, x] of t1.entries())
    {
        var sum = 0;
        // Iterating over all the values in a single row.
        for (const y of x) {
            sum = sum + y;
        }
        resp[i] = sum;
    }
    // The 'results' field should contain the results of the lambda call.
    const response = {
        results: resp
    };
    return JSON.stringify(response);
};
```

下列範例會呼叫具有常值的外部函數。

```
select exfunc_sum(1,2);
exfunc_sum
------------
 3
(1 row)
```

下列範例會建立名為 t\$1sum 的資料表，其中包含整數資料類型的兩個資料欄 c1 和 c2，並插入兩列資料。然後透過傳遞此資料表的資料欄名稱來呼叫外部函數。這兩個資料表資料列會在請求承載中以批次請求的形式傳送，以做為單一 Lambda 調用。

```
CREATE TABLE t_sum(c1 int, c2 int);
INSERT INTO t_sum VALUES (4,5), (6,7);
SELECT exfunc_sum(c1,c2) FROM t_sum;
 exfunc_sum
---------------
 9
 13
(2 rows)
```

### 使用 RETRY\$1TIMEOUT 屬性的純量 Lambda UDF 範例
<a name="r_CREATE_FUNCTION-lambda-example-retry"></a>

在下文中，您可以找到如何在 Lambda UDF 中使用 RETRY\$1TIMEOUT 屬性的範例。

AWS Lambda 函數具有您可以為每個函數設定的並行限制。如需並行限制的詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[管理 Lambda 函數的並行](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html)，以及 AWS 運算部落格上的[管理 AWS Lambda 函數並行](https://aws.amazon.com/blogs/compute/managing-aws-lambda-function-concurrency)文章。

當 Lambda UDF 處理的要請數目超過並行限制時，新要求會收到 `TooManyRequestsException` 錯誤。Lambda UDF 會針對此錯誤重試，直到傳送至 Lambda 函數的請求之間的所有延遲總和等於或超過您設定的 RETRY\$1TIMEOUT 值為止。預設的 RETRY\$1TIMEOUT 值為 20,000 毫秒。

下列範例會使用名為 `exfunc_sleep_3` 的 Lambda 函數。該函數會接受請求承載、逐一查看每一個資料列，並將輸入轉換為大寫。然後休眠 3 秒鐘後傳回結果。用於此 Lambda 函數的語言是 Python 3.8。

結果陣列中的資料列數會與請求承載中接收的資料列數相似。JSON 回應承載必須在 `results` 欄位中包含結果資料，才能由外部函數辨識。在傳送至 Lambda 函數的請求中，`arguments` 欄位會包含資料承載。在批次處理請求的情況下，資料承載中可以有多個資料列。

此函數的並行限制會在保留並行中特別設定為 1，以示範如何使用 RETRY\$1TIMEOUT 屬性。當屬性設定為 1 時，Lambda 函數一次只能處理一個請求。

```
import json
import time
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            resp[i] = y.upper()

    time.sleep(3)
    ret = dict()
    ret['results'] = resp
    ret_json = json.dumps(ret)
    return ret_json
```

接下來，另外兩個範例會說明 RETRY\$1TIMEOUT 屬性。他們每個人都會調用單一 Lambda UDF。呼叫 Lambda UDF 時，每個範例都會執行相同的 SQL 查詢，以同時從兩個並行的資料庫工作階段調用 Lambda UDF。當 UDF 處理第一個調用 Lambda UDF 的查詢時，第二個查詢會收到 `TooManyRequestsException` 錯誤。之所以發生此結果，是因為您在 UDF 中特別將保留並行設定為 1。如需如何為 Lambda 函數設定保留並行的相關資訊，請參閱[設定保留並行](https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html#configuration-concurrency-reservedconfiguration-concurrency-reserved)。

接下來的第一個範例會將 Lambda UDF 的 RETRY\$1TIMEOUT 屬性設定為 0 毫秒。如果 Lambda 請求從 Lambda 函數收到任何例外狀況，Amazon Redshift 不會進行任何重試。之所以發生這個結果，是因為 RETRY\$1TIMEOUT 屬性設定為 0。

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 0;
```

將 RETRY\$1TIMEOUT 設定為 0 時，您可以從不同的資料庫工作階段執行下列兩個查詢，以查看不同的結果。

第一個使用 Lambda UDF 的 SQL 查詢成功執行。

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

同時從不同資料庫工作階段執行的第二個查詢會收到 `TooManyRequestsException` 錯誤。

```
select exfunc_upper('Varchar');
ERROR:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
DETAIL:
-----------------------------------------------
error:  Rate Exceeded.; Exception: TooManyRequestsException; ShouldRetry: 1
code:      32103
context:query:     0
location:  exfunc_client.cpp:102
process:   padbmaster [pid=26384]
-----------------------------------------------
```

接下來的第二個範例會將 Lambda UDF 的 RETRY\$1TIMEOUT 屬性設定為 3,000 毫秒。即使第二個查詢同時執行，Lambda UDF 也會重試，直到總延遲為 3,000 毫秒為止。因此，兩個查詢都會成功執行。

```
CREATE OR REPLACE EXTERNAL FUNCTION exfunc_upper(varchar)
RETURNS varchar
VOLATILE
LAMBDA 'exfunc_sleep_3'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test'
RETRY_TIMEOUT 3000;
```

將 RETRY\$1TIMEOUT 設定為 3,000 毫秒時，您可以從不同的資料庫工作階段執行下列兩個查詢，以查看相同的結果。

第一個執行 Lambda UDF 的 SQL 查詢成功執行。

```
select exfunc_upper('Varchar');
 exfunc_upper
 --------------
 VARCHAR
(1 row)
```

第二個查詢會同時執行，Lambda UDF 也會重試，直到總延遲為 3,000 毫秒為止。

```
select exfunc_upper('Varchar');
 exfunc_upper
--------------
 VARCHAR
(1 row)
```

### 使用 Python Lambda 函數的純量 Lambda UDF 範例
<a name="r_CREATE_FUNCTION-lambda-example-python"></a>

下列範例會建立名為 `exfunc_multiplication` 且會乘以數字並傳回整數的外部函數。此範例包含 Lambda 回應中的成功和 `error_msg` 欄位。當乘法結果中有整數溢位，且 `error_msg` 訊息設定為 `Integer multiplication overflow` 時，成功欄位會設定為 false。`exfunc_multiplication` 函數採用三個整數作為輸入參數，並傳回總和作為整數輸出。

要呼叫的 Lambda 函數名稱為 `lambda_multiplication`。用於此 Lambda 函數的語言是 Python 3.8。請務必指定 IAM 角色。

```
CREATE EXTERNAL FUNCTION exfunc_multiplication(int, int, int)
RETURNS INT
VOLATILE
LAMBDA 'lambda_multiplication'
IAM_ROLE 'arn:aws:iam::123456789012:role/Redshift-Exfunc-Test';
```

Lambda 函數會接受請求承載並逐一查看每一列。單列中的所有值都會相乘以計算該列的結果，而這會保存在回應清單中。此範例使用預設為 true 的布林成功值。如果資料列的乘法結果有整數溢位，則成功值會設定為 false。然後迭代循環會中斷。

建立回應承載時，如果成功值為 false，則下列 Lambda 函數會在承載中新增 `error_msg` 欄位。也會將錯誤訊息設定為 `Integer multiplication overflow`。如果成功值為 true，則結果資料會新增到結果欄位中。結果陣列中的資料列數 (如果有的話) 會與請求承載中接收的資料列數相似。

在傳送至 Lambda 函數的請求中，引數欄位會包含資料承載。在批次處理請求的情況下，資料承載中可以有多個資料列。下列 Lambda 函數會逐一查看請求資料承載中的所有資料列，並個別逐一查看單一資料列中的所有值。

```
import json
def lambda_handler(event, context):
    t1 = event['arguments']
    # 'len(t1)' represents the number of rows in the request payload.
    # The number of results in the response payload should be the same as the number of rows received.
    resp = [None]*len(t1)

    # By default success is set to 'True'.
    success = True
    # Iterating over all rows in the request payload.
    for i, x in enumerate(t1):
        mul = 1
        # Iterating over all the values in a single row.
        for j, y in enumerate(x):
            mul = mul*y

        # Check integer overflow.
        if (mul >= 9223372036854775807 or mul <= -9223372036854775808):
            success = False
            break
        else:
            resp[i] = mul
    ret = dict()
    ret['success'] = success
    if not success:
        ret['error_msg'] = "Integer multiplication overflow"
    else:
        ret['results'] = resp
    ret_json = json.dumps(ret)

    return ret_json
```

下列範例會呼叫具有常值的外部函數。

```
SELECT exfunc_multiplication(8, 9, 2);
  exfunc_multiplication
---------------------------
          144
(1 row)
```

下列範例會建立名為 t\$1multi 的資料表，其中包含整數資料類型的三個資料欄 c1、c2 和 c3。外部函數會透過傳遞此資料表的資料欄名稱來呼叫。資料會以這種方式插入，進而導致整數溢位，以顯示錯誤的傳播方式。

```
CREATE TABLE t_multi (c1 int, c2 int, c3 int);
INSERT INTO t_multi VALUES (2147483647, 2147483647, 4);
SELECT exfunc_multiplication(c1, c2, c3) FROM t_multi;
DETAIL:
  -----------------------------------------------
  error:  Integer multiplication overflow
  code:      32004context:
  context:
  query:     38
  location:  exfunc_data.cpp:276
  process:   query2_16_38 [pid=30494]
  -----------------------------------------------
```

# CREATE EXTERNAL MODEL
<a name="r_create_external_model"></a>

**Topics**
+ [CREATE EXTERNAL MODEL 的先決條件](#r_create_external_model_prereqs)
+ [所需權限](#r_simple_create_model-privileges)
+ [成本控制](#r_create_model_cost)
+ [CREATE EXTERNAL MODEL 語法](#r_create_external_model_syntax)
+ [CREATE EXTERNAL MODEL 參數和設定](#r_create_external_model_parameters_settings)
+ [CREATE EXTERNAL MODEL 推論函數參數](#r_create_external_model_if_parameters)

## CREATE EXTERNAL MODEL 的先決條件
<a name="r_create_external_model_prereqs"></a>

使用 CREATE EXTERNAL MODEL 陳述式之前，請先完成 [使用 Amazon Redshift ML 的叢集設定](getting-started-machine-learning.md#cluster-setup) 中的先決條件。以下是先決條件的概要。
+ 使用 AWS 管理主控台或命令列界面 (AWS CLI) 建立 AWS Amazon Redshift 叢集。
+ 在建立叢集時連接 AWS Identity and Access Management (IAM) 政策。
+ 若要允許 Amazon Redshift 和 Amazon Bedrock 擔任與其他服務互動的角色，請將適當的信任政策新增至 IAM 角色。
+ 從 Amazon Bedrock 主控台啟用您要使用之特定 LLM 的存取權。
+ (選用) 如果即使只有小量資料，您仍遇到來自 Amazon Bedrock 的限流例外狀況 (例如 `Too many requests, please wait before trying again`)，請在 Amazon Bedrock 帳戶中的 **Service Quotas** 下查看配額。檢查套用的帳戶層級配額至少與您正在使用的模型之 **InvokeModel** 請求 AWS 的預設配額值相同。

如需 IAM 角色、信任政策和其他先決條件的詳細資訊，請參閱 [使用 Amazon Redshift ML 的叢集設定](getting-started-machine-learning.md#cluster-setup)。

## 所需權限
<a name="r_simple_create_model-privileges"></a>

以下是 CREATE EXTERNAL MODEL 所需的權限：
+ 超級使用者
+ 具有 CREATE MODEL 權限的使用者
+ 具有 GRANT CREATE MODEL 權限的角色

## 成本控制
<a name="r_create_model_cost"></a>

 Amazon Redshift ML 會使用現有的叢集資源建立預測模型，因此您不必支付額外費用。不過，根據您選取的模型使用 Amazon Bedrock AWS 的費用。如需詳細資訊，請參閱[使用 Amazon Redshift 資料 API](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)。

## CREATE EXTERNAL MODEL 語法
<a name="r_create_external_model_syntax"></a>

以下是 CREATE EXTERNAL MODEL 陳述式的完整語法。

```
CREATE EXTERNAL MODEL model_name 
FUNCTION function_name
IAM_ROLE {default/'arn:aws:iam::<account-id>:role/<role-name>'}
MODEL_TYPE BEDROCK
SETTINGS (
   MODEL_ID model_id
   [, PROMPT 'prompt prefix']
   [, SUFFIX 'prompt suffix']
   [, REQUEST_TYPE {RAW|UNIFIED}]
   [, RESPONSE_TYPE {VARCHAR|SUPER}]
);
```

`CREATE EXTERNAL MODEL` 命令會建立您用來產生內容的推論函數。

以下是 `CREATE EXTERNAL MODEL` 使用 `REQUEST_TYPE` 為 `RAW` 所建立的推論函數的語法：

```
SELECT inference_function_name(request_super) 
[FROM table];
```

以下是 `CREATE EXTERNAL MODEL` 使用 `REQUEST_TYPE` 為 `UNIFIED` 所建立的推論函數的語法：

```
SELECT inference_function_name(input_text, [, inference_config [, additional_model_request_fields]])
[FROM table];
```

如需有關如何使用推論函數的相關資訊，請參閱 [針對 Amazon Redshift ML 與 Amazon Bedrock 整合使用外部模型](machine-learning-br.md#machine-learning-br-use)。

## CREATE EXTERNAL MODEL 參數和設定
<a name="r_create_external_model_parameters_settings"></a>

本節說明 `CREATE EXTERNAL MODEL` 命令的參數和設定。

**Topics**
+ [CREATE EXTERNAL MODEL 參數](#r_create_external_model_parameters)
+ [CREATE EXTERNAL MODEL 設定](#r_create_external_model_settings)

### CREATE EXTERNAL MODEL 參數
<a name="r_create_external_model_parameters"></a>

model\$1name  
外部模型的名稱。結構描述中的模型名稱必須是唯一的。

FUNCTION *function\$1name (data\$1type [,...] )*  
`CREATE EXTERNAL MODEL` 所建立推論函數的名稱。您使用推論函數將請求傳送至 Amazon Bedrock，並擷取 ML 產生的文字。

IAM\$1ROLE * \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1*  
Amazon Redshift 用來存取 Amazon Bedrock 的 IAM 角色。如需 IAM 角色的資訊，請參閱 [建立或更新 Amazon Redshift ML 與 Amazon Bedrock 整合的 IAM 角色](machine-learning-br.md#machine-learning-br-iam)。

MODEL\$1TYPE BEDROCK  
指定模型類型。唯一有效的值為 `BEDROCK`。

SETTINGS ( MODEL\$1ID model\$1id [,...] )  
指定外部模型設定。如需詳細資訊，請參閱下列章節。

### CREATE EXTERNAL MODEL 設定
<a name="r_create_external_model_settings"></a>

MODEL\$1ID model\$1id  
外部模型的識別碼，例如 `anthropic.claude-v2`。如需 Amazon Bedrock 模型 ID 的相關資訊，請參閱 [Amazon Bedrock 模型 ID](https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html)。

PROMPT 'prompt prefix'  
指定 Amazon Redshift 新增至每個推論請求開頭的靜態提示。僅在 `REQUEST_TYPE` 為 `UNIFIED` 的情況下支援。

SUFFIX 'prompt suffix'  
指定 Amazon Redshift 新增至每個推論請求結尾的靜態提示。僅在 `REQUEST_TYPE` 為 `UNIFIED` 的情況下支援。

REQUEST\$1TYPE \$1 RAW \$1 UNIFIED \$1  
指定傳送至 Amazon Bedrock 的請求格式。有效值包括下列項目：  
+ **RAW**：推論函數會將輸入視為單一 super 值，並一律傳回 super 值。Super 值的格式為選取的 Amazon Bedrock 模型專屬。Super 是一種預測模型，結合了多種演算法來產生單一、改進的預測。
+ **UNIFIED**：推論函數使用統一的 API。所有模型與 Amazon Bedrock 之間擁有統一且一致的介面。這適用於所有支援訊息的模型。此為預設值。

  如需詳細資訊，請參閱 *Amazon Bedrock API 文件*中的 [Converse API 文件](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html)。

RESPONSE\$1TYPE \$1 VARCHAR \$1 SUPER \$1  
指定回應的格式。如果 `REQUEST_TYPE` 是 `RAW`，則需要 `RESPONSE_TYPE`，且唯一有效的值是 `SUPER`。對於所有其他 `REQUEST TYPE` 值，預設值為 `VARCHAR`，且 `RESPONSE_TYPE` 為選用。有效值包括下列項目：  
+ **VARCHAR**：Amazon Redshift 只會傳回模型產生的文字回應。
+ **SUPER**：Amazon Redshift 會將模型產生的整個回應 JSON 作為 super 傳回。這包括文字回應，以及像是停止原因、模型輸入和輸出字符用量等資訊。Super 是一種預測模型，結合了多種演算法來產生單一、改進的預測。

## CREATE EXTERNAL MODEL 推論函數參數
<a name="r_create_external_model_if_parameters"></a>

本節說明 `CREATE EXTERNAL MODEL` 命令所建立推論函數的有效參數。

### `REQUEST_TYPE` 為 `RAW` 的 CREATE EXTERNAL MODEL 推論函數參數
<a name="r_create_external_model_if_parameters_raw"></a>

若建立的推論函數的 `REQUEST_TYPE` 為 `RAW`，則會擁有一個 super 輸入引述數，且一律會傳回 super 資料類型。輸入 super 的語法遵循從 Amazon Bedrock 選取的特定模型請求的語法。

### `REQUEST_TYPE` 為 `UNIFIED` 的 CREATE EXTERNAL MODEL 推論函數參數
<a name="r_create_external_model_if_parameters_unified"></a>

input\$1text  
Amazon Redshift 傳送至 Amazon Bedrock 的文字。

inference\$1config  
Super 值，其中包含 Amazon Redshift 傳送至 Amazon Bedrock 的選用參數。這些可能包括以下項目：  
+ maxTokens
+ stopSequences
+ 溫度
+ topP
這些參數全都是選用，且全部區分大小寫。如需這些參數的相關資訊，請參閱 *Amazon Bedrock API 參考*中的 [InferenceConfiguration](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InferenceConfiguration.html)。

# CREATE EXTERNAL SCHEMA
<a name="r_CREATE_EXTERNAL_SCHEMA"></a>

在目前資料庫中建立新的外部結構描述。您可以使用此外部結構描述連線到 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 相容版本資料庫。您也可以建立參考外部資料目錄中資料庫的外部結構描述 AWS Glue，例如 Athena，或 Apache Hive 中繼存放區中的資料庫，例如 Amazon EMR。

此結構描述的擁有者是 CREATE EXTERNAL SCHEMA 命令的發行者。若要轉移外部結構描述的所有權，請使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 來變更擁有者。若要將結構描述的存取權授予其他使用者或使用者群組，請使用 [GRANT](r_GRANT.md) 命令。

您無法使用 GRANT 或 REVOKE 命令處理外部資料表的許可。這時請改為在外部結構描述授予和撤銷許可。

**注意**  
如果您目前在 Amazon Athena 資料目錄中有 Redshift Spectrum 外部資料表，則可以將 Athena 資料目錄遷移到 AWS Glue Data Catalog。若要搭配 Redshift Spectrum 使用 AWS Glue Data Catalog，您可能需要變更 AWS Identity and Access Management (IAM) 政策。如需詳細資訊，請參閱《*Athena 使用者指南*》中的[升級至 AWS Glue Data Catalog](https://docs.aws.amazon.com/athena/latest/ug/glue-athena.html#glue-upgrade)。

若要檢視外部結構描述的詳細資訊，請查詢 [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 系統畫面。

## 語法
<a name="r_CREATE_EXTERNAL_SCHEMA-synopsis"></a>

以下語法描述用來使用外部資料目錄以參考資料的 CREATE EXTERNAL SCHEMA 命令。如需詳細資訊，請參閱[Amazon Redshift Spectrum](c-using-spectrum.md)。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM [ [ DATA CATALOG ] | HIVE METASTORE | POSTGRES | MYSQL | KINESIS | MSK | REDSHIFT | KAFKA ]
[ DATABASE 'database_name' ]
[ SCHEMA 'schema_name' ]
[ REGION 'aws-region' ]
[ IAM_ROLE [ default | 'SESSION' | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' ] ]
[ AUTHENTICATION [ none | iam | mtls] ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ]
[ URI ['hive_metastore_uri' [ PORT port_number ] | 'hostname' [ PORT port_number ] | 'Kafka bootstrap URL'] ] 
[ CLUSTER_ARN 'arn:aws:kafka:<region>:<AWS 帳戶-id>:cluster/msk/<cluster uuid>' ]
[ CATALOG_ROLE [ 'SESSION' | 'catalog-role-arn-string' ] ]
[ CREATE EXTERNAL DATABASE IF NOT EXISTS ]
[ CATALOG_ID 'Amazon Web Services account ID containing Glue or Lake Formation database' ]
```

以下語法描述用來對 RDS POSTGRES 或 Aurora PostgreSQL 使用聯合查詢以參考資料的 CREATE EXTERNAL SCHEMA 命令。您也可以建立參照串流來源的外部結構描述，例如 Kinesis Data Streams。如需詳細資訊，請參閱[使用 Amazon Redshift 中的聯合查詢來查詢資料](federated-overview.md)。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM POSTGRES
DATABASE 'federated_database_name' [SCHEMA 'schema_name']
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

以下語法描述用來對 RDS MySQL 或 Aurora MySQL 使用聯合查詢以參考資料的 CREATE EXTERNAL SCHEMA 命令。如需詳細資訊，請參閱[使用 Amazon Redshift 中的聯合查詢來查詢資料](federated-overview.md)。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] local_schema_name
FROM MYSQL
DATABASE 'federated_database_name'
URI 'hostname' [ PORT port_number ]
IAM_ROLE [ default | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' ]
SECRET_ARN 'ssm-secret-arn'
```

以下語法描述用來在 Kinesis 串流中參考資料的 CREATE EXTERNAL SCHEMA 命令。如需詳細資訊，請參閱[將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md)。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KINESIS
IAM_ROLE [ default | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' ]
```

下列語法描述用於參考 Amazon Managed Streaming for Apache Kafka 或 Confluent Cloud 叢集及其主題以便從中擷取的 CREATE EXTERNAL SCHEMA 命令。若要連線，請提供代理系統 URI。如需詳細資訊，請參閱[將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md)。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] schema_name
FROM KAFKA
[ IAM_ROLE [ default | 'arn:aws:iam::<AWS 帳戶-id>:role/<role-name>' ] ]
URI 'Kafka bootstrap URI'
AUTHENTICATION [ none | iam | mtls ]
[ AUTHENTICATION_ARN 'acm-certificate-arn' | SECRET_ARN 'ssm-secret- arn' ];
```

以下語法描述用來使用跨資料庫查詢以參考資料的 CREATE EXTERNAL SCHEMA 命令。

```
CREATE EXTERNAL SCHEMA local_schema_name
FROM  REDSHIFT
DATABASE 'redshift_database_name' SCHEMA 'redshift_schema_name'
```

## Parameters
<a name="r_CREATE_EXTERNAL_SCHEMA-parameters"></a>

IF NOT EXISTS  
此子句會指出，若指定的結構描述已存在，則命令不應進行任何變更，且應傳回結構描述存在的訊息，而不是在發生錯誤的情況下終止。此子句在編寫指令碼時很實用，如此指令碼就不會因為 CREATE EXTERNAL SCHEMA 嘗試建立已存在的結構描述而失敗。

local\$1schema\$1name  
新外部結構描述的名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

FROM [ DATA CATALOG ] \$1 HIVE METASTORE \$1 POSTGRES \$1 MYSQL \$1 KINESIS \$1 MSK \$1 REDSHIFT   
指出外部資料庫所在位置的關鍵字。  
DATA CATALOG 會指出，外部資料庫是定義在 Athena 資料目錄中或 AWS Glue Data Catalog。  
如果外部資料庫是在不同 AWS 區域的外部資料目錄中定義，則需要 REGION 參數。DATA CATALOG 是預設值。  
HIVE METASTORE 指出，外部資料庫是在 Apache Hive 中繼存放區中定義。若指定了 HIVE METASTORE，則需要 URI。  
POSTGRES 表示外部資料庫是在 RDS PostgreSQL 或 Aurora PostgreSQL 中定義的。  
MYSQL 表示外部資料庫是在 RDS MySQL 或 Aurora MySQL 中定義的。  
KINESIS 表示資料來源來自 Kinesis Data Streams。  
MSK 表示資料來源是 Amazon MSK 佈建或無伺服器叢集。  
KAFKA 表示資料來源是 Kafka 叢集。您可以針對 Amazon MSK 和 Confluent Cloud 使用此關鍵字。

FROM REDSHIFT  
指出資料庫位於 Amazon Redshift 中的關鍵字。

DATABASE '*redshift\$1database\$1name*' SCHEMA '*redshift\$1schema\$1name*'  
Amazon Redshift 資料庫的名稱。  
*redshift\$1schema\$1name* 表示 Amazon Redshift 中的結構描述。預設的 *redshift\$1schema\$1name* 為 `public`。

DATABASE '*federated\$1database\$1name*'  
關鍵字，指出所支援 PostgreSQL 或 MySQL 資料庫引擎中的外部資料庫名稱。

[SCHEMA '*schema\$1name*']  
*schema\$1name* 表示支援的 PostgreSQL 資料庫引擎中的結構描述。預設 *schema\$1name* 是 `public`。  
當您對支援的 MySQL 資料庫引擎設定聯合查詢時，您無法指定 SCHEMA。

REGION '*aws-region*'  
如果外部資料庫是在 Athena 資料目錄或 中定義 AWS Glue Data Catalog，則為資料庫所在的 AWS 區域。如果資料庫是在外部資料目錄中定義，則需要此參數。

URI [ 'hive\$1metastore\$1uri' [ PORT port\$1number ] \$1 'hostname' [ PORT port\$1number ] \$1 'Kafka bootstrap URI' ]  
所支援 PostgreSQL 或 MySQL 資料庫引擎的主機名稱 URI 和 port\$1number。*hostname* 是複本集的前端節點。端點必須可從 Amazon Redshift 叢集連接 (可路由)。預設的 PostgreSQL port\$1number 為 5432。預設的 MySQL port\$1number 為 3306。  
支援的 PostgreSQL 或 MySQL 資料庫引擎必須與您的 Amazon Redshift 叢集位於相同 VPC 中，且其安全群組連結至 Amazon Redshift 和 RDS url-rsPostgreSQL 或 Aurora PostgreSQL。此外，您可以使用增強型 VPC 路由來設定跨 VPC 使用案例。如需詳細資訊，請參閱 [Redshift 受管 VPC 端點](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-cluster-cross-vpc.html)。
**指定 Hive 中繼存放區 URI**  
如果資料庫位於 Hive 中繼存放區中，請指定中繼存放區的 URI 並選擇性地指定連接埠號碼。預設連接埠號碼為 9083。  
URI 不包含通訊協定規格 ("http://")。有效 URI 的範例：`uri '172.10.10.10'`。  
**指定用於串流擷取的代理系統 URI**  
包含啟動程序代理系統 URI 可讓您連線至 Amazon MSK 或 Confluent Cloud 叢集，並接收串流資料。如需詳細資訊並查看範例，請參閱[開始使用 Amazon Managed Streaming for Apache Kafka 中的串流擷取](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion-getting-started-MSK.html)。

IAM\$1ROLE [ default \$1 'SESSION' \$1 'arn:aws:iam::*<AWS 帳戶-id>*:role/*<role-name>*' ]  
使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE EXTERNAL SCHEMA 命令時與叢集關聯的 IAM 角色。  
如果您使用聯合身分連線到 Amazon Redshift 叢集，並從使用此命令建立的外部結構描述存取資料表，請使用 `'SESSION'`。如需詳細資訊，請參閱[使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)，其中會說明如何設定聯合身分。請注意，只有在使用 `DATA CATALOG` 建立結構描述時，才能使用此組態 (使用 `'SESSION'` 取代 ARN)。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。IAM 角色最少須具有在所要存取的 Amazon S3 儲存貯體上執行 LIST 操作，以及在儲存貯體包含的 Amazon S3 物件上執行 GET 操作的許可。  
以下顯示單一 ARN 的 IAM\$1ROLE 參數字串語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
您可以鏈結角色，以便您的叢集可以擔任其他 IAM 角色 (可能屬於其他帳戶)。您最多可以鏈結 10 個角色。如需鏈結角色的範例，請參閱 [在 Amazon Redshift Spectrum 中鏈結 IAM 角色](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)。  
 對於此 IAM 角色，請附加與以下內容相似的 IAM 許可政策。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
如需建立 IAM 角色以搭配聯合查詢使用的步驟，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。  
不要在鏈結的角色清單中包含空格。
以下顯示鏈結三個角色的語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

SECRET\$1ARN '*ssm-secret-arn*'  
使用 建立的支援 PostgreSQL 或 MySQL 資料庫引擎秘密的 Amazon Resource Name (ARN) AWS Secrets Manager。如需如何建立和擷取機密的 ARN 的相關資訊，請參閱《AWS Secrets Manager 使用者指南》**中的[使用 AWS Secrets Manager管理機密](https://docs.aws.amazon.com/secretsmanager/latest/userguide/manage_create-basic-secret.html)，以及[在 Amazon Redshift 中擷取機密的 Amazon Resource Name (ARN)](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-secrets-manager-integration-retrieving-secret.html)。

CATALOG\$1ROLE [ 'SESSION' \$1 *catalog-role-arn-string*]  
使用聯合身分透過 `'SESSION'` 連接到 Amazon Redshift 叢集，以便對資料目錄進行身份驗證和授權。如需完成聯合身分步驟的相關資訊，請參閱[使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)。請注意，只有在 DATA CATALOG 中建立結構描述時，才能使用 `'SESSION'` 角色。  
使用叢集進行資料目錄的身分驗證和授權時所使用 IAM 角色的 Amazon Resource Name (ARN)。  
如未指定 CATALOG\$1ROLE，則 Amazon Redshift 會使用指定的 IAM\$1ROLE。目錄角色必須具有在 AWS Glue 或 Athena 中存取 Data Catalog 的許可。如需詳細資訊，請參閱[Amazon Redshift Spectrum 的 IAM 政策](c-spectrum-iam-policies.md)。  
以下顯示單一 ARN 的 CATALOG\$1ROLE 參數字串語法。  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role>'
```
您可以鏈結角色，以便您的叢集可以擔任其他 IAM 角色 (可能屬於其他帳戶)。您最多可以鏈結 10 個角色。如需詳細資訊，請參閱[在 Amazon Redshift Spectrum 中鏈結 IAM 角色](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)。  
鏈結的角色清單不得包含空格。
以下顯示鏈結三個角色的語法。  

```
CATALOG_ROLE 'arn:aws:iam::<aws-account-id>:role/<catalog-role-1-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-2-name>,arn:aws:iam::<aws-account-id>:role/<catalog-role-3-name>'
```


CREATE EXTERNAL DATABASE IF NOT EXISTS  
如果指定的外部資料庫不存在，此子句會使用 DATABASE 引數所指定的名稱建立外部資料庫。如果指定的外部資料庫存在，則此命令不會進行任何變更。在這種情況下，此命令會傳回外部資料庫存在的訊息，並不會因錯誤而終止。  
您不可搭配使用 CREATE EXTERNAL DATABASE IF NOT EXISTS 與 HIVE METASTORE。  
若要搭配為 AWS Lake Formation啟用的 Data Catalog 使用 CREATE EXTERNAL DATABASE IF NOT EXISTS，則需要 Data Catalog 的 `CREATE_DATABASE` 許可。

CATALOG\$1ID '*包含 Glue 或 Lake Formation 資料庫的 Amazon Web Services 帳戶 ID帳戶 ID*'  
儲存資料目錄資料庫的帳戶 ID。  
只有在您打算連接到 Amazon Redshift 叢集或 Amazon Redshift Serverless，並透過設定下列任一項來使用聯合身分進行資料目錄的身份驗證和授權時，才能指定 `CATALOG_ID`：  
+ `CATALOG_ROLE` 至 `'SESSION'`
+ `IAM_ROLE` 設定為 `'SESSION'`，`'CATALOG_ROLE'` 設定為其預設值 
如需完成聯合身分步驟的相關資訊，請參閱[使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)。

AUTHENTICATION  
為串流擷取定義的驗證類型。具有驗證類型的串流擷取會與 Amazon Managed Streaming for Apache Kafka 搭配運作。`AUTHENTICATION` 類型如下：  
+ **none** - 指定不需身分驗證。這會對應至 MSK 上的未經驗證存取，或 Apache Kafka 上使用 TLS 的純文字。
+ **iam** — 指定 IAM 身份驗證。選擇此選項時，請確保 IAM 角色具有 IAM 身份驗證的許可。如需定義外部結構描述的相關資訊，請參閱 [開始從 Apache Kafka 來源進行串流擷取](materialized-view-streaming-ingestion-getting-started-MSK.md)。
+ **mtls** - 指定雙向 Transport Layer Security 透過簡化用戶端與伺服器之間的身分驗證來提供安全通訊。在此情況下，用戶端是 Redshift，而伺服器是 Amazon MSK。如需使用 mTLS 設定串流擷取的詳細資訊，請參閱 [從 Apache Kafka 來源執行 Redshift 串流擷取時使用 mTLS 進行身分驗證](materialized-view-streaming-ingestion-mtls.md)。


AUTHENTICATION\$1ARN  
Amazon Redshift 使用 Amazon MSK 進行 mtls 身分驗證的 AWS Certificate Manager 憑證 ARN。當您選擇發出憑證時，ACM 主控台中就會提供 ARN。

CLUSTER\$1ARN  
若是串流擷取，CLUSTER\$1ARN 是您要從中進行串流處理的 Amazon Managed Streaming for Apache Kafka 叢集識別碼。使用 CLUSTER\$1ARN 時，須有包含 `kafka:GetBootstrapBrokers` 許可的 IAM 角色政策。提供此選項是為了回溯相容性。目前，我們建議您使用啟動程序代理系統 URI 選項來連線至 Amazon Managed Streaming for Apache Kafka 叢集。如需詳細資訊，請參閱[串流擷取](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-streaming-ingestion.html)。

## 使用須知
<a name="r_CREATE_EXTERNAL_SCHEMA_usage"></a>

如需使用 Athena 資料目錄時的限制，請參閱 AWS 一般參考中的 [Athena 限制](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#amazon-athena-limits)。

如需使用 時的限制 AWS Glue Data Catalog，請參閱《》中的[AWS Glue 限制](https://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_glue) AWS 一般參考。

這些限制不適用於 Hive 中繼存放區。

每個資料庫最多 9,900 個結構描述。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[配額和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

如要取消註冊結構描述，請使用 [DROP SCHEMA](r_DROP_SCHEMA.md) 命令。

如要檢視外部結構描述的詳細資訊，請查詢下列系統檢視：
+ [SVV\$1EXTERNAL\$1SCHEMAS](r_SVV_EXTERNAL_SCHEMAS.md) 
+ [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 
+ [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 

## 範例
<a name="r_CREATE_EXTERNAL_SCHEMA_examples"></a>

以下範例使用美國西部 (奧勒岡) 區域中資料目錄中名為 `sampledb` 的資料庫建立外部結構描述。將此範例與 Athena 或 AWS Glue 資料目錄搭配使用。

```
create external schema spectrum_schema
from data catalog
database 'sampledb'
region 'us-west-2'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

以下範例會建立外部結構描述，並建立名為 `spectrum_db` 的新外部資料庫。

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole'
create external database if not exists;
```

以下範例使用名為 `hive_db` 的 Hive 中繼存放區資料庫建立外部結構描述。

```
create external schema hive_schema
from hive metastore
database 'hive_db'
uri '172.10.10.10' port 99
iam_role 'arn:aws:iam::123456789012:role/MySpectrumRole';
```

以下範例會鏈結角色，以使用 `myS3Role` 角色存取 Amazon S3，並使用 `myAthenaRole` 存取資料目錄。如需詳細資訊，請參閱[在 Amazon Redshift Spectrum 中鏈結 IAM 角色](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)。

```
create external schema spectrum_schema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myRedshiftRole,arn:aws:iam::123456789012:role/myS3Role'
catalog_role 'arn:aws:iam::123456789012:role/myAthenaRole'
create external database if not exists;
```

以下範例會建立外部結構描述，參考 Aurora PostgreSQL 資料庫。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM POSTGRES
DATABASE 'my_aurora_db' SCHEMA 'my_aurora_schema'
URI 'endpoint to aurora hostname' PORT 5432  
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

下列範例會建立外部結構描述，以參照在取用者叢集上匯入的 sales\$1db。

```
CREATE EXTERNAL SCHEMA sales_schema FROM REDSHIFT DATABASE 'sales_db' SCHEMA 'public';
```

以下範例會建立外部結構描述，參考 Aurora MySQL 資料庫。

```
CREATE EXTERNAL SCHEMA [IF NOT EXISTS] myRedshiftSchema
FROM MYSQL
DATABASE 'my_aurora_db'
URI 'endpoint to aurora hostname'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyAuroraRole'
SECRET_ARN 'arn:aws:secretsmanager:us-east-2:123456789012:secret:development/MyTestDatabase-AbCdEf'
```

# CREATE EXTERNAL TABLE
<a name="r_CREATE_EXTERNAL_TABLE"></a>

在指定的結構描述中建立新的外部資料表。所有外部資料表都必須經由外部結構描述建立。外部結構描述和外部資料表不支援搜尋路徑。如需詳細資訊，請參閱[CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

除了使用 CREATE EXTERNAL TABLE 命令建立的外部資料表之外，Amazon Redshift 還可以參考 AWS Glue 或 AWS Lake Formation 目錄或 Apache Hive 中繼存放區中定義的外部資料表。使用 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md) 命令註冊外部目錄中定義的外部資料庫，並且在 Amazon Redshift 中將外部資料表提供使用。如果外部資料表存在於 AWS Glue 或 AWS Lake Formation 目錄或 Hive 中繼存放區中，則不需要使用 CREATE EXTERNAL TABLE 建立資料表。若要檢視外部資料表，請查詢 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 系統畫面。

透過執行 CREATE EXTERNAL TABLE AS 命令，您可以建立依據從查詢欄定義的外部資料表，並將該查詢的結果寫入 Amazon S3。結果為 Apache Parquet 或分隔文字格式。如果外部資料表有一個或多個分割區索引鍵，Amazon Redshift 會根據這些分割區索引鍵來分割新檔案，並自動將新的分割區註冊到外部類別目錄中。如需 CREATE EXTERNAL TABLE AS 的相關資訊，請參閱 [使用須知](r_CREATE_EXTERNAL_TABLE_usage.md)。

您可以用與其他 Amazon Redshift 資料表一起使用的相同 SELECT 語法來查詢外部資料表。您也可以使用 INSERT 語法將新檔案寫入 Amazon S3 上外部資料表的位置。如需詳細資訊，請參閱[INSERT (外部資料表)](r_INSERT_external_table.md)。

若要建立外部資料表的檢視，請在 [CREATE VIEW](r_CREATE_VIEW.md) 陳述式中包含 WITH NO SCHEMA BINDING 子句。

您無法在交易內 (BEGIN … END) 執行 CREATE EXTERNAL TABLE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

## 所需權限
<a name="r_CREATE_EXTERNAL_TABLE-privileges"></a>

您必須為外部結構描述的擁有者或超級使用者，始可建立外部資料表。若要轉移外部結構描述的所有權，請使用 ALTER SCHEMA 來變更擁有者。外部資料表的存取權是由外部結構描述的存取權所控制。您無法對外部資料表上的許可執行 [GRANT](r_GRANT.md) 或 [REVOKE](r_REVOKE.md)。但可改為在外部結構描述授予和撤銷 USAGE。

[使用須知](r_CREATE_EXTERNAL_TABLE_usage.md) 具有有關外部資料表特定權限的其他資訊。

## 語法
<a name="r_CREATE_EXTERNAL_TABLE-synopsis"></a>

```
CREATE EXTERNAL TABLE
external_schema.table_name
(column_name data_type [, …] )
[ PARTITIONED BY (col_name data_type [, … ] )]
[ { ROW FORMAT DELIMITED row_format |
  ROW FORMAT SERDE 'serde_name'
  [ WITH SERDEPROPERTIES ( 'property_name' = 'property_value' [, ...] ) ] } ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' | 's3://bucket/manifest_file' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
```

以下是 CREATE EXTERNAL TABLE AS 的語法。

```
CREATE EXTERNAL TABLE
external_schema.table_name
[ PARTITIONED BY (col_name [, … ] ) ]
[ ROW FORMAT DELIMITED row_format ]
STORED AS file_format
LOCATION { 's3://bucket/folder/' }
[ TABLE PROPERTIES ( 'property_name'='property_value' [, ...] ) ]
 AS
 { select_statement }
```

## Parameters
<a name="r_CREATE_EXTERNAL_TABLE-parameters"></a>

 *external\$1schema.table\$1name*   
要建立的資料表名稱，以外部結構描述名稱限定。外部資料表必須建立在外部結構描述中。如需詳細資訊，請參閱[CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。  
資料表名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。Amazon Redshift 會強制執行每個叢集 9,900 個資料表的限制，包括使用者定義的臨時資料表，以及 Amazon Redshift 在查詢處理或系統維護期間建立的臨時資料表。您也可以選擇使用資料庫名稱來限定資料表名稱。在以下範例中，資料庫名稱為 `spectrum_db`，外部結構描述名稱為 `spectrum_schema`，而資料表名稱為 `test`。  

```
create external table spectrum_db.spectrum_schema.test (c1 int)
stored as parquet
location 's3://amzn-s3-demo-bucket/myfolder/';
```
如果指定的資料庫或結構描述不存在，則不會建立資料表，而且陳述式會傳回錯誤。您無法在系統資料庫 `template0`、`template1`、`padb_harvest` 和 `sys:internal` 中建立資料表或檢視。  
資料表名稱對於指定的結構描述來說必須是唯一的。  
如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

( *column\$1name* *data\$1type* )  
要建立的每個資料欄的名稱和資料類型。  
資料欄名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。您無法指定資料欄名稱 `"$path"` 或 `"$size"`。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
Amazon Redshift 預設會以虛擬資料欄 `$path` 和 `$size` 建立外部資料表。您可以藉由將 `spectrum_enable_pseudo_columns` 組態參數設定為 `false`，以停用工作階段的虛擬資料欄建立。如需詳細資訊，請參閱[虛擬資料欄](r_CREATE_EXTERNAL_TABLE_usage.md#r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns)。  
若已啟用虛擬資料欄，則單一資料表中可定義的資料欄數目上限為 1,598 個。若未啟用虛擬資料欄，則單一資料表中可定義的資料欄數目上限為 1,600 個。  
若您要建立「寬資料表」，則務必確定在載入和查詢處理期間，您的資料欄清單未超過中繼結果的資料列寬度界限。如需詳細資訊，請參閱[使用須知](r_CREATE_TABLE_NEW.md#r_CREATE_TABLE_usage)。  
針對 CREATE EXTERNAL TABLE AS 命令，您不需要欄位清單，因為欄是從查詢中衍生的。

 *data\$1type*   
支援以下 [資料類型](c_Supported_data_types.md)：  
+ SMALLINT (INT2)
+ INTEGER (INT、INT4)
+ BIGINT (INT8)
+ DECIMAL (NUMERIC)
+ REAL (FLOAT4)
+ DOUBLE PRECISION (FLOAT8)
+ BOOLEAN (BOOL)
+ CHAR (CHARACTER)
+ VARCHAR (CHARACTER VARYING)
+ VARBYTE (CHARACTER VARYING) – 可以與 Parquet 和 ORC 資料檔案一起使用，並且只能與未分割資料表一起使用。
+ DATE – 只可搭配文字、Parquet 或 ORC 資料檔案使用，或做為分割區資料欄使用。
+ TIMESTAMP
  
對於 DATE，您可以使用如下所述的格式。使用數字表示的月份值支援下列格式：  
+ `mm-dd-yyyy` 例如：`05-01-2017`。這是預設值。
+ `yyyy-mm-dd`，其中年份由 2 個以上的數字表示。例如 `2017-05-01`。
使用三個字母縮寫表示的月份值支援下列格式：  
+ `mmm-dd-yyyy` 例如：`may-01-2017`。這是預設值。
+ `dd-mmm-yyyy`，其中年份由 2 個以上的數字表示。例如 `01-may-2017`。
+ `yyyy-mmm-dd`，其中年份由 2 個以上的數字表示。例如 `2017-may-01`。
對於始終小於 100 的年份值，年份的計算方式如下：  
+ 如果年份小於 70，則該年份的計算方式為年份加上 2000。例如，使用 `mm-dd-yyyy` 格式的日期 05-01-17 會轉換成 `05-01-2017`。
+ 如果年份小於 100 且大於 69，則該年份的計算方式為年份加上 1900。例如，使用 `mm-dd-yyyy` 格式的日期 05-01-89 會轉換成 `05-01-1989`。
+ 對於以兩個數字表示的年份值，請在前面加上零以使用 4 個數字表示年份。
文字檔案中的時間戳記值格式必須為 `yyyy-mm-dd HH:mm:ss.SSSSSS`，如以下的時間戳記值所示：`2017-05-01 11:30:59.000000`。  
VARCHAR 資料欄的長度是以字元組而非字元來定義。例如，VARCHAR(12) 資料欄可包含 12 個單位元組的字元或 6 個 2 位元組的字元。查詢外部資料表時，結果會截斷以配合定義的資料欄大小，而不會傳回錯誤。如需詳細資訊，請參閱[儲存與範圍](r_Character_types.md#r_Character_types-storage-and-ranges)。  
為獲得最佳效能，建議您指定可配合您的資料的最小資料欄大小。若要尋找資料欄中值位元組的大小上限，請使用 [OCTET\$1LENGTH](r_OCTET_LENGTH.md) 函數。下列範例會傳回電子郵件資料欄中值的大小上限。  

```
select max(octet_length(email)) from users;

max
---
 62
```

PARTITIONED BY (*col\$1name* *data\$1type* [, … ] )  
此子句會定義包含一個或多個分割區資料欄的分割資料表。每種指定的組合都會另外使用一個資料目錄，這樣可在某些情況下改善查詢效能。資料表資料內並未包含分割資料欄。如果您對 *col\$1name* 使用的值與資料表資料欄相同，則會發生錯誤。  
建立分割資料表後，使用 [ALTER TABLE](r_ALTER_TABLE.md) … ADD PARTITION 陳述式以將新增分割區註冊到外部目錄。當您新增分割區時，會定義 Amazon S3 上包含分割區資料的子資料夾位置。  
例如，若資料表 `spectrum.lineitem_part` 是以 `PARTITIONED BY (l_shipdate date)` 定義，執行下列 ALTER TABLE 命令來新增分割區。  

```
ALTER TABLE spectrum.lineitem_part ADD PARTITION (l_shipdate='1992-01-29')
LOCATION 's3://spectrum-public/lineitem_partition/l_shipdate=1992-01-29';
```
如果您使用 CREATE EXTERNAL TABLE AS，則不需要執行 ALTER TABLE...ADD PARTITION。Amazon Redshift 會自動在外部目錄中註冊新的分割區。Amazon Redshift 也會根據資料表中定義的一個或多個分割區索引鍵，自動將對應的資料寫入 Amazon S3 中的分割區。  
若要檢視分割區，請查詢 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 系統畫面。  
針對 CREATE EXTERNAL TABLE AS 命令，您不需要指定分割區欄位的資料類型，因為此欄位是從查詢衍生的。

ROW FORMAT DELIMITED *rowformat*  
此子句會指定基礎資料的格式。*rowformat* 可能的值如下：  
+ LINES TERMINATED BY '*delimiter*'
+ FIELDS TERMINATED BY '*delimiter*'
指定單一 ASCII 字元做為 '*delimiter*'。您可以使用八進位指定非印刷 ASCII 字元，格式為 `'\`*`ddd`*`'`，其中 *`d`* 是八進位數字 (0-7)，最大為 '\$1177'。以下範例使用八進位指定 BEL (鐘形) 字元。  

```
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\007'
```
如果省略 ROW FORMAT，預設格式會是 DELIMITED FIELDS TERMINATED BY '\$1A' (標題開頭) 和 LINES TERMINATED BY '\$1n' (換行符號)。

ROW FORMAT SERDE '*serde\$1name*'[WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
此子句會指定基礎資料的 SERDE 格式。    
'*serde\$1name*'  
SerDe 的名稱。您可以指定下列格式：  
+ org.apache.hadoop.hive.serde2.RegexSerDe 
+ com.amazonaws.glue.serde.GrokSerDe 
+ org.apache.hadoop.hive.serde2.OpenCSVSerde 

  此參數支援 OpenCSVSerde 的下列 SerDe 屬性：

  ```
  'wholeFile' = 'true' 
  ```

  將 `wholeFile` 屬性設定為 `true`，以正確剖析 OpenCSV 請求中引號字串內的新行字元 (\$1n)。
+ org.openx.data.jsonserde.JsonSerDe
  + JSON SERDE 也支援 Ion 檔案。
  + JSON 必須格式正確。
  + 採用 Ion 和 JSON 的時間戳記必須使用 ISO8601 格式。
  + 此參數支援 JsonSerDe 的下列 SerDe 屬性：

    ```
    'strip.outer.array'='true' 
    ```

    處理包含含括在外部方括弧 ( [ … ] ) 中的一個非常大型陣列的 Ion/JSON 檔案，就好像在陣列內包含多個 JSON 記錄。
+ com.amazon.ionhiveserde.IonHiveSerDe

  除了資料類型外，Amazon ION 格式還提供文字和二進位格式。對於參考 ION 格式資料的外部資料表，您可以將外部資料表中的每一欄對應至 ION 格式資料中的對應元素。如需詳細資訊，請參閱 [Amazon Ion](https://amzn.github.io/ion-docs/)。您還需要指定輸入和輸出格式。  
WITH SERDEPROPERTIES ( '*property\$1name*' = '*property\$1value*' [, ...] ) ]  
選擇性地指定屬性名稱和值，並以逗號分隔。
如果省略 ROW FORMAT，預設格式會是 DELIMITED FIELDS TERMINATED BY '\$1A' (標題開頭) 和 LINES TERMINATED BY '\$1n' (換行符號)。

STORED AS *file\$1format*  
資料檔案的檔案格式。  
有效格式如下：  
+ PARQUET
+ RCFILE (僅限使用 ColumnarSerDe 的資料，不適用 LazyBinaryColumnarSerDe)
+ SEQUENCEFILE
+ TEXTFILE (適用於文字檔案，包括 JSON 檔案)。
+ ORC 
+ AVRO 
+ INPUTFORMAT '*input\$1format\$1classname*' OUTPUTFORMAT '*output\$1format\$1classname*'
CREATE EXTERNAL TABLE AS 命令只支援兩種檔案格式，TEXTFILE 和 PARQUET。  
若是 INPUTFORMAT 和 OUTPUTFORMAT，請指定類別名稱，如以下範例所示。  

```
'org.apache.hadoop.mapred.TextInputFormat'
```

LOCATION \$1 's3://*bucket/folder*/' \$1 's3://*bucket/manifest\$1file*'\$1  <a name="create-external-table-location"></a>
包含資料檔案的 Amazon S3 儲存貯體或資料夾路徑，或包含 Amazon S3 物件路徑清單的資訊清單檔案。儲存貯體必須與 Amazon Redshift 叢集位於相同的 AWS 區域。如需支援的 AWS 區域清單，請參閱 [Amazon Redshift Spectrum 限制](c-spectrum-considerations.md)。  
如果路徑指定的是儲存貯體或資料夾，例如 `'s3://amzn-s3-demo-bucket/custdata/'`，則 Redshift Spectrum 會掃描指定儲存貯體或資料夾以及任何子資料夾裡的檔案。Redshift Spectrum 會忽略隱藏檔案以及開頭為句號或底線的檔案。  
如果路徑指定的是資訊清單檔案，則 `'s3://bucket/manifest_file'` 引數必須明確參考單一檔案，例如 `'s3://amzn-s3-demo-bucket/manifest.txt'`。無法參考金鑰前綴。  
資訊清單是 JSON 格式的文字檔案，其中列出要從 Amazon S3 載入之每個檔案的 URL 以及檔案的大小 (單位為位元組)。URL 包含檔案的儲存貯體名稱和完整物件路徑。資訊清單中指定的檔案可以位於不同的儲存貯體，但所有儲存貯體都必須位於與 Amazon Redshift 叢集相同的 AWS 區域。如果某個檔案列出兩次，則該檔案會載入兩次。下列範例顯示資訊清單的 JSON，此資訊清單會載入三個檔案。  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
您可以讓包含特定檔案變為強制性。若要這麼做，請在資訊清單中的檔案層級包含 `mandatory` 選項。當您查詢遺失強制性檔案的外部資料表時，SELECT 陳述式會失敗。確定外部資料表定義中包含的所有檔案均存在。如果並非全部存在，則會出現錯誤，顯示找不到第一個強制性檔案。下列範例顯示資訊清單的 JSON，其 `mandatory` 設定為 `true`。  

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket1/custdata.1", "mandatory":true, "meta": { "content_length": 5956875 } },
    {"url":"s3://amzn-s3-demo-bucket1/custdata.2", "mandatory":false, "meta": { "content_length": 5997091 } },
    {"url":"s3://amzn-s3-demo-bucket2/custdata.1", "meta": { "content_length": 5978675 } }
  ]
}
```
若要參考使用 UNLOAD 建立的檔案，您可以使用以 [UNLOAD](r_UNLOAD.md) 搭配 MANIFEST 參數所建立的資訊清單。資訊清單檔案與 [從 Amazon S3 進行 COPY](copy-parameters-data-source-s3.md) 的資訊清單檔案相容，但使用不同的索引鍵。未使用的索引鍵會加以忽略。

TABLE PROPERTIES ( '*property\$1name*'='*property\$1value*' [, ...] )   
此子句會設定資料表屬性的資料表定義。  
資料表屬性區分大小寫。  
 'compression\$1type'='*value*'  
 如果檔案名稱未包含副檔名，此屬性會設定要使用的壓縮類型。如果您設定此屬性，但是有副檔名，則會忽略副檔名並使用屬性所設定的值。壓縮類型的有效值如下所示：  
+ bzip2
+ gzip
+ 無
+ snappy  
'data\$1cleansing\$1enabled'='true / false’  
此屬性會設定資料表的資料處理是否開啟。當 'data\$1cleansing\$1enabled' 設定為 true 時，資料表的資料處理為開啟狀態。當 'data\$1cleansing\$1enabled' 設定為 false 時，資料表的資料處理為關閉狀態。以下是此屬性所控制的資料表層級資料處理屬性清單：  
+ column\$1count\$1mismatch\$1handling
+ invalid\$1char\$1handling
+ numeric\$1overflow\$1handling
+ replacement\$1char
+ surplus\$1char\$1handling
如需範例，請參閱 [資料處理範例](r_CREATE_EXTERNAL_TABLE_examples.md#r_CREATE_EXTERNAL_TABLE_examples-data-handling)。  
'invalid\$1char\$1handling'='*value*'  
指定當查詢結果包含無效的 UTF-8 字元值時要執行的動作。您可以指定下列動作：    
DISABLED  
不執行無效的字元處理。  
FAIL  
取消傳回的資料包含無效 UTF-8 值的查詢。  
SET\$1TO\$1NULL   
以 null 取代無效的 UTF-8 值。  
DROP\$1ROW  
將資料列中的每個值取代為 null。  
REPLACE  
以您使用 `replacement_char` 指定的取代字元取代無效字元。  
'replacement\$1char'='*character*’  
指定當您將 `invalid_char_handling` 設定為 `REPLACE` 時要使用的取代字元。  
'numeric\$1overflow\$1handling'='value’  
指定當 ORC 資料包含大於資料欄定義 (例如 SMALLINT 或 int16) 的整數 (例如，BIGINT 或 int64) 時，要執行的動作。您可以指定下列動作：    
DISABLED  
無效字元處理已關閉。  
FAIL  
當資料包含無效字元時，取消查詢。  
SET\$1TO\$1NULL  
將無效字符設定為 null。  
DROP\$1ROW  
將資料列中的每個值設定為 null。  
'surplus\$1bytes\$1handling'='*value*'  
針對包含 VARBYTE 資料的資料欄，指定當載入的資料超過所定義的資料類型長度時應如何處理。根據預設，Redshift Spectrum 會針對超出欄寬度的資料，將值設定為 null。  
您可以指定當查詢傳回超過資料類型長度的資料時，執行下列動作：    
SET\$1TO\$1NULL  
以 null 取代超過欄寬的資料。  
DISABLED  
不執行多餘位元組處理。  
FAIL  
取消傳回資料超出欄寬的查詢。  
DROP\$1ROW  
捨棄包含超出欄寬之資料的所有資料列。  
TRUNCATE  
如果字元超過為欄定義的字元數目上限，則移除字元。  
'surplus\$1char\$1handling'='*value*'  
針對包含 VARCHAR、CHAR 或字串資料的資料欄，指定當載入的資料超過所定義的資料類型長度時應如何處理。根據預設，Redshift Spectrum 會針對超出欄寬度的資料，將值設定為 null。  
您可以指定當查詢傳回超過欄寬的資料時，執行下列動作：    
SET\$1TO\$1NULL  
以 null 取代超過欄寬的資料。  
DISABLED  
不執行多餘字元處理。  
FAIL  
取消傳回資料超出欄寬的查詢。  
DROP\$1ROW  
將資料列中的每個值取代為 null。  
TRUNCATE  
如果字元超過為欄定義的字元數目上限，則移除字元。  
'column\$1count\$1mismatch\$1handling'='value’  
識別檔案包含的資料列值是否少於或多於外部資料表定義中指定的欄數。此屬性僅適用於未壓縮的文字檔案格式。您可以指定下列動作：    
DISABLED  
欄計數不相符處理已關閉。  
FAIL  
如果偵測到資料欄計數不相符，則查詢失敗。  
SET\$1TO\$1NULL  
使用 NULL 填入遺漏值，並忽略每一列中的其他值。  
DROP\$1ROW  
從掃描中捨棄包含欄計數不相符錯誤的所有資料列。  
'numRows'='*row\$1count*'  
此屬性會設定資料表定義的 numRows 值。若要明確更新外部資料表的統計資料，請設定 numRows 屬性以指出資料表的大小。Amazon Redshift 不會分析外部資料表來產生查詢最佳化工具用來產生查詢計劃的資料表統計資料。如果資料表統計資訊沒有為外部資料表進行設定，則 Amazon Redshift 會以「外部資料表較大而本機資料表較小」的假設來產生查詢執行計畫。  
'skip.header.line.count'='*line\$1count*'  
此屬性會設定每個來源檔案開頭要略過的資料列數。  
'serialization.null.format'=' '  
此屬性會指定，欄位中提供的文字有完全相符項目時，Spectrum 應傳回 `NULL` 值。  
'orc.schema.resolution'='mapping\$1type'  
此屬性會為使用 ORC 日期格式的資料表設定資料欄映射類型。將針對其他所有日期格式忽略此屬性。  
資料欄映射類型的有效值如下所示：  
+ name 
+ position 
如果忽略 *orc.schema.resolution* 屬性，則預設會依名稱映射資料欄。如果 *orc.schema.resolution* 設為 *'name'* 或 *'position'* 以外的任何值，則會依位置映射資料欄。如需資料欄映射的相關資訊，請參閱 [將外部資料表資料欄映射到 ORC 資料欄](c-spectrum-external-tables.md#c-spectrum-column-mapping-orc)。  
COPY 命令只會依位置映射至 ORC 資料檔案。*orc.schema.resolution* 資料表屬性對於 COPY 命令行為沒有影響。  
'write.parallel'='on/off’  
設定是否將 CREATE EXTERNAL TABLE AS 平行寫入資料的屬性。依預設，CREATE EXTERNAL TABLE AS 會根據叢集中的分割數，將資料平行寫入多個檔案。預設選項為開啟。當 'write.parallel' 設為關閉時，CREATE EXTERNAL TABLE AS 會連續寫入一個或多個資料檔案到 Amazon S3。此資料表屬性也適用於相同外部資料表的任何後續 INSERT 陳述式。  
‘write.maxfilesize.mb’=‘size’  
設定由 CREATE EXTERNAL TABLE AS 寫入 Amazon S3 的每個檔案之大小上限 (以 MB 為單位) 屬性。大小必須是介於 5 到 6200 之間的有效整數。預設的檔案大小上限為 6,200 MB。此資料表屬性也適用於相同外部資料表的任何後續 INSERT 陳述式。  
‘write.kms.key.id’=‘*value*’  
您可以指定 AWS Key Management Service 金鑰來啟用 Amazon S3 物件的伺服器端加密 (SSE)，其中*值*為下列其中一項：  
+ `auto` 使用存放在 Amazon S3 儲存貯體中的預設 AWS KMS 金鑰。
+ 您指定用來加密資料的 *kms-key*。  
*select\$1statement*  
透過定義任何查詢，將一或多個列插入外部資料表的陳述式。查詢產生的所有列都會根據表格定義，以文字或 Parquet 格式寫入到 Amazon S3。

## 範例
<a name="r_CREATE_EXTERNAL_TABLE_examples_link"></a>

您可在 [範例](r_CREATE_EXTERNAL_TABLE_examples.md) 取得範例集合。

# 使用須知
<a name="r_CREATE_EXTERNAL_TABLE_usage"></a>

本主題包含 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md) 的使用須知。您無法使用與標準 Amazon Redshift 資料表相同的資源檢視 Amazon Redshift Spectrum 資料表的詳細資訊，例如 [PG\$1TABLE\$1DEF](r_PG_TABLE_DEF.md)、[STV\$1TBL\$1PERM](r_STV_TBL_PERM.md)、PG\$1CLASS 或 information\$1schema。如果您的商業智慧或分析工具無法識別 Redshift Spectrum 外部資料表，請將您的應用程式設定為查詢 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 與 [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md)。

## CREATE EXTERNAL TABLE AS
<a name="r_CETAS"></a>

在某些情況下，您可能會在 AWS Glue Data Catalog、 AWS Lake Formation external Catalog 或 Apache Hive 中繼存放區上執行 CREATE EXTERNAL TABLE AS 命令。在這種情況下，您可以使用 AWS Identity and Access Management (IAM) 角色來建立外部結構描述。此 IAM 角色必須同時具有 Amazon S3 的讀取和寫入許可。

如果您使用 Lake Formation 目錄，則 IAM 角色必須具有在目錄中建立資料表的許可。在此案例中，它也必須具有目標 Amazon S3 路徑上的資料湖位置許可。此 IAM 角色會成為新 AWS Lake Formation 資料表的擁有者。

為了確保檔案名稱是唯一的，Amazon Redshift 依預設會針對每個上傳到 Amazon S3 的檔案名稱使用下列格式。

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

 例如，`20200303_004509_810669_1007_0001_part_00.parquet`。

執行 CREATE EXTERNAL TABLE AS 命令時，請考慮以下幾點：
+ Amazon S3 位置必須為空。
+ 使用 STORED AS 子句時，Amazon Redshift 僅支援 PARQUET 和 TEXTFILE 格式。
+ 您不需要定義欄位定義清單。新外部資料表的欄位名稱和欄位資料類型是直接從 SELECT 查詢衍生。
+ 您不需要在 PARTITIONED BY 子句中定義分割區欄位的資料類型。如果您指定分割區索引鍵，此欄位的名稱必須存在於 SELECT 查詢結果中。當有多個分割資料欄時，其在 SELECT 查詢中的順序並不重要。Amazon Redshift 會使用其在 PARTITIONED BY 子句中定義的順序來建立外部資料表。
+ Amazon Redshift 會根據分割區索引鍵值，自動將輸出檔案分割到分割區資料夾中。依預設，Amazon Redshift 會從輸出檔案中移除分割區欄位。
+ 不支援 LINES TERMINATED BY 'delimiter' 子句。
+ 不支援 ROW FORMAT SERDE 'serde\$1name' 子句。
+ 不支援使用資訊清單檔案。因此，您無法將 LOCATION 子句定義為 Amazon S3 上的資訊清單檔案。
+ Amazon Redshift 會自動更新命令末尾的 'numRows' 資料表屬性。
+ 'compression\$1type' 資料表屬性只接受 'none' 或 'snappy' 的 PARQUET 檔案格式。
+ Amazon Redshift 不允許外部 SELECT 查詢中的 LIMIT 子句。相反的，您可以使用巢狀 LIMIT 子句。
+ 您可以使用 STL\$1UNLOAD\$1LOG 來追蹤由每個 CREATE EXTERNAL TABLE AS 操作寫入到 Amazon S3 的檔案。

## 建立和查詢外部資料表的許可
<a name="r_CREATE_EXTERNAL_TABLE_usage-permissions"></a>

若要建立外部資料表，請確定您是外部結構描述或超級使用者的擁有者。若要轉移外部結構描述的所有權，請使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md)。下列範例會將 `spectrum_schema` 結構描述的擁有者變更為 `newowner`。

```
alter schema spectrum_schema owner to newowner;
```

若要執行 Redshift Spectrum 查詢，您需要以下許可：
+ 結構描述使用許可 
+ 在目前資料庫建立暫時資料表的許可 

下列範例可在結構描述 `spectrum_schema` 上授予使用許可至 `spectrumusers` 使用者群組。

```
grant usage on schema spectrum_schema to group spectrumusers;
```

下列範例可在資料庫 `spectrumdb` 上授予臨時許可至 `spectrumusers` 使用者群組。

```
grant temp on database spectrumdb to group spectrumusers;
```

## 虛擬資料欄
<a name="r_CREATE_EXTERNAL_TABLE_usage-pseudocolumns"></a>

Amazon Redshift 預設會以虛擬資料欄 *\$1path* 和 *\$1size* 建立外部資料表。選擇這些欄位以檢視 Amazon S3 上資料檔案的路徑，以及由查詢傳回的每列資料檔案大小。*\$1path* 與 *\$1size* 欄位名稱必須以雙引號分隔。*SELECT \$1* 子句不會傳回虛擬資料欄。您必須在查詢中明確包含 *\$1path* 和 *\$1size* 欄位名稱，如以下範例所示。

```
select "$path", "$size"
from spectrum.sales_part
where saledate = '2008-12-01';
```

您可以藉由將 *spectrum\$1enable\$1pseudo\$1columns* 組態參數設定為 *false*，以停用工作階段的虛擬資料欄建立。

**重要**  
選擇 *\$1size* 或 *\$1path* 會產生費用，因為 Redshift Spectrum 會掃描 Amazon S3 中的資料檔案以判斷結果集的大小。如需詳細資訊，請參閱 [Amazon Redshift 定價](https://aws.amazon.com/redshift/pricing/)。

## 設定資料處理選項
<a name="r_CREATE_EXTERNAL_TABLE_usage-data-handling"></a>

您可以設定資料表參數，為要在外部資料表中查詢的資料指定輸入處理，包括：
+ 包含 VARCHAR，CHAR 和字串資料之資料欄中的多餘字元。如需詳細資訊，請參閱外部資料表屬性 `surplus_char_handling`。
+ 包含 VARCHAR，CHAR 和字串資料之資料欄中的無效字元。如需詳細資訊，請參閱外部資料表屬性 `invalid_char_handling`。
+ 當您為外部資料表屬性 `invalid_char_handling` 指定 REPLACE 時要使用的取代字元。
+ 在包含整數和十進位資料的資料欄中進行轉換溢位處理。如需詳細資訊，請參閱外部資料表屬性 `numeric_overflow_handling`。
+ 在包含 VARBYTE 資料的資料欄中，Surplus\$1bytes\$1handling 可指定多餘位元組的輸入處理。如需詳細資訊，請參閱外部資料表屬性 `surplus_bytes_handling`。

# 範例
<a name="r_CREATE_EXTERNAL_TABLE_examples"></a>

以下範例在名為 `spectrum` 的 Amazon Redshift 外部結構描述中建立名為 SALES 的資料表。該資料位於 Tab 鍵分隔的文字檔案中。TABLE PROPERTIES 子句會將 numRows 屬性設定為 170,000 個資料列。

視您用來執行 CREATE EXTERNAL TABLE 的身分而定，您可能需要設定 IAM 許可。最佳做法是，建議您將許可政策附加到 IAM 角色，然後根據需要將其指派給使用者和群組。如需詳細資訊，請參閱 [Amazon Redshift 中的 Identity and Access Management](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-authentication-access-control.html)。

```
create external table spectrum.sales(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
saledate date,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
row format delimited
fields terminated by '\t'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales/'
table properties ('numRows'='170000');
```

下列範例會建立使用 JsonSerDe 參考 JSON 格式資料的資料表。

```
create external table spectrum.cloudtrail_json (
event_version int,
event_id bigint,
event_time timestamp,
event_type varchar(10),
awsregion varchar(20),
event_name varchar(max),
event_source varchar(max),
requesttime timestamp,
useragent varchar(max),
recipientaccountid bigint)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
with serdeproperties (
'dots.in.keys' = 'true',
'mapping.requesttime' = 'requesttimestamp'
) location 's3://amzn-s3-demo-bucket/json/cloudtrail';
```

下列 CREATE EXTERNAL TABLE AS 範例會建立未分割的外部資料表。然後它會寫入 SELECT 查詢結果，作為 Apache Parquet 到目標 Amazon S3 位置。

```
CREATE EXTERNAL TABLE spectrum.lineitem
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/lineitem/'
AS SELECT * FROM local_lineitem;
```

下列範例會建立已分割的外部資料表，並在 SELECT 查詢中包含分割區欄位。

```
CREATE EXTERNAL TABLE spectrum.partitioned_lineitem
PARTITIONED BY (l_shipdate, l_shipmode)
STORED AS parquet
LOCATION 'S3://amzn-s3-demo-bucket/cetas/partitioned_lineitem/'
AS SELECT l_orderkey, l_shipmode, l_shipdate, l_partkey FROM local_table;
```

如需外部資料目錄中現有資料庫的清單，請查詢 [SVV\$1EXTERNAL\$1DATABASES](r_SVV_EXTERNAL_DATABASES.md) 系統畫面。

```
select eskind,databasename,esoptions from svv_external_databases order by databasename;
```

```
eskind | databasename | esoptions
-------+--------------+----------------------------------------------------------------------------------
     1 | default      | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | sampledb     | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
     1 | spectrumdb   | {"REGION":"us-west-2","IAM_ROLE":"arn:aws:iam::123456789012:role/mySpectrumRole"}
```

若要檢視外部資料表的詳細資訊，請查詢 [SVV\$1EXTERNAL\$1TABLES](r_SVV_EXTERNAL_TABLES.md) 和 [SVV\$1EXTERNAL\$1COLUMNS](r_SVV_EXTERNAL_COLUMNS.md) 系統畫面。

以下範例會查詢 SVV\$1EXTERNAL\$1TABLES 檢視。

```
select schemaname, tablename, location from svv_external_tables;
```

```
schemaname | tablename            | location
-----------+----------------------+--------------------------------------------------------
spectrum   | sales                | s3://redshift-downloads/tickit/spectrum/sales
spectrum   | sales_part           | s3://redshift-downloads/tickit/spectrum/sales_partition
```

以下範例會查詢 SVV\$1EXTERNAL\$1COLUMNS 檢視。

```
select * from svv_external_columns where schemaname like 'spectrum%' and tablename ='sales';
```

```
schemaname | tablename | columnname | external_type | columnnum | part_key
-----------+-----------+------------+---------------+-----------+---------
spectrum   | sales     | salesid    | int           |         1 |        0
spectrum   | sales     | listid     | int           |         2 |        0
spectrum   | sales     | sellerid   | int           |         3 |        0
spectrum   | sales     | buyerid    | int           |         4 |        0
spectrum   | sales     | eventid    | int           |         5 |        0
spectrum   | sales     | saledate   | date          |         6 |        0
spectrum   | sales     | qtysold    | smallint      |         7 |        0
spectrum   | sales     | pricepaid  | decimal(8,2)  |         8 |        0
spectrum   | sales     | commission | decimal(8,2)  |         9 |        0
spectrum   | sales     | saletime   | timestamp     |        10 |        0
```

若要檢視資料表分割區，請使用下列查詢。

```
select schemaname, tablename, values, location
from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+-------------------------------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

下列範例會傳回外部資料表相關的資料檔案大小總和。

```
select distinct "$path", "$size"
   from spectrum.sales_part;

 $path                                                                    | $size
--------------------------------------------------------------------------+-------
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/ |  1616
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/ |  1444
```

## 資料分割範例
<a name="r_CREATE_EXTERNAL_TABLE_examples-partitioning"></a>

若要建立以日期分割的外部資料表，請執行以下命令。

```
create external table spectrum.sales_part(
salesid integer,
listid integer,
sellerid integer,
buyerid integer,
eventid integer,
dateid smallint,
qtysold smallint,
pricepaid decimal(8,2),
commission decimal(8,2),
saletime timestamp)
partitioned by (saledate date)
row format delimited
fields terminated by '|'
stored as textfile
location 's3://redshift-downloads/tickit/spectrum/sales_partition/'
table properties ('numRows'='170000');
```

請執行下列 ALTER TABLE 命令以新增分割區。

```
alter table spectrum.sales_part
add if not exists partition (saledate='2008-01-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-02-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-03-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-04-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-05-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-06-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-07-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-08-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-09-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-10-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-11-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11/';
alter table spectrum.sales_part
add if not exists partition (saledate='2008-12-01')
location 's3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12/';
```

若要從分割資料表選取資料，請執行下列查詢。

```
select top 10 spectrum.sales_part.eventid, sum(spectrum.sales_part.pricepaid)
from spectrum.sales_part, event
where spectrum.sales_part.eventid = event.eventid
  and spectrum.sales_part.pricepaid > 30
  and saledate = '2008-12-01'
group by spectrum.sales_part.eventid
order by 2 desc;
```

```
eventid | sum
--------+---------
    914 | 36173.00
   5478 | 27303.00
   5061 | 26383.00
   4406 | 26252.00
   5324 | 24015.00
   1829 | 23911.00
   3601 | 23616.00
   3665 | 23214.00
   6069 | 22869.00
   5638 | 22551.00
```

若要檢視外部資料表分割區，請查詢 [SVV\$1EXTERNAL\$1PARTITIONS](r_SVV_EXTERNAL_PARTITIONS.md) 系統畫面。

```
select schemaname, tablename, values, location from svv_external_partitions
where tablename = 'sales_part';
```

```
schemaname | tablename  | values         | location
-----------+------------+----------------+--------------------------------------------------
spectrum   | sales_part | ["2008-01-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-01
spectrum   | sales_part | ["2008-02-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-02
spectrum   | sales_part | ["2008-03-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-03
spectrum   | sales_part | ["2008-04-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-04
spectrum   | sales_part | ["2008-05-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-05
spectrum   | sales_part | ["2008-06-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-06
spectrum   | sales_part | ["2008-07-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-07
spectrum   | sales_part | ["2008-08-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-08
spectrum   | sales_part | ["2008-09-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-09
spectrum   | sales_part | ["2008-10-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-10
spectrum   | sales_part | ["2008-11-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-11
spectrum   | sales_part | ["2008-12-01"] | s3://redshift-downloads/tickit/spectrum/sales_partition/saledate=2008-12
```

## 資料列格式範例
<a name="r_CREATE_EXTERNAL_TABLE_examples-row-format"></a>

下面顯示的範例會針對以 AVRO 格式儲存的資料檔案，指定 ROW FORMAT SERDE 參數。

```
create external table spectrum.sales(salesid int, listid int, sellerid int, buyerid int, eventid int, dateid int, qtysold int, pricepaid decimal(8,2), comment VARCHAR(255))
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
WITH SERDEPROPERTIES ('avro.schema.literal'='{\"namespace\": \"dory.sample\",\"name\": \"dory_avro\",\"type\": \"record\", \"fields\": [{\"name\":\"salesid\", \"type\":\"int\"},
{\"name\":\"listid\", \"type\":\"int\"},
{\"name\":\"sellerid\", \"type\":\"int\"},
{\"name\":\"buyerid\", \"type\":\"int\"},
{\"name\":\"eventid\",\"type\":\"int\"},
{\"name\":\"dateid\",\"type\":\"int\"},
{\"name\":\"qtysold\",\"type\":\"int\"},
{\"name\":\"pricepaid\", \"type\": {\"type\": \"bytes\", \"logicalType\": \"decimal\", \"precision\": 8, \"scale\": 2}}, {\"name\":\"comment\",\"type\":\"string\"}]}')
STORED AS AVRO
location 's3://amzn-s3-demo-bucket/avro/sales' ;
```

下面顯示的範例會使用 RegEx 指定 ROW FORMAT SERDE 參數。

```
create external table spectrum.types(
cbigint bigint,
cbigint_null bigint,
cint int,
cint_null int)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serdeproperties ('input.regex'='([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)\\x01([^\\x01]+)')
stored as textfile
location 's3://amzn-s3-demo-bucket/regex/types';
```

下面顯示的範例會使用 Grok 指定 ROW FORMAT SERDE 參數。

```
create external table spectrum.grok_log(
timestamp varchar(255),
pid varchar(255),
loglevel varchar(255),
progname varchar(255),
message varchar(255))
row format serde 'com.amazonaws.glue.serde.GrokSerDe'
with serdeproperties ('input.format'='[DFEWI], \\[%{TIMESTAMP_ISO8601:timestamp} #%{POSINT:pid:int}\\] *(?<loglevel>:DEBUG|FATAL|ERROR|WARN|INFO) -- +%{DATA:progname}: %{GREEDYDATA:message}')
stored as textfile
location 's3://DOC-EXAMPLE-BUCKET/grok/logs';
```

下面範例會示範在 S3 儲存貯體中定義 Amazon S3 伺服器存取日誌。您可以使用 Redshift Spectrum 查詢 Amazon S3 存取日誌。

```
CREATE EXTERNAL TABLE spectrum.mybucket_s3_logs(
bucketowner varchar(255),
bucket varchar(255),
requestdatetime varchar(2000),
remoteip varchar(255),
requester varchar(255),
requested varchar(255),
operation varchar(255),
key varchar(255),
requesturi_operation varchar(255),
requesturi_key varchar(255),
requesturi_httpprotoversion varchar(255),
httpstatus varchar(255),
errorcode varchar(255),
bytessent bigint,
objectsize bigint,
totaltime varchar(255),
turnaroundtime varchar(255),
referrer varchar(255),
useragent varchar(255),
versionid varchar(255)
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
'input.regex' = '([^ ]*) ([^ ]*) \\[(.*?)\\] ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\\s*([^ ]*)\\s*([^ ]*)\" (- |[^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) (\"[^\"]*\") ([^ ]*).*$')
LOCATION 's3://amzn-s3-demo-bucket/s3logs’;
```

下面顯示的範例會針對 ION 格式資料，指定 ROW FORMAT SERDE 參數。

```
CREATE EXTERNAL TABLE tbl_name (columns)
ROW FORMAT SERDE 'com.amazon.ionhiveserde.IonHiveSerDe'
STORED AS
INPUTFORMAT 'com.amazon.ionhiveserde.formats.IonInputFormat'
OUTPUTFORMAT 'com.amazon.ionhiveserde.formats.IonOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/prefix'
```

## 資料處理範例
<a name="r_CREATE_EXTERNAL_TABLE_examples-data-handling"></a>

下列範例會存取檔案：[spi\$1global\$1rankings.csv](https://s3.amazonaws.com/redshift-downloads/docs-downloads/spi_global_rankings.csv)。您可以將 `spi_global_rankings.csv` 檔案上傳至 Amazon S3 儲存貯體以嘗試下列範例。

以下範例會建立外部結構描述 `schema_spectrum_uddh` 和資料庫 `spectrum_db_uddh`。針對 `aws-account-id`，輸入 AWS 您的帳戶 ID，並針對 `role-name`輸入您的 Redshift Spectrum 角色名稱。

```
create external schema schema_spectrum_uddh
from data catalog
database 'spectrum_db_uddh'
iam_role 'arn:aws:iam::aws-account-id:role/role-name'
create external database if not exists;
```

以下範例會在外部結構描述 `schema_spectrum_uddh` 中建立外部資料表 `soccer_league`。

```
CREATE EXTERNAL TABLE schema_spectrum_uddh.soccer_league
(
  league_rank smallint,
  prev_rank   smallint,
  club_name   varchar(15),
  league_name varchar(20),
  league_off  decimal(6,2),
  league_def  decimal(6,2),
  league_spi  decimal(6,2),
  league_nspi integer
)
ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n\l'
stored as textfile
LOCATION 's3://spectrum-uddh/league/'
table properties ('skip.header.line.count'='1');
```

檢查 `soccer_league` 資料表中的列數。

```
select count(*) from schema_spectrum_uddh.soccer_league;
```

列數會隨其顯示。

```
count
645
```

下列查詢會顯示前 10 名的俱樂部。因為俱樂部 `Barcelona` 在字串中有無效的字元，所以會顯示 NULL 做為名稱。

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

```
league_rank	club_name	league_name			league_nspi
1		Manchester City	Barclays Premier Lea		34595
2		Bayern Munich	German Bundesliga		34151
3		Liverpool	Barclays Premier Lea		33223
4		Chelsea		Barclays Premier Lea		32808
5		Ajax		Dutch Eredivisie		32790
6		Atletico 	Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi		31469
8		NULL	        Spanish Primera Divi            31321
9		RB Leipzig	German Bundesliga		31014
10		Paris Saint-Ger	French Ligue 1			30929
```

下列範例會修改 `soccer_league` 資料表，以指定 `invalid_char_handling`、`replacement_char` 和 `data_cleansing_enabled` 外部資料表屬性來插入問號 (?) 替代非預期字元。

```
alter  table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='REPLACE','replacement_char'='?','data_cleansing_enabled'='true');
```

下列範例會針對排名 1 到 10 的團隊查詢 `soccer_league` 資料表。

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

由於資料表屬性已修改，因此結果會顯示前 10 名的俱樂部，並在俱樂部 `Barcelona` 的第八列包含問號 (?) 替代字元。

```
league_rank	club_name	league_name		league_nspi
1		Manchester City	Barclays Premier Lea	34595
2		Bayern Munich	German Bundesliga	34151
3		Liverpool	Barclays Premier Lea	33223
4		Chelsea		Barclays Premier Lea	32808
5		Ajax		Dutch Eredivisie	32790
6		Atletico Madrid	Spanish Primera Divi	31517
7		Real Madrid	Spanish Primera Divi	31469
8		Barcel?na	Spanish Primera Divi	31321
9		RB Leipzig	German Bundesliga	31014
10		Paris Saint-Ger	French Ligue 1		30929
```

下列範例會修改資料表 `soccer_league` 來指定 `invalid_char_handling` 外部資料表屬性，以捨棄含有非預期字元的資料列。

```
alter table schema_spectrum_uddh.soccer_league
set table properties ('invalid_char_handling'='DROP_ROW','data_cleansing_enabled'='true');
```

下列範例會針對排名 1 到 10 的團隊查詢 `soccer_league` 資料表。

```
select league_rank,club_name,league_name,league_nspi
from schema_spectrum_uddh.soccer_league
where league_rank between 1 and 10;
```

結果會顯示熱門俱樂部，不包括俱樂部 `Barcelona` 的第八列。

```
league_rank   club_name         league_name            league_nspi
1             Manchester City   Barclays Premier Lea   34595
2             Bayern Munich     German Bundesliga      34151
3             Liverpool         Barclays Premier Lea   33223
4             Chelsea           Barclays Premier Lea   32808
5             Ajax              Dutch Eredivisie       32790
6             Atletico Madrid   Spanish Primera Divi   31517
7             Real Madrid       Spanish Primera Divi   31469
9             RB Leipzig        German Bundesliga      31014
10            Paris Saint-Ger   French Ligue 1         30929
```

# CREATE EXTERNAL VIEW
<a name="r_CREATE_EXTERNAL_VIEW"></a>

Data Catalog 視觀表預覽功能僅適用於以下區域。
+ 美國東部 (俄亥俄) (us-east-2)
+ 美國東部 (維吉尼亞北部) (us-east-1)
+ 美國西部 (加利佛尼亞北部) (us-west-1)
+ 亞太區域 (東京) (ap-northeast-1)
+ 歐洲 (愛爾蘭) (eu-west-1)
+ 歐洲 (斯德哥爾摩) (eu-north-1)

在 Data Catalog 中建立檢視。Data Catalog 視觀表是一種單一檢視結構描述，可使用其他 SQL 引擎 (例如 Amazon Athena 和 Amazon EMR)。您可以從您選擇的引擎中查詢檢視。如需有關 Data Catalog 檢視的詳細資訊，請參閱[建立 Data Catalog 檢視](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。

## 語法
<a name="r_CREATE_EXTERNAL_VIEW-synopsis"></a>

```
CREATE EXTERNAL VIEW schema_name.view_name [ IF NOT EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
AS query_definition;
```

## Parameters
<a name="r_CREATE_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
連接到 AWS Glue 資料庫的結構描述，後面接著檢視的名稱。

受保護  
指定只有在 query\$1define 中的查詢可以成功完成時，才應完成 CREATE EXTERNAL VIEW 命令。

IF NOT EXISTS  
如果檢視不存在，則建立檢視。

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
建立視觀表時所使用的結構描述標記法。您可以指定 使用您建立的 AWS Glue Data Catalog Glue 資料庫，或您建立的外部結構描述。如需詳細資訊，請參閱[CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 和 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

 *query\$1definition*   
Amazon Redshift 執行以變更檢視的 SQL 查詢的定義。

## 範例
<a name="r_CREATE_EXTERNAL_VIEW-examples"></a>

下列範例會建立名為 sample\$1schema.glue\$1data\$1catalog\$1view 的 Data Catalog 視觀表。

```
CREATE EXTERNAL PROTECTED VIEW sample_schema.glue_data_catalog_view IF NOT EXISTS
AS SELECT * FROM sample_database.remote_table "remote-table-name";
```

# CREATE FUNCTION
<a name="r_CREATE_FUNCTION"></a>

使用 SQL SELECT 子句或 Python 程式，建立新的純量使用者定義函數 (UDF)。

如需詳細資訊和範例，請參閱 [Amazon Redshift 中的使用者定義函式](user-defined-functions.md)。

## 所需權限
<a name="r_CREATE_FUNCTION-privileges"></a>

您必須具有下列其中一種方式取得的許可，才能執行 CREATE OR REPLACE FUNCTION：
+ 對於 CREATE FUNCTION：
  + 超級使用者可以使用受信任和不受信任的語言來建立函數。
  + 具有 CREATE [ OR REPLACE ] FUNCTION 權限的使用者可以使用信任語言建立函數。
+ 對於 REPLACE FUNCTION：
  + 超級使用者
  + 具有 CREATE [ OR REPLACE ] FUNCTION 權限的使用者
  + 函數擁有者

## 語法
<a name="r_CREATE_FUNCTION-synopsis"></a>

```
CREATE [ OR REPLACE ] FUNCTION f_function_name
( { [py_arg_name  py_arg_data_type |
sql_arg_data_type } [ , ... ] ] )
RETURNS data_type
{ VOLATILE | STABLE | IMMUTABLE }
AS $$
  { python_program | SELECT_clause }
$$ LANGUAGE { plpythonu | sql }
```

## Parameters
<a name="r_CREATE_FUNCTION-parameters"></a>

OR REPLACE  
指定已有相同名稱和輸入引數資料類型 (或*簽章*) 的函數存在時，取代現有函數。您可以將函數取代為定義一組相同資料類型的新函數。您必須是超級使用者才能取代函數。  
如果您定義的函數與現有函數同名，但簽章不同，則會建立新函數。換言之，函數名稱將會過載。如需詳細資訊，請參閱[多載函數名稱](udf-naming-udfs.md#udf-naming-overloading-function-names)。

 *f\$1function\$1name*   
函數的名稱。如果您指定結構描述名稱 (例如 `myschema.myfunction`)，則會使用指定的結構描述建立函數。否則，函數會在目前結構描述中建立。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
我們建議您在所有 UDF 名稱前加上 `f_`。Amazon Redshift 會保留 `f_` 字首，專供 UDF 名稱使用，因此，使用 `f_` 字首，您可以確保 UDF 名稱不會與任何現有或未來的 Amazon Redshift 內建 SQL 函數名稱發生衝突。如需詳細資訊，請參閱[防止 UDF 命名衝突](udf-naming-udfs.md)。  
若輸入引數的資料類型不同，則您可以定義多個擁有相同函數名稱的函數。換言之，函數名稱將會過載。如需詳細資訊，請參閱[多載函數名稱](udf-naming-udfs.md#udf-naming-overloading-function-names)。

 *py\$1arg\$1name py\$1arg\$1data\$1type \$1 sql\$1arg\$1data\$1type*   
若是 Python UDF，此為輸入引數名稱和資料類型的清單。若是 SQL UDF，此為資料類型的清單，不包含引數名稱。在 Python UDF 中，使用引數名稱來參考引數。在 SQL UDF 中，根據引數清單中的引數順序，使用 \$11、\$12 等來參考引數。  
若是 SQL UDF，輸入和傳回資料類型可以是任何標準 Amazon Redshift 資料類型。使用 Python UDF 時，輸入及傳回的資料類型可為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE 或 TIMESTAMP。此外，Python 使用者定義函數 (UDF) 支援 ANYELEMENT 資料類型。這會根據執行時提供的對應引數資料類型，自動轉換為標準資料類型。如果有多個引數使用 ANYELEMENT，根據清單中的第一個 ANYELEMENT 引數而定，這些引數在執行時都會解析為相同資料類型。如需詳細資訊，請參閱[Python UDF 資料類型](udf-data-types.md)及[資料類型](c_Supported_data_types.md)。  
您最多可以指定 32 個引數。

 RETURNS *data\$1type*   
函數所傳回值的資料類型。RETURNS 資料類型可以是任何標準 Amazon Redshift 資料類型。此外，Python UDF 還可以使用資料類型 ANYELEMENT，該資料類型會根據執行時提供的引數自動轉換為標準資料類型。如果您指定 ANYELEMENT 做為傳回資料類型，則至少有一個引數必須使用 ANYELEMENT。實際的傳回資料類型將與呼叫函數時提供給 ANYELEMENT 引數的資料類型相同。如需詳細資訊，請參閱[Python UDF 資料類型](udf-data-types.md)。

 VOLATILE \$1 STABLE \$1 IMMUTABLE   
通知查詢最佳化工具有關函數的波動情形。  
如果您將函數標示為最嚴格的有效波動類別，將會得到最理想的最佳化結果。不過，如果類別太嚴格，則最佳化工具可能會錯誤地略過某些呼叫，導致產生不正確的結果集。從最低嚴格程度開始，依嚴格程度排列的波動類別如下所示：  
+ VOLATILE
+ STABLE
+ IMMUTABLE
VOLATILE  
假設引數相同，即使是針對單一陳述式中的資料列，函數也可能在後續呼叫中傳回不同的結果。查詢最佳化工具無法對波動函數的行為做出任何假設，因此，使用波動函數的查詢必須針對每個輸入資料列重新評估函數。  
STABLE  
假設引數相同，函數一定會針對單一陳述式內處理的所有資料列傳回相同結果。在不同陳述式中呼叫函數時，函數可能傳回不同結果。此類別可讓最佳化工具將單一陳述式中的多次函數呼叫最佳化，成為陳述式的單一呼叫。  
IMMUTABLE  
假設引數相同，函數一律傳回相同結果，而且永遠不變。當查詢呼叫具有常數引數的 `IMMUTABLE` 函數時，最佳化工具會預先評估函數。

AS \$1\$1 *statement* \$1\$1  
 包圍要執行之陳述式的結構。常值關鍵字 `AS $$` 和 `$$` 是必要的。  
Amazon Redshift 會要求您使用稱為 \$1 符號引用的格式包圍函數中的陳述式。包圍範圍當中的任何內容都會原封不動傳遞。您不需要逸出任何特殊字元，因為字串的內容是逐字撰寫。  
 使用 *\$1 符號引用*時，您會使用一組 \$1\$1 符號配對表示要執行之陳述式的開頭和結尾，如以下範例所示。  

```
$$ my statement $$
```
 您也可以選擇在每組配對的兩個 \$1 符號之間指定字串來協助識別陳述式。您在包圍配對的開頭和結尾中使用的字串必須相同。此字串區分大小寫，且遵循與未加引號的識別碼相同的限制條件，不過後者不可包含 \$1 符號。下列範例使用字串 `test`。  

```
$test$ my statement $test$
```
如需 \$1 符號引用的詳細資訊，請參閱 PostgreSQL 文件中的[辭典結構](https://www.postgresql.org/docs/9.4/static/sql-syntax-lexical.html)下的「\$1 符號引用的字串常數」。

*python\$1program*   
傳回值的有效可執行 Python 程式。隨函數傳入的陳述式必須符合縮排要求，如 Python 網站上的《Python 程式碼格式指南》[https://www.python.org/dev/peps/pep-0008/#indentation](https://www.python.org/dev/peps/pep-0008/#indentation)所述。如需詳細資訊，請參閱[UDF 的 Python 語言支援](udf-python-language-support.md)。

*SQL\$1clause*   
SQL SELECT 子句。  
SELECT 子句不可包含下列任何類型的子句：  
+ FROM
+ INTO
+ WHERE
+ GROUP BY
+ ORDER BY
+ LIMIT

LANGUAGE \$1 plpythonu \$1 sql \$1   
若是 Python，指定 `plpythonu`。若是 SQL，指定 `sql`。您必須具有 SQL 或 plpythonu 的語言使用權許可。如需詳細資訊，請參閱[UDF 安全與許可](udf-security-and-privileges.md)。

## 使用須知
<a name="r_CREATE_FUNCTION-usage-notes"></a>

### 巢狀函數
<a name="r_CREATE_FUNCTION-usage-notes-nested-functions"></a>

您可以從 SQL UDF 內呼叫另一個 SQL 使用者定義的函數 (UDF)。當您執行 CREATE FUNCTION 命令時，巢狀函數必須存在。Amazon Redshift 不會追蹤 UDF 的依賴關係，因此，如果您捨棄巢狀函數，Amazon Redshift 不會傳回錯誤。不過，若巢狀函數不存在，UDF 將會失敗。例如，以下函數會在 SELECT 子句中呼叫 `f_sql_greater `函數。

```
create function f_sql_commission (float, float )
  returns float
stable
as $$
  select f_sql_greater ($1, $2)
$$ language sql;
```

### UDF 安全與權限
<a name="r_CREATE_FUNCTION-usage-notes-security-and-privileges"></a>

若要建立 UDF，您必須具有 SQL 或 plpythonu (Python) 的語言使用權許可。根據預設，USAGE ON LANGUAGE SQL 會授予 PUBLIC。不過，您必須將 USAGE ON LANGUAGE PLPYTHONU 明確授予特定使用者或群組。

若要撤銷 SQL 的使用權，請先從 PUBLIC 撤銷使用權。然後僅將 SQL 使用權授予獲得許可建立 SQL UDF 的特定使用者或群組。下列範例會撤銷 PUBLIC 的 SQL 使用權，然後將使用權授予使用者群組 `udf_devs`。

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```

若要執行 UDF，您必須具有每個函數的執行許可。根據預設，新 UDF 的執行許可會授予 PUBLIC。若要限制使用權，請從 PUBLIC 撤銷函數的執行許可。然後將許可授予特定個人或群組。

下列範例會撤銷 PUBLIC 的函數 `f_py_greater` 執行許可，然後將使用權授予使用者群組 `udf_devs`。

```
revoke execute on function f_py_greater(a float, b float) from PUBLIC;
grant execute on function f_py_greater(a float, b float) to group udf_devs;
```

根據預設，超級使用者具備所有權限。

如需詳細資訊，請參閱[GRANT](r_GRANT.md)及[REVOKE](r_REVOKE.md)。

## 範例
<a name="r_CREATE_FUNCTION-examples"></a>

### 純量 Python UDF 範例
<a name="r_CREATE_FUNCTION-python-example"></a>

下列範例會建立比較兩個整數並傳回較大值的 Python UDF。

```
create function f_py_greater (a float, b float)
  returns float
stable
as $$
  if a > b:
    return a
  return b
$$ language plpythonu;
```

下列範例會查詢 SALES 資料表，並呼叫新的 `f_py_greater` 函數來查詢 COMMISSION 或 20% 的 PRICEPAID，以較大者為準。

```
select f_py_greater (commission, pricepaid*0.20) from sales;
```

### 純量 SQL UDF 範例
<a name="r_CREATE_FUNCTION-sql-example"></a>

下列範例會建立一個函數，比較兩個數字並傳回較大的值。

```
create function f_sql_greater (float, float)
  returns float
stable
as $$
  select case when $1 > $2 then $1
    else $2
  end
$$ language sql;
```

下列查詢會呼叫新的 `f_sql_greater` 函數來查詢 SALES 資料表，並傳回 COMMISSION 或 20% 的 PRICEPAID，以較大者為準。

```
select f_sql_greater (commission, pricepaid*0.20) from sales;
```

# CREATE GROUP
<a name="r_CREATE_GROUP"></a>

定義新的使用者群組。只有超級使用者才能建立群組。

## 語法
<a name="r_CREATE_GROUP-synopsis"></a>

```
CREATE GROUP group_name
[ [ WITH ] [ USER username ] [, ...] ]
```

## Parameters
<a name="r_CREATE_GROUP-parameters"></a>

 *group\$1name*   
新使用者群組的名稱。開頭為兩個底線的群組名稱保留供 Amazon Redshift 內部使用。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

WITH  
選用的語法，指出 CREATE GROUP 的其他參數。

USER  
在群組中新增一個或多個使用者。

 *username*   
要新增至群組的使用者名稱。

## 範例
<a name="r_CREATE_GROUP-examples"></a>

以下範例會建立名為 ADMIN\$1GROUP 的使用者群組，當中包含兩個使用者 ADMIN1 和 ADMIN2。

```
create group admin_group with user admin1, admin2;
```

# CREATE IDENTITY PROVIDER
<a name="r_CREATE_IDENTITY_PROVIDER"></a>

定義新的身分提供者。只有超級使用者可以建立身分提供者。

## 語法
<a name="r_CREATE_IDENTITY_PROVIDER-synopsis"></a>

```
CREATE IDENTITY PROVIDER identity_provider_name TYPE type_name
NAMESPACE namespace_name
[PARAMETERS parameter_string]
[APPLICATION_ARN arn]
[IAM_ROLE iam_role]
[AUTO_CREATE_ROLES
    [ TRUE [ { INCLUDE | EXCLUDE } GROUPS LIKE filter_pattern] |
      FALSE
    ]
  ];
```

## Parameters
<a name="r_CREATE_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
新身分提供者的名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

*type\$1name*  
要與之連接的身分提供者。Azure 和 AWSIDC 是目前唯一支援的身分提供者。

*namespace\$1name*  
命名空間 這是身分提供者目錄的唯一速記識別碼。

 *parameter\$1string*   
包含正確格式化 JSON 物件的字串，其中包含身分提供者所需的參數和值。

 *arn*   
IAM Identity Center 受管應用程式的 Amazon Resource Name (ARN)。此參數僅在身分提供者類型為 AWSIDC 時適用。

 *iam\$1role*   
提供與 IAM Identity Center 連線之許可的 IAM 角色。此參數僅在身分提供者類型為 AWSIDC 時適用。

 *auto\$1create\$1roles*   
啟用或停用自動建立角色功能。如果值為 TRUE，Amazon Redshift 會啟用自動建立角色功能。如果值為 FALSE，Amazon Redshift 會停用自動建立角色功能。如果未指定此參數的值，Amazon Redshift 會使用下列邏輯來判斷值：  
+  如有 `AUTO_CREATE_ROLES` 但未指定值，則值會設定為 TRUE。
+  如未提供 `AUTO_CREATE_ROLES` 且身分提供者為 AWSIDC，則值會設定為 FALSE。
+  如未提供 `AUTO_CREATE_ROLES` 且身分提供者為 Azure，則值會設定為 TRUE。
若要包含群組，請指定 `INCLUDE`。預設值為空白，表示 `AUTO_CREATE_ROLES` 開啟時，包含所有群組。  
若要排除群組，請指定 `EXCLUDE`。預設值為空白，表示 `AUTO_CREATE_ROLES` 開啟時，不要排除任何群組。

 *filter\$1pattern*   
有效的 UTF-8 字元表達式，包含要比對群組名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_CREATE_IDENTITY_PROVIDER.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。  
*filter\$1pattern* 支援下列字元：  
+  大寫和小寫英文字母字元 (A-Z 和 a-z) 
+  數字 (0-9) 
+  下列特殊字元：

  ```
  _ % ^ * + ? { } , $
  ```

## 範例
<a name="r_CREATE_IDENTITY_PROVIDER-examples"></a>

下列範例會建立名為 *oauth\$1standard* 的身分提供者 (類型為 *azure*)，目的是與 Microsoft Azure Active Directory (AD) 建立通訊。

```
CREATE IDENTITY PROVIDER oauth_standard TYPE azure
NAMESPACE 'aad'
PARAMETERS '{"issuer":"https://sts.windows.net/2sdfdsf-d475-420d-b5ac-667adad7c702/",
"client_id":"87f4aa26-78b7-410e-bf29-57b39929ef9a",
"client_secret":"BUAH~ewrqewrqwerUUY^%tHe1oNZShoiU7",
"audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift"]
}'
```

您可以將 IAM Identity Center 受管應用程式與現有的佈建叢集或 Amazon Redshift Serverless 工作群組連線。這樣您就可以透過 IAM Identity Center 管理對 Redshift 資料庫的存取。若要這樣做，請執行 SQL 命令，如下列範例所示。您必須是資料庫管理員。

```
CREATE IDENTITY PROVIDER "redshift-idc-app" TYPE AWSIDC
NAMESPACE 'awsidc'
APPLICATION_ARN 'arn:aws:sso::123456789012:application/ssoins-12345f67fe123d4/apl-a0b0a12dc123b1a4'
IAM_ROLE 'arn:aws:iam::123456789012:role/MyRedshiftRole';
```

此案例中的應用程式 ARN 會識別要連線的受管應用程式。您可以執行 `SELECT * FROM SVV_IDENTITY_PROVIDERS;` 來尋找它。

如需使用 CREATE IDENTITY PROVIDER 的相關資訊 (包括其他範例)，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。如需設定從 Redshift 到 IAM Identity Center 的連線詳細資訊，請參閱[將 Redshift 與 IAM Identity Center 連線，為使用者提供單一登入體驗](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)。

# CREATE LIBRARY
<a name="r_CREATE_LIBRARY"></a>

安裝 Python 程式庫，使用者可在使用 [CREATE FUNCTION](r_CREATE_FUNCTION.md) 命令建立使用者定義的函數 (UDF) 時採用。使用者安裝的程式庫的總和大小不得超過 100 MB。

CREATE LIBRARY 無法在交易區塊內 (BEGIN … END) 執行。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

Amazon Redshift 支援 Python 2.7 版。如需詳細資訊，請參閱 [www.python.org](https://www.python.org/)。

如需詳細資訊，請參閱[範例：匯入自訂 Python 程式庫模組](udf-importing-custom-python-library-modules.md)。

## 所需權限
<a name="r_CREATE_LIBRARY-privileges"></a>

以下是 CREATE LIBRARY 所需的權限：
+ 超級使用者
+ 具有 CREATE LIBRARY 權限或具有指定語言權限的使用者

## 語法
<a name="r_CREATE_LIBRARY-synopsis"></a>

```
CREATE [ OR REPLACE ] LIBRARY library_name LANGUAGE plpythonu
FROM
{ 'https://file_url'
| 's3://bucketname/file_name'
authorization
  [ REGION [AS] 'aws_region']
  IAM_ROLE { default | ‘arn:aws:iam::<AWS 帳戶-id>:role/<role-name>’ }
}
```

## Parameters
<a name="r_CREATE_LIBRARY-parameters"></a>

OR REPLACE  
指定已有相同名稱的程式庫存在時，取代現有程式庫。REPLACE 會立即遞交。如果倚賴程式庫的 UDF 同時執行，UDF 可能會失敗或傳回意外的結果，即使 UDF 是在交易內執行也一樣。您必須是擁有者或超級使用者才能取代程式庫。

 *library\$1name*   
要安裝的程式庫名稱。您建立的程式庫不可包含與 Python 標準程式庫模組或 Amazon Redshift 預先安裝 Python 模組同名的模組。如果現有的使用者安裝程式庫使用與所安裝程式庫相同的 Python 套件，則您必須先捨棄現有的程式庫，才能安裝新的程式庫。如需詳細資訊，請參閱[UDF 的 Python 語言支援](udf-python-language-support.md)。

LANGUAGE plpythonu  
要使用的語言。Python (plpythonu) 是唯一支援的語言。Amazon Redshift 支援 Python 2.7 版。如需詳細資訊，請參閱 [www.python.org](https://www.python.org/)。

FROM  
程式庫檔案的位置。您可以指定 Amazon S3 儲存貯體和物件名稱，也可以指定 URL，以從公開網站下載檔案。程式庫必須封裝為 `.zip` 檔案。如需詳細資訊，請參閱 Python 文件中的[建構和安裝 Python 模組](https://docs.python.org/2/library/distutils.html?highlight=distutils#module-distutils)。

 https://*file\$1url*   
從公開網站下載檔案的 URL。URL 最多可包含三個重新導向。以下是檔案 URL 的範例。  

```
'https://www.example.com/pylib.zip'
```

 s3://*bucket\$1name/file\$1name*   
單一 Amazon S3 物件的路徑，物件當中包含程式庫檔案。以下是 Amazon S3 物件路徑的範例。  

```
's3://amzn-s3-demo-bucket/my-pylib.zip'
```
如果您指定 Amazon S3 儲存貯體，則必須同時提供有下載檔案許可之 AWS 使用者的登入資料。  
 如果 Amazon S3 儲存貯體與您的 Amazon Redshift AWS 叢集不在同一個區域中，您必須使用 REGION 選項來指定資料所在的 AWS 區域。*aws\$1region* 的值必須符合 COPY 命令[REGION](copy-parameters-data-source-s3.md#copy-region)參數描述中資料表中列出的 AWS 區域。

*authorization*   
此子句指出叢集在身分驗證和授權存取包含程式庫檔案的 Amazon S3 儲存貯體時使用的方法。叢集必須有使用 LIST 和 GET 動作存取 Amazon S3 的許可。  
授權的語法與 COPY 命令授權相同。如需詳細資訊，請參閱[授權參數](copy-parameters-authorization.md)。  

```
IAM_ROLE { default | ‘arn:aws:iam::<AWS 帳戶-id>:role/<role-name>’
```
 使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE LIBRARY 命令時與叢集關聯的 IAM 角色。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。如果指定 IAM\$1ROLE，則不能使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY、SESSION\$1TOKEN 或 CREDENTIALS。  
或者，如果 Amazon S3 儲存貯體使用的是伺服器端加密，請提供 credentials-args 字串中的加密金鑰。如果您使用的是臨時安全登入資料，請提供 *credentials-args* 字串中的暫時字符。  
如需詳細資訊，請參閱[暫時安全憑證](copy-usage_notes-access-permissions.md#r_copy-temporary-security-credentials)。

 REGION [AS] *aws\$1region*   
Amazon S3 儲存貯體所在的 AWS 區域。當 Amazon S3 儲存貯體不在與 Amazon Redshift 叢集相同的 AWS 區域中時，需要 REGION。*aws\$1region* 的值必須符合 COPY 命令[REGION](copy-parameters-data-source-s3.md#copy-region)參數描述中資料表中列出的 AWS 區域。  
根據預設，CREATE LIBRARY 會假設 Amazon S3 儲存貯體與 Amazon Redshift 叢集位於相同的 AWS 區域。

## 範例
<a name="r_CREATE_LIBRARY-examples"></a>

以下兩個範例會安裝 [urlparse](https://docs.python.org/2/library/urlparse.html#module-urlparse) Python 模組，它會封裝成名為 `urlparse3-1.0.3.zip` 的檔案。

以下命令會從上傳到位於美國東部區域的 Amazon S3 儲存貯體的封裝，安裝名為 `f_urlparse` 的 UDF 程式庫。

```
create library f_urlparse
language plpythonu
from 's3://amzn-s3-demo-bucket/urlparse3-1.0.3.zip'
credentials 'aws_iam_role=arn:aws:iam::<aws-account-id>:role/<role-name>'
region as 'us-east-1';
```

下列範例會從網站上的程式庫檔案安裝名為 `f_urlparse` 的程式庫。



```
create library f_urlparse
language plpythonu
from 'https://example.com/packages/urlparse3-1.0.3.zip';
```

# CREATE MASKING POLICY
<a name="r_CREATE_MASKING_POLICY"></a>

建立新的動態資料遮罩政策，以模糊指定格式的資料。如需動態資料遮罩的相關資訊，請參閱 [動態資料遮罩](t_ddm.md)。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以建立遮罩政策。

## 語法
<a name="r_CREATE_MASKING_POLICY-synopsis"></a>

```
CREATE MASKING POLICY 
   { policy_name | database_name.policy_name } [IF NOT EXISTS]
   WITH (input_columns)
   USING (masking_expression);
```

## Parameters
<a name="r_CREATE_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
遮罩政策的名稱。遮罩政策的名稱不能與資料庫中已存在的另一個遮罩政策相同。

database\$1name  
要建立政策的資料庫名稱。您可以在連線的資料庫或 Amazon Redshift 聯合許可目錄上建立政策。

*input\$1columns*   
使用格式的資料欄名稱元組 (col1 類型、col2 類型 ...)。  
資料欄名稱會用來做為遮罩表示式的輸入。資料欄名稱不一定要與要遮罩的資料欄名稱相符，但輸入和輸出資料類型必須相符。

*masking\$1expression*  
用來轉換目標資料欄的 SQL 運算式。其可以使用資料操作函數 (例如字符串操作函數) 編寫，或與使用 SQL、Python 或 AWS Lambda編寫的使用者定義函數一起編寫。您可以針對具有多個輸出的遮罩政策包含資料欄運算式的元組。如果您使用常數做為遮罩運算式，則必須將其明確轉換為符合輸入類型的類型。  
 對於在遮罩運算式中使用的任何使用者定義函數，您都必須擁有 USAGE 權限。

如需在 Amazon Redshift 聯合許可目錄上使用 CREATE MASKING POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

# CREATE MATERIALIZED VIEW
<a name="materialized-view-create-sql-command"></a>

根據一個或多個 Amazon Redshift 資料表建立具體化視觀表。您也可以讓具體化視觀表以使用 Spectrum 或聯合查詢建立的外部資料表為依據。如需 Spectrum 的詳細資訊，請參閱[Amazon Redshift Spectrum](c-using-spectrum.md)。如需聯合查詢的詳細資訊，請參閱 [使用 Amazon Redshift 中的聯合查詢來查詢資料](federated-overview.md)。

## 語法
<a name="mv_CREATE_MATERIALIZED_VIEW-synopsis"></a>

```
CREATE MATERIALIZED VIEW mv_name
[ BACKUP { YES | NO } ]
[ table_attributes ]
[ AUTO REFRESH { YES | NO } ]
AS query
```

## Parameters
<a name="mv_CREATE_MATERIALIZED_VIEW-parameters"></a>

BACKUP  
此子句會指定具體化視觀表是否應包含在自動化和手動叢集快照中。  
若是未包含重要資料的具體化視觀表，指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間，並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響，因此指定了 BACKUP NO 的具體化視觀表會在節點發生故障時還原。預設值為 BACKUP YES。

 *table\$1attributes*   
此子句指定如何分配具體化檢視中的資料，其中包括：  
+  具體化檢視的分佈樣式，其格式為 `DISTSTYLE { EVEN | ALL | KEY }`。如果您省略此子句，則分佈樣式為 `EVEN`。如需詳細資訊，請參閱[分佈樣式](c_choosing_dist_sort.md)。
+ 具體化檢視的分佈索引鍵，其格式為 `DISTKEY ( distkey_identifier )`。如需詳細資訊，請參閱[指定分佈樣式](t_designating_distribution_styles.md)。
+ 具體化檢視的排序索引鍵，其格式為 `SORTKEY ( column_name [, ...] )`。如需詳細資訊，請參閱[排序索引鍵](t_Sorting_data.md)。

AS *query*  
定義具體化視觀表及其內容的有效 `SELECT` 陳述式。查詢的結果集會定義具體化檢視的資料行與資料列。如需有關建立具體化檢視時有何限制的資訊，請參閱[限制](#mv_CREATE_MATERIALIZED_VIEW-limitations)。  
此外，查詢中使用的特定 SQL 語言建構會決定具體化檢視是否可以增量或完全重新整理。如需重新整理方法的相關資訊，請參閱[REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)。如需增量重新整理之限制的相關資訊，請參閱[增量重新整理的限制](materialized-view-refresh-sql-command.md#mv_REFRESH_MARTERIALIZED_VIEW_limitations)。  
如果查詢包含不支援增量重新整理的 SQL 命令，則 Amazon Redshift 會顯示訊息，指出具體化視觀表將使用完整重新整理。不一定會顯示訊息，視 SQL 用戶端應用程式而定。檢查 [STV\$1MV\$1INFO](r_STV_MV_INFO.md) 的 `state` 資料欄，以查看具體化檢視所使用的重新整理類型。

AUTO REFRESH  
該子句會定義是否應使用基本資料表中的最新變更自動重新整理具體化視觀表。預設值為 `NO`。如需詳細資訊，請參閱[重新整理具體化視觀表](materialized-view-refresh.md)。

## 使用須知
<a name="mv_CREATE_MARTERIALIZED_VIEW_usage"></a>

若要建立具體化檢視，您必須具有下列權限：
+ 結構描述的 CREATE 權限。
+ 在基礎資料表上建立具體化視觀表的資料表層級或資料欄層級 SELECT 權限。如果您擁有特定資料欄層級的權限，就可以僅針對這些資料欄建立具體化視觀表。

 您可以在 提供外部資料庫名稱，從遠端資料共用叢集建立具體化檢視`mv_name`。

## 資料共用中具體化視觀表的累加式重新整理
<a name="mv_CREATE_MARTERIALIZED_VIEW_datashare"></a>

 共用基礎資料表時，Amazon Redshift 支援取用者資料共用中具體化視觀表的自動和累加式重新整理。累加式重新整理是一項操作，Amazon Redshift 會藉此識別基礎資料表自上一次重新整理後發生的變更，並且僅更新具體化視觀表中對應的記錄。這樣的執行速度會比完整重新整理更快，並可改善工作負載效能。您不需要變更具體化視觀表定義，即可利用累加式重新整理。

利用具體化視觀表進行累加式重新整理時，需要注意幾項限制：
+ 具體化視觀表必須只參考一個資料庫，無論是本機或遠端。
+ 累加式重新整理僅適用於新的具體化視觀表。因此，您必須捨棄現有的具體化視觀表，並重新建立視觀表，才能執行累加式重新整理。

如需在資料共用中建立具體化視觀表的詳細資訊，請參閱[在 Amazon Redshift 資料共用中使用檢視](https://docs.aws.amazon.com/redshift/latest/dg/datashare-views)，其中包含數個查詢範例。

## 具體化檢視或基礎資料表的 DDL 更新
<a name="materialized-view-ddl"></a>

在 Amazon Redshift 中使用具體化視觀表時，請遵循下列對具體化檢視或基礎資料表進行資料定義語言 (DDL) 更新時的使用注意事項。
+ 您可以將資料欄新增到基礎資料表，而不影響任何參考該基礎資料表的具體化視觀表。
+ 某些操作也可能使具體化檢視進入完全無法重新整理的狀態。例如：重新命名或卸除資料欄、變更資料欄類型，以及變更結構描述名稱等操作。這類具體化檢視可以進行查詢，但無法重新整理。在此情況下，您必須卸除並重新建立具體化檢視。
+ 一般而言，您無法修改具體化檢視的定義 (其 SQL 陳述式)。
+ 您無法將具體化檢視重新命名。

## 限制
<a name="mv_CREATE_MATERIALIZED_VIEW-limitations"></a>

您無法定義參考或包含以下任何一項的具體化檢視：
+ 標準檢視，或系統資料表和檢視。
+ 暫存資料表。
+ 使用者定義的函數。
+ ORDER BY、LIMIT 或 OFFSET 子句。
+ 對基礎資料表的近期繫結參考。換句話說，定義具體化檢視的 SQL 查詢中所參考的任何基底資料表或相關資料行都必須存在，且必須有效。
+ 僅限領導節點的函數：CURRENT\$1SCHEMA、CURRENT\$1SCHEMAS、HAS\$1DATABASE\$1PRIVILEGE、HAS\$1SCHEMA\$1PRIVILEGE、HAS\$1TABLE\$1PRIVILEGE。
+ 具體化視觀表定義包含可變函數或外部結構描述時，您無法使用 AUTO REFRESH YES 選項。當您在另一個具體化視觀表上定義具體化視觀表時，也無法使用此選項。
+ 您不需要在具體化視觀表上手動執行 [ANALYZE](r_ANALYZE.md)。目前這種情況只會透過 AUTO ANALYZE 發生。如需詳細資訊，請參閱[分析資料表](t_Analyzing_tables.md)。
+ 受 RLS 保護或 DDM 保護的資料表。
+ 從遠端資料共用叢集建立具體化檢視不支援對其他具體化檢視、Spectrum 資料表、不同 Redshift 叢集和 UDFs 中定義的資料表進行參考。這些支援從本機 （生產者） 叢集建立具體化檢視。

## 範例
<a name="mv_CREATE_MARTERIALIZED_VIEW_examples"></a>

下列範例會從三個加入和彙總的基礎資料表建立具體化視觀表。每一列代表具有售票數的類別。查詢 tickets\$1mv 具體化檢視時，您可以直接存取 tickets\$1mv 具體化檢視中的預先計算資料。

```
CREATE MATERIALIZED VIEW tickets_mv AS
    select   catgroup,
    sum(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;
```

下列範例會建立類似上述範例的具體化視觀表，並使用彙總函數 MAX()。

```
CREATE MATERIALIZED VIEW tickets_mv_max AS
    select   catgroup,
    max(qtysold) as sold
    from     category c, event e, sales s
    where    c.catid = e.catid
    and      e.eventid = s.eventid
    group by catgroup;

SELECT name, state FROM STV_MV_INFO;
```

下列範例使用 UNION ALL 子句加入 Amazon Redshift `public_sales` 資料表與 Redshift Spectrum `spectrum.sales` 資料表來建立具體化視觀表 `mv_sales_vw`。如需 Amazon Redshift Spectrum 的 CREATE EXTERNAL TABLE 命令的詳細資訊，請參閱 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)。Redshift Spectrum 外部資料表會參考 Amazon S3 上的資料。

```
CREATE MATERIALIZED VIEW mv_sales_vw as
select salesid, qtysold, pricepaid, commission, saletime from public.sales
union all
select salesid, qtysold, pricepaid, commission, saletime from spectrum.sales
```

下列範例會根據聯合查詢外部資料表建立具體化檢視 `mv_fq`。如需聯合查詢的詳細資訊，請參閱 [CREATE EXTERNAL SCHEMA](r_CREATE_EXTERNAL_SCHEMA.md)。

```
CREATE MATERIALIZED VIEW mv_fq as select firstname, lastname from apg.mv_fq_example;

select firstname, lastname from mv_fq;
 firstname | lastname
-----------+----------
 John      | Day
 Jane      | Doe
(2 rows)
```

下列範例顯示具體化檢視的定義。

```
SELECT pg_catalog.pg_get_viewdef('mv_sales_vw'::regclass::oid, true);

pg_get_viewdef
---------------------------------------------------
create materialized view mv_sales_vw as select a from t;
```

 下列範例顯示如何在具體化視觀表定義中設定 AUTO REFRESH，以及如何指定 DISTSTYLE。首先，建立一個簡單的基底資料表。

```
CREATE TABLE baseball_table (ball int, bat int);
```

然後建立具體化視觀表。

```
CREATE MATERIALIZED VIEW mv_baseball DISTSTYLE ALL AUTO REFRESH YES AS SELECT ball AS baseball FROM baseball_table;
```

現在您可以查詢 mv\$1baseball 具體化視觀表。若要檢查具體化視觀表是否已開啟 AUTO REFRESH，請參閱 [STV\$1MV\$1INFO](r_STV_MV_INFO.md)。

下列範例會建立參照另一個資料庫中來源資料表的具體化視觀表。假設包含來源資料表的資料庫 database\$1A 與您在 database\$1B 中建立的具體化視觀表位於相同叢集或工作群組中。(您可以將範例取代為自己的資料庫。) 首先，在 database\$1A 中建立一個名為 *cities* 的資料表，其中包含 *cityname* 資料欄。使資料欄的資料類型成為 VARCHAR。建立來源資料表之後，在 database\$1B 中執行下列命令，以建立其來源為 *cities* 資料表的具體化視觀表。確實在 FROM 子句中指定來源資料表的資料庫和結構描述：

```
CREATE MATERIALIZED VIEW cities_mv AS
SELECT  cityname
FROM    database_A.public.cities;
```

查詢您建立的具體化視觀表。查詢會擷取其原始來源為 database\$1A 中 *cities* 資料表的記錄：

```
select * from cities_mv;
```

當您執行 SELECT 陳述式時，*cities\$1mv* 會傳回記錄。只有在執行 REFRESH 陳述式時，才會從來源資料表重新整理記錄。此外，請注意，您無法直接在具體化視觀表中更新記錄。如需有關重新整理具體化視觀表中資料的資訊，請參閱 [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)。

如需有關具體化檢視概觀，以及用來重新整理和捨棄具體化檢視之 SQL 命令的詳細資訊，請參閱下列主題：
+ [Amazon Redshift 中的具體化視觀表](materialized-view-overview.md)
+ [REFRESH MATERIALIZED VIEW](materialized-view-refresh-sql-command.md)
+ [DROP MATERIALIZED VIEW](materialized-view-drop-sql-command.md)

# CREATE MODEL
<a name="r_CREATE_MODEL"></a>

**Topics**
+ [先決條件](#r_create_model_prereqs)
+ [所需權限](#r_simple_create_model-privileges)
+ [成本控制](#r_create_model_cost)
+ [完整的 CREATE MODEL](#r_full_create_model)
+ [Parameters](#r_create_model_parameters)
+ [使用須知](r_create_model_usage_notes.md)
+ [使用案例](r_create_model_use_cases.md)

## 先決條件
<a name="r_create_model_prereqs"></a>

使用 CREATE MODEL 陳述式之前，請先完成 [使用 Amazon Redshift ML 的叢集設定](getting-started-machine-learning.md#cluster-setup) 中的先決條件。以下是先決條件的概要。
+ 使用 AWS 管理主控台或命令列界面 (AWS CLI) 建立 AWS Amazon Redshift 叢集。
+ 在建立叢集時連接 AWS Identity and Access Management (IAM) 政策。
+ 若要允許 Amazon Redshift 和 SageMaker AI 擔任與其他服務互動的角色，請將適當的信任政策新增至 IAM 角色。

如需 IAM 角色、信任政策和其他先決條件的詳細資訊，請參閱 [使用 Amazon Redshift ML 的叢集設定](getting-started-machine-learning.md#cluster-setup)。

接下來，你可以找到 CREATE MODEL 陳述式的不同使用案例。
+ [簡易 CREATE MODEL](r_create_model_use_cases.md#r_simple_create_model)
+ [CREATE MODEL 和使用者指引](r_create_model_use_cases.md#r_user_guidance_create_model)
+ [CREATE XGBoost 模型與 AUTO OFF](r_create_model_use_cases.md#r_auto_off_create_model)
+ [使用自有模型 (BYOM) - 本機推論](r_create_model_use_cases.md#r_byom_create_model)
+ [使用自有模型 (BYOM) - 遠端推論](r_create_model_use_cases.md#r_byom_create_model_remote)
+ [CREATE MODEL 與 K-MEANS](r_create_model_use_cases.md#r_k-means_create_model)
+ [完整的 CREATE MODEL](#r_full_create_model)

## 所需權限
<a name="r_simple_create_model-privileges"></a>

以下是 CREATE MODEL 所需的權限：
+ 超級使用者
+ 具有 CREATE MODEL 權限的使用者
+ 具有 GRANT CREATE MODEL 權限的角色

## 成本控制
<a name="r_create_model_cost"></a>

 Amazon Redshift ML 會使用現有的叢集資源建立預測模型，因此您不必支付額外費用。但是，如果您需要調整叢集大小或想要訓練模型，則可能會產生額外費用。Amazon Redshift ML 會使用 Amazon SageMaker AI 來訓練模型，這確實會產生額外的相關費用。有一些方法可以控制額外成本，例如限制訓練所耗用的時間上限，或限制用於訓練模型的訓練範例數量。如需詳細資訊，請參閱[使用 Amazon Redshift 資料 API](https://docs.aws.amazon.com/redshift/latest/dg/cost.html)。

## 完整的 CREATE MODEL
<a name="r_full_create_model"></a>

以下概述完整 CREATE MODEL 語法的基本選項。

### 完整的 CREATE MODEL 語法
<a name="r_auto_off-create-model-synposis"></a>

以下是 CREATE MODEL 陳述式的完整語法。

**重要**  
使用 CREATE MODEL 陳述式建立模型時，請遵循下列語法中的關鍵字順序。

```
CREATE MODEL model_name
FROM { table_name | ( select_statement )  | 'job_name' }
[ TARGET column_name ]
FUNCTION function_name [ ( data_type [, ...] ) ] 
[ RETURNS data_type ] 
  -- supported only for BYOM
[ SAGEMAKER 'endpoint_name'[:'model_name']] 
  -- supported only for BYOM remote inference
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[ AUTO ON / OFF ]
  -- default is AUTO ON
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER | KMEANS | FORECAST } ]
  -- not required for non AUTO OFF case, default is the list of all supported types
  -- required for AUTO OFF
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
  -- not supported when AUTO OFF
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1_Macro' | 'AUC' |
             'reg:squarederror' | 'reg:squaredlogerror'| 'reg:logistic'|
             'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge',
             'multi:softmax' | 'RMSE' | 'WAPE' | 'MAPE' | 'MASE' | 'AverageWeightedQuantileLoss' ) ]
  -- for AUTO ON: first 5 are valid
  -- for AUTO OFF: 6-13 are valid
  -- for FORECAST: 14-18 are valid
[ PREPROCESSORS 'string' ]
  -- required for AUTO OFF, when it has to be 'none'
  -- optional for AUTO ON
[ HYPERPARAMETERS { DEFAULT | DEFAULT EXCEPT ( Key 'value' (,...) ) } ]
  -- support XGBoost hyperparameters, except OBJECTIVE
  -- required and only allowed for AUTO OFF
  -- default NUM_ROUND is 100
  -- NUM_CLASS is required if objective is multi:softmax (only possible for AUTO OFF)
 [ SETTINGS (
   S3_BUCKET 'amzn-s3-demo-bucket',  |
    -- required
  TAGS 'string', |
    -- optional
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional, defualt is on.
  MAX_CELLS integer, |
    -- optional, default is 1,000,000
  MAX_RUNTIME integer (, ...) |
    -- optional, default is 5400 (1.5 hours)
  HORIZON integer, |
    -- required if creating a forecast model
  FREQUENCY integer, |
    -- required if creating a forecast model
  PERCENTILES string, |
    -- optional if creating a forecast model
  MAX_BATCH_ROWS integer -- optional for BYOM remote inference
    ) ]
```

## Parameters
<a name="r_create_model_parameters"></a>

model\$1name  
模型的名稱。結構描述中的模型名稱必須是唯一的。

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1 *'job\$1name'*\$1  
指定訓練資料的 table\$1name 或查詢。這可以是系統中現有的資料表，也可以是與 Amazon RedShift 相容的 SELECT 查詢，並以括號括住，也就是 ()。查詢結果中至少必須有兩個資料列。

TARGET *column\$1name*  
成為預測目標的資料欄名稱。該資料欄必須存在於 FROM 子句中。

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
要建立的函數名稱和輸入引數的資料類型。您可以提供資料庫中結構描述的結構描述名稱，而非函式名稱。

RETURNS *data\$1type*  
從模型的函式傳回的資料類型。傳回的 `SUPER` 資料類型僅適用於具有遠端推論的 BYOM。

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]  
Amazon SageMaker AI 端點的名稱。如果端點名稱指向多模型端點，請新增要使用的模型名稱。端點必須託管在與 Amazon Redshift 叢集 AWS 區域 相同的 中。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE MODEL 命令時與叢集關聯的 IAM 角色。或者，您可以指定 IAM 角色的 ARN 以使用該角色。

[ AUTO ON / OFF ]  
 開啟或關閉預處理器、演算法和超參數選擇的 CREATE MODEL 自動探索。在建立預測模型時指定開啟，以使用 AutoPredictor，其中 Amazon Forecast 會將最佳演算法組合套用至資料集中的每個時間序列。

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1 KMEANS \$1 FORECAST \$1*   
(選擇性) 指定模型類型。您可以指定是否要訓練特定模型類型的模型，例如 XGBoost、多層感知器 (MLP)、KMEANS 或線性學習程式，這些都是 Amazon SageMaker AI Autopilot 支援的演算法。如果未指定參數，則會在訓練期間搜尋所有支援的模型類型，以取得最佳模型。您也可以在 Redshift ML 中建立預測模型，以建立準確的時間序列預測。

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(選擇性) 指定問題類型。如果您知道問題類型，則可以將 Amazon Redshift 限制為僅搜尋該特定模型類型的最佳模型。如果未指定此參數，則訓練期間會根據您的資料探索問題類型。

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC' \$1 'reg:squarederror' \$1 'reg:squaredlogerror' \$1 'reg:logistic' \$1 'reg:pseudohubererror' \$1 'reg:tweedie' \$1 'binary:logistic' \$1 'binary:hinge' \$1 'multi:softmax' \$1 'RMSE' \$1 'WAPE' \$1 'MAPE' \$1 'MASE' \$1 'AverageWeightedQuantileLoss' )  
(選擇性) 指定用來測量機器學習系統預測品質的目標指標名稱。此指標會在訓練期間進行最佳化，從資料中提供模型參數值的最佳估計值。如果您沒有明確指定指標，則預設行為是自動將 MSE: 用於迴歸、將 F1: 用於二進制分類、將 Accuracy: 用於多類別分類。如需目標的相關資訊，請參閱 *Amazon SageMaker AI API 參考*中的 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html) 和 XGBOOST 文件中的[學習任務參數](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters)。RMSE、WAPE、MAPE、MASE 和 AverageWeightedQuantileLoss 僅適用於預測模型。如需詳細資訊，請參閱 [CreateAutoPredictor](https://docs.aws.amazon.com/forecast/latest/dg/API_CreateAutoPredictor.html#forecast-CreateAutoPredictor-request-OptimizationMetric) API 操作。

 *PREPROCESSORS 'string' *   
(選擇性) 指定特定資料欄集的特定預處理器組合。格式會是 columnSets 清單，以及要套用到每一組資料欄的適當轉換。Amazon Redshift 會將特定轉換清單中的所有轉換套用至對應 ColumnSet 中的所有資料欄。例如，若要將帶有 Imputer 的 OneHotenCoder 套用至資料欄 t1 和 t2，請使用以下範例命令。  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
  {"ColumnSet": [
      "t1",
      "t2"
    ],
    "Transformers": [
      "OneHotEncoder",
      "Imputer"
    ]
  },
  {"ColumnSet": [
      "t3"
    ],
    "Transformers": [
      "OneHotEncoder"
    ]
  },
  {"ColumnSet": [
      "temp"
    ],
    "Transformers": [
      "Imputer",
      "NumericPassthrough"
    ]
  }
]'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket'
)
```

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
指定使用預設的 XGBoost 參數或以使用者指定的值覆寫。這些值必須用單引號括住。以下是 XGBoost 及其預設值的參數範例。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_CREATE_MODEL.html)

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 TAGS 'string', \$1 KMS\$1KEY\$1ID *'kms\$1string' *, \$1 S3\$1GARBAGE\$1COLLECT on / off, \$1 MAX\$1CELLS integer , \$1 MAX\$1RUNTIME (,...) , \$1 HORIZON integer, \$1 FREQUENCY forecast\$1frequency, \$1 PERCENTILES array of strings )  
S3\$1BUCKET 子句會指定用來儲存中繼結果的 Amazon S3 位置。  
(選用) TAGS 參數是以逗號分隔的索引鍵值配對清單，可用來標記在 Amazon SageMaker AI 中建立的資源和 Amazon Forecast。標籤可協助您整理資源和配置成本。配對中的值是可選的，因此您可以使用 `key=value` 格式或直接建立索引鍵來建立標籤。如需 Amazon Redshift 中標籤的相關資訊，請參閱[標記概觀](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-tagging.html)。  
（選用） KMS\$1KEY\$1ID 指定 Amazon Redshift 是否使用伺服器端加密搭配 AWS KMS 金鑰來保護靜態資料。傳輸中的資料會受到 Secure Sockets Layer (SSL) 保護。  
(選擇性) S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1 會指定 Amazon Redshift 是否對用於訓練模型的結果資料集和模型執行垃圾回收。如果設定為 OFF，用於訓練模型的結果資料集和模型會保留在 Amazon S3 中，並可用於其他用途。如果設定為 ON，Amazon Redshift 會在訓練完成後刪除 Amazon S3 中的成品。預設值為 ON。  
(選擇性) MAX\$1CELLS 會指定訓練資料中的儲存格數目。此值是記錄數目 (訓練查詢或資料表中) 乘以欄數的乘積。預設值為 1,000,000。  
(選擇性) MAX\$1RUNTIME 會指定訓練的時間上限。視資料集大小而定，訓練工作通常會更快完成。這會指定訓練應耗用的時間上限。預設值為 5,400 (90 分鐘)。  
HORIZON 會指定預測模型可傳回的預測數量上限。模型一經過訓練，就無法再變更此整數。如果訓練預測模型，則需要此參數。  
FREQUENCY 會指定您希望預測使用多細微的時間單位。可用選項為 `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`。如果訓練預測模型，則需要此參數。  
(選擇性) PERCENTILES 是逗號分隔的字串，可指定用來訓練預測器的預測類型。預測類型可以是 0.01 到 0.99 之間的分位數，增量單位為 0.01 或更高。您也可以使用平均值指定平均預測。您最多可以指定五種預測類型。

 MAX\$1BATCH\$1ROWS *integer*   
(選用) Amazon Redshift 在單一批次請求中針對單一 SageMaker AI 調用傳送的列數上限。只有具有遠端推論的 BYOM 才支援。此參數的最小值為 1。最大值為 `INT_MAX`，或 2,147,483,647。只有在輸入和傳回的資料類型皆為 *SUPER* 時，才需要此參數。預設值為 `INT_MAX`，或 2,147,483,647。

# 使用須知
<a name="r_create_model_usage_notes"></a>

使用 CREATE MODEL 時，請考量下列事項。
+ CREATE MODEL 陳述式會以非同步模式運作，並在將訓練資料匯出至 Amazon S3 時傳回。Amazon SageMaker AI 中的其餘訓練步驟會在背景中進行。訓練正在進行中時，對應的推論函數會顯示，但無法執行。您可以查詢 [STV\$1ML\$1MODEL\$1INFO](r_STV_ML_MODEL_INFO.md) 以查看訓練狀態。
+ 根據預設，在自動模式中，訓練最多可在背景執行 90 分鐘，而且可以延長。若要取消訓練，只要執行 [DROP MODEL](r_DROP_MODEL.md) 命令即可。
+ 您用來建立模型的 Amazon Redshift 叢集，以及用來暫存訓練資料和模型成品的 Amazon S3 儲存貯體必須位於相同 AWS 區域。
+ 在模型訓練期間，Amazon Redshift 和 SageMaker AI 會將中繼成品儲存在您提供的 Amazon S3 儲存貯體中。根據預設，Amazon Redshift 會在 CREATE MODEL 操作結束時執行垃圾回收。Amazon Redshift 會從 Amazon S3 中移除這些物件。若要將這些成品保留在 Amazon S3 上，請設定 S3\$1GARBAGE COLLECT OFF 選項。
+ 您必須在 FROM 子句中提供的訓練資料中使用至少 500 個資料列。
+ 使用 CREATE MODEL 陳述式時，您最多只能在 FROM \$1 table\$1name \$1 ( select\$1query ) \$1 子句中指定 256 個特徵 (輸入) 資料欄。
+ 若是 AUTO ON，您可以用來做為訓練集的資料欄類型為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE、BOOLEAN、CHAR、VARCHAR、DATE、TIME、TIMETZ、TIMESTAMP 和 TIMESTAMPTZ。若是 AUTO OFF，您可以用來做為訓練集的資料欄類型為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE 和 BOOLEAN。
+ 您不能使用 DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP、TIMESTAMPTZ、GEOMETRY、GEOGRAPHY、HLLSKETCH、SUPER 或 VARBYTE 做為目標資料欄類型。
+ 若要改善模型精確度，請執行下列其中一項操作：
  + 當您在 FROM 子句中指定訓練資料時，在 CREATE MODEL 命令中盡可能多新增相關資料欄。
  + 使用較大的值做為 MAX\$1RUNTIME 和 MAX\$1CELLS。此參數的值越大，訓練模型的成本也會增加。
+ 只要計算訓練資料並將其匯出至 Amazon S3 儲存貯體，就會立即傳回 CREATE MODEL 陳述式執行。在此之後，您可以使用 SHOW MODEL 命令檢查訓練的狀態。在背景訓練的模型失敗時，您可以使用 SHOW MODEL 來檢查錯誤。您無法重試失敗的模型。使用 DROP MODEL 可移除失敗的模型並重新建立新模型。如需 SHOW MODEL 的相關資訊，請參閱 [SHOW MODEL](r_SHOW_MODEL.md)。
+ 本機 BYOM 支援 Amazon Redshift ML 在非 BYOM 案例中支援的同類型模型。Amazon Redshift 支援一般 XGBoost (使用 XGBoost 1.0 版或更新版本)、不含預處理器的 KMEANS 模型，以及由 Amazon SageMaker AI Autopilot 訓練的 XGBOOST/MLP/線性學習程式模型。後者可在 Autopilot 指定的預處理器也受到 Amazon SageMaker AI Neo 支援時受到支援。
+ 如果您的 Amazon Redshift 叢集已為您的虛擬私有雲端 (VPC) 啟用增強型路由功能，請務必為叢集所在的 VPC 建立 Amazon S3 VPC 端點和 SageMaker AI VPC 端點。這樣做可在 CREATE MODEL 期間，讓流量在這些服務之間通過您的 VPC。如需詳細資訊，請參閱 [SageMaker AI 澄清作業 Amazon VPC 子網路和安全群組](https://docs.aws.amazon.com/sagemaker/latest/dg/clarify-vpc.html#clarify-vpc-job)。

# 使用案例
<a name="r_create_model_use_cases"></a>

以下使用案例會示範如何使用 CREATE MODEL 來滿足您的需求。

## 簡易 CREATE MODEL
<a name="r_simple_create_model"></a>

以下概述 CREATE MODEL 語法的基本選項。

### 簡易 CREATE MODEL 語法
<a name="r_simple-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_query ) }
TARGET column_name
FUNCTION prediction_function_name
IAM_ROLE { default }
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  [ MAX_CELLS integer ]
)
```

### 簡易 CREATE MODEL 參數
<a name="r_simple-create-model-parameters"></a>

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

FROM \$1 *table\$1name* \$1 ( *select\$1query* ) \$1  
指定訓練資料的 table\$1name 或查詢。這可以是系統中現有的資料表，也可以是與 Amazon RedShift 相容的 SELECT 查詢，並以括號括住，也就是 ()。查詢結果中至少必須有兩個資料列。

TARGET *column\$1name*  
成為預測目標的資料欄名稱。該資料欄必須存在於 FROM 子句中。

FUNCTION *prediction\$1function\$1name*   
該值會指定要由 CREATE MODEL 產生的 Amazon Redshift 機器學習函數名稱，並用於使用此模型進行預測。該函數會在與模型物件相同的結構描述中建立，並且可以多載。  
Amazon Redshift 機器學習可支援模型，例如用於迴歸和分類的 Xtreme 梯度提升樹 (XGBoost) 模型。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
 使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREAT MODEL 命令時與叢集關聯的 IAM 角色。或者，您也可以指定 IAM 角色的 ARN 以使用該角色。

 *S3\$1BUCKET *'amzn-s3-demo-bucket'**  
您之前建立的 Amazon S3 儲存貯體名稱，用於在 Amazon Redshift 和 SageMaker AI 之間共用訓練資料和成品。Amazon Redshift 會在卸載訓練資料之前，在此儲存貯體中建立一個子資料夾。訓練完成後，Amazon Redshift 會刪除建立的子資料夾及其內容。

MAX\$1CELLS 整數   
要從 FROM 子句匯出的儲存格數目上限。預設值為 1,000,000。  
儲存格數目是訓練資料 (由 FROM 子句資料表或查詢產生) 中的資料列數乘以資料欄數的乘積。如果訓練資料中的儲存格數目大於 max\$1cell 參數所指定的儲存格數目，CREATE MODEL 會縮減 FROM 子句訓練資料，將訓練集的大小縮減到低於 MAX\$1CELLS。允許更大的訓練資料集可以產生更高的準確性，但也可能意味著模型需要更長的訓練時間和更高的成本。  
如需 Amazon Redshift 使用成本的資訊，請參閱 [使用 Amazon Redshift ML 的成本](cost.md)。  
如需各種儲存格數目的成本和免費試用的相關資訊，請參閱 [Amazon Redshift 定價](https://aws.amazon.com/redshift/pricing)。

## CREATE MODEL 和使用者指引
<a name="r_user_guidance_create_model"></a>

以下說明 [簡易 CREATE MODEL](#r_simple_create_model) 中所述選項之外的 CREATE MODEL 選項。

根據預設，CREATE MODEL 會搜尋特定資料集的最佳預處理和模型組合。您可能需要模型的額外控制項目或對其引入其他領域知識 (例如問題類型或目標)。在客戶流失案例中，如果「客戶不活躍」的結果很少見，則 F1 目標通常高於準確度目標。因為高準確度模型可能會一直預測到「客戶很活躍」，此結果雖然具有高準確度，但商業價值很小。如需 F1 目標的相關資訊，請參閱 *Amazon SageMaker AI API 參考*中的 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html)。

然後，CREATE MODEL 會遵循您在指定層面的建議，例如目標。同時，CREATE MODEL 會自動發現最佳的預處理器和最佳的超參數。

### CREATE MODEL 和使用者指引語法
<a name="r_user_guidance-create-model-synposis"></a>

CREATE MODEL 可為您可以指定的層面及 Amazon Redshift 可自動發現的層面提供更大的彈性。

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
[ MODEL_TYPE { XGBOOST | MLP | LINEAR_LEARNER} ]
[ PROBLEM_TYPE ( REGRESSION | BINARY_CLASSIFICATION | MULTICLASS_CLASSIFICATION ) ]
[ OBJECTIVE ( 'MSE' | 'Accuracy' | 'F1' | 'F1Macro' | 'AUC') ]
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### CREATE MODEL 和使用者指引參數
<a name="r_user_guidance-create-model-parameters"></a>

 *MODEL\$1TYPE \$1 XGBOOST \$1 MLP \$1 LINEAR\$1LEARNER \$1*   
(選擇性) 指定模型類型。您可以指定是否要訓練特定模型類型的模型，例如 XGBoost、多層感知器 (MLP) 或線性學習程式，這些都是 Amazon SageMaker AI Autopilot 支援的演算法。如果未指定參數，則會在訓練期間搜尋所有支援的模型類型，以取得最佳模型。

 *PROBLEM\$1TYPE ( REGRESSION \$1 BINARY\$1CLASSIFICATION \$1 MULTICLASS\$1CLASSIFICATION )*   
(選擇性) 指定問題類型。如果您知道問題類型，則可以將 Amazon Redshift 限制為僅搜尋該特定模型類型的最佳模型。如果未指定此參數，則訓練期間會根據您的資料探索問題類型。

OBJECTIVE ( 'MSE' \$1 'Accuracy' \$1 'F1' \$1 'F1Macro' \$1 'AUC')  
(選擇性) 指定用來測量機器學習系統預測品質的目標指標名稱。此指標會在訓練期間進行最佳化，從資料中提供模型參數值的最佳估計值。如果您沒有明確指定指標，則預設行為是自動將 MSE: 用於迴歸、將 F1: 用於二進制分類、將 Accuracy: 用於多類別分類。如需目標的詳細資訊，請參閱 *Amazon SageMaker AI API 參考*中的 [AutoMLJobObjective](https://docs.aws.amazon.com//sagemaker/latest/APIReference/API_AutoMLJobObjective.html)。

MAX\$1CELLS 整數   
(選擇性) 指定訓練資料中的儲存格數目。此值是記錄數目 (訓練查詢或資料表中) 乘以欄數的乘積。預設值為 1,000,000。

MAX\$1RUNTIME 整數   
(選擇性) 指定訓練的時間上限。視資料集大小而定，訓練工作通常會更快完成。這會指定訓練應耗用的時間上限。預設值為 5,400 (90 分鐘)。

S3\$1GARBAGE\$1COLLECT \$1 ON \$1 OFF \$1  
(選擇性) 指定 Amazon Redshift 是否對用於訓練模型的結果資料集和模型執行垃圾回收。如果設定為 OFF，用於訓練模型的結果資料集和模型會保留在 Amazon S3 中，並可用於其他用途。如果設定為 ON，Amazon Redshift 會在訓練完成後刪除 Amazon S3 中的成品。預設值為 ON。

KMS\$1KEY\$1ID 'kms\$1key\$1id'  
(選擇性) 指定 Amazon Redshift 是否使用伺服器端加密搭配 AWS KMS 索引鍵來保護靜態資料。傳輸中的資料會受到 Secure Sockets Layer (SSL) 保護。

 *PREPROCESSORS 'string' *   
(選擇性) 指定特定資料欄集的特定預處理器組合。格式會是 columnSets 清單，以及要套用到每一組資料欄的適當轉換。Amazon Redshift 會將特定轉換清單中的所有轉換套用至對應 ColumnSet 中的所有資料欄。例如，若要將帶有 Imputer 的 OneHotenCoder 套用至資料欄 t1 和 t2，請使用以下範例命令。  

```
CREATE MODEL customer_churn
FROM customer_data
TARGET 'Churn'
FUNCTION predict_churn
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
PROBLEM_TYPE BINARY_CLASSIFICATION
OBJECTIVE 'F1'
PREPROCESSORS '[
...
{"ColumnSet": [
    "t1",
    "t2"
  ],
  "Transformers": [
    "OneHotEncoder",
    "Imputer"
  ]
},
{"ColumnSet": [
    "t3"
  ],
  "Transformers": [
    "OneHotEncoder"
  ]
},
{"ColumnSet": [
    "temp"
  ],
  "Transformers": [
    "Imputer",
    "NumericPassthrough"
  ]
}
]'
SETTINGS (
S3_BUCKET 'amzn-s3-demo-bucket'
)
```

Amazon Redshift 支援以下轉換：
+ OneHotNCoder — 通常用於將離散值編碼為具有一個非零值的二進位向量。此轉換適用於許多機器學習模型。
+ OrdinalEncoder – 將離散值編碼為單一整數。此轉換適用於特定機器學習模型，例如 MLP 和線性學習程式。
+ NumericPassthrough – 將輸入按原樣傳遞到模型中。
+ Imputer – 填入遺漏值，而不是數字 (NaN) 值。
+ ImputerWithIndicator – 填入遺漏值和 NaN 值。此轉換也會建立指出是否有任何值遺失和填入的指示器。
+ Normalizer – 將值標準化，可改善許多機器學習演算法的效能。
+ DateTimeVectorizer – 建立向量內嵌，代表可在機器學習模型中使用的 datetime 資料類型欄。
+ PCA – 將資料投影到較低的維度空間中，以減少特徵數量，同時盡可能保留更多資訊。
+ StandardScaler – 透過移除平均值和縮放至單位變異來將特徵標準化。
+ MinMax – 透過將每個特徵縮放至指定範圍來轉換特徵。

Amazon Redshift ML 會儲存經過訓練的轉換，並在預測查詢中自動套用這些轉換。從模型產生預測時，您不需要指定這些轉換。

## CREATE XGBoost 模型與 AUTO OFF
<a name="r_auto_off_create_model"></a>

AUTO OFF CREATE MODEL 在預設的 CREATE MODEL 中通常有不同的目標。

如果進階使用者已知道想要的模型類型，以及訓練這些模型時所使用的超參數，您可以使用搭配 AUTO OFF 的 CREATE MODEL 來關閉預處理器和超參數的 CREATE MODEL 自動探索功能。若要這樣做，您必須明確指定模型類型。當 AUTO 設定為 OFF 時，XGBoost 是目前唯一支援的模型類型。您可以指定超參數。Amazon Redshift 會針對您指定的任何超參數使用預設值。

### CREATE XGBoost 模型與 AUTO OFF 語法
<a name="r_auto_off-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | (select_statement ) }
TARGET column_name
FUNCTION function_name
IAM_ROLE { default }
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE { 'reg:squarederror' | 'reg:squaredlogerror' | 'reg:logistic' |
            'reg:pseudohubererror' | 'reg:tweedie' | 'binary:logistic' | 'binary:hinge' |
            'multi:softmax' | 'rank:pairwise' | 'rank:ndcg' }
HYPERPARAMETERS DEFAULT EXCEPT (
    NUM_ROUND '10',
    ETA '0.2',
    NUM_CLASS '10',
    (, ...)
)
PREPROCESSORS 'none'
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', |
  S3_GARBAGE_COLLECT { ON | OFF }, |
  KMS_KEY_ID 'kms_key_id', |
  MAX_CELLS integer, |
  MAX_RUNTIME integer (, ...)
)
```

### CREATE XGBoost 模型與 AUTO OFF 參數
<a name="r_auto_off-create-model-parameters"></a>

 *AUTO OFF*   
關閉預處理器、演算法和超參數選擇的 CREATE MODEL 自動探索。

MODEL\$1TYPE XGBOOST  
指定使用 XGBOOST 來訓練模型。

OBJECTIVE str  
指定演算法辨識的目標。Amazon Redshift 可支援 reg:squarederror、reg:squaredlogerror、reg:logistic、reg:pseudohubererror、reg:tweedie、binary:logistic、binary:hinge、multi:softmax。如需這些目標的相關資訊，請參閱 XGBoost 文件中的[學習任務參數](https://xgboost.readthedocs.io/en/latest/parameter.html#learning-task-parameters)。

HYPERPARAMETERS \$1 DEFAULT \$1 DEFAULT EXCEPT ( key ‘value’ (,..) ) \$1  
指定使用預設的 XGBoost 參數或以使用者指定的值覆寫。這些值必須用單引號括住。以下是 XGBoost 及其預設值的參數範例。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_create_model_use_cases.html)

下列範例會準備 XgBoost 的資料。

```
DROP TABLE IF EXISTS abalone_xgb;

CREATE TABLE abalone_xgb (
length_val float,
diameter float,
height float,
whole_weight float,
shucked_weight float,
viscera_weight float,
shell_weight float,
rings int,
record_number int);

COPY abalone_xgb
FROM 's3://redshift-downloads/redshift-ml/abalone_xg/'
REGION 'us-east-1'
IAM_ROLE default
IGNOREHEADER 1 CSV;
```

下列範例會使用指定的進階選項來建立 XGBoost 模型，例如 MODEL\$1TYPE、OBJECTIVE 和 PREPROCESSORS。

```
DROP MODEL abalone_xgboost_multi_predict_age;

CREATE MODEL abalone_xgboost_multi_predict_age
FROM ( SELECT length_val,
              diameter,
              height,
              whole_weight,
              shucked_weight,
              viscera_weight,
              shell_weight,
              rings
   FROM abalone_xgb WHERE record_number < 2500 )
TARGET rings FUNCTION ml_fn_abalone_xgboost_multi_predict_age
IAM_ROLE default
AUTO OFF
MODEL_TYPE XGBOOST
OBJECTIVE 'multi:softmax'
PREPROCESSORS 'none'
HYPERPARAMETERS DEFAULT EXCEPT (NUM_ROUND '100', NUM_CLASS '30')
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

下列範例會使用推論查詢來對記錄編號大於 2500 的魚預測年齡。其使用從上述命令中建立的函數 ml\$1fn\$1abalone\$1xgboost\$1multi\$1predict\$1age。

```
select ml_fn_abalone_xgboost_multi_predict_age(length_val,
                                                   diameter,
                                                   height,
                                                   whole_weight,
                                                   shucked_weight,
                                                   viscera_weight,
                                                   shell_weight)+1.5 as age
from abalone_xgb where record_number > 2500;
```

## 使用自有模型 (BYOM) - 本機推論
<a name="r_byom_create_model"></a>

Amazon Redshift ML 支援透過使用自有模型 (BYOM) 進行本機推論。

以下概述 BYOM 的 CREATE MODEL 語法基本選項。您可以使用在 Amazon Redshift 外部訓練的模型搭配 Amazon SageMaker AI，以便在 Amazon Redshift 本機上進行資料庫內推論。

### 用於本機推論的 CREATE MODEL 語法
<a name="r_local-create-model"></a>

以下說明用於本機推論的 CREATE MODEL 語法。

```
CREATE MODEL model_name
FROM ('job_name' | 's3_path' )
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
IAM_ROLE { default }
[ SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket', | --required
  KMS_KEY_ID 'kms_string') --optional
];
```

Amazon Redshift 目前僅支援對 BYOM 使用預先訓練的 XGBoost、MLP 和線性學習程式模型。您可以使用此路徑匯入 SageMaker AI Autopilot 和直接在 Amazon SageMaker AI 中訓練的模型，以進行本機推論。

#### 用於本機推論的 CREATE MODEL 參數
<a name="r_local-create-model-parameters"></a>

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

FROM (*'job\$1name'* \$1 *'s3\$1path'* )  
*job\$1name* 會使用 Amazon SageMaker AI 任務名稱作為輸入。工作名稱可以是 Amazon SageMaker AI 訓練任務名稱，也可以是 Amazon SageMaker AI Autopilot 任務名稱。工作必須在擁有 Amazon Redshift 叢集的相同 AWS 帳戶中建立。若要尋找任務名稱，請啟動 Amazon SageMaker AI。在**訓練**下拉式選單中，選擇**訓練工作**。  
*'s3\$1path'* 會指定 .tar.gz 模型成品檔案的 S3 位置，這會在建立模型時使用。

FUNCTION *function\$1name* ( *data\$1type* [, ...] )  
要建立的函數名稱和輸入引數的資料類型。您可以提供結構描述名稱。

RETURNS *data\$1type*  
函數所傳回值的資料類型。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE MODEL 命令時與叢集關聯的 IAM 角色。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。

SETTINGS ( S3\$1BUCKET *'amzn-s3-demo-bucket'*, \$1 KMS\$1KEY\$1ID *'kms\$1string'*)  
S3\$1BUCKET 子句會指定用來儲存中繼結果的 Amazon S3 位置。  
（選用） KMS\$1KEY\$1ID 子句指定 Amazon Redshift 是否使用伺服器端加密搭配 AWS KMS 金鑰來保護靜態資料。傳輸中的資料會受到 Secure Sockets Layer (SSL) 保護。  
如需詳細資訊，請參閱[CREATE MODEL 和使用者指引](#r_user_guidance_create_model)。

#### 用於本機推論的 CREATE MODEL 範例
<a name="r_local-create-model-example"></a>

下列範例會建立先前在 Amazon SageMaker AI 中 (Amazon Redshift 外部) 訓練過的模型。由於 Amazon Redshift ML 支援該模型類型來進行本機推論，因此下列 CREATE MODEL 會建立可在 Amazon Redshift 本端使用的函數。您可以提供 SageMaker AI 訓練任務名稱。

```
CREATE MODEL customer_churn
FROM 'training-job-customer-churn-v4'
FUNCTION customer_churn_predict (varchar, int, float, float)
RETURNS int
IAM_ROLE default
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');
```

建立模型之後，您可以使用函數 *customer\$1churn\$1predict* 與指定的引數類型來進行預測。

## 使用自有模型 (BYOM) - 遠端推論
<a name="r_byom_create_model_remote"></a>

Amazon Redshift ML 也支援透過使用自有模型 (BYOM) 進行遠端推論。

以下概述 BYOM 的 CREATE MODEL 語法基本選項。

### 用於遠端推論的 CREATE MODEL 語法
<a name="r_remote-create-model"></a>

以下說明用於遠端推論的 CREATE MODEL 語法。

```
CREATE MODEL model_name 
FUNCTION function_name ( data_type [, ...] )
RETURNS data_type
SAGEMAKER 'endpoint_name'[:'model_name']
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
[SETTINGS (MAX_BATCH_ROWS integer)];
```

#### 用於遠端推論的 CREATE MODEL 參數
<a name="r_remote-create-model-parameters"></a>

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

FUNCTION *fn\$1name* ( [*data\$1type*] [, ...] )  
函數的名稱和輸入引數的資料類型。請參閱所有支援資料類型的[資料類型](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)。`Geography`、`geometry` 和 `hllsketch` 不受支援。  
您也可以使用兩部分記號在結構描述內提供函式名稱，例如 `myschema.myfunction`。

RETURNS *data\$1type*  
函數所傳回值的資料類型。請參閱所有支援資料類型的[資料類型](https://docs.aws.amazon.com/redshift/latest/dg/c_Supported_data_types.html)。`Geography`、`geometry` 和 `hllsketch` 不受支援。

SAGEMAKER *'endpoint\$1name'*[:*'model\$1name'*]   
Amazon SageMaker AI 端點的名稱。如果端點名稱指向多模型端點，請新增要使用的模型名稱。端點必須託管在與 Amazon Redshift AWS 帳戶 叢集相同的 AWS 區域。若要尋找您的端點，請啟動 Amazon SageMaker AI。在**推論**下拉式功能表中，選擇**端點**。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>'\$1  
 使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREATE MODEL 命令時與叢集關聯的 IAM 角色。或者，您也可以指定 IAM 角色的 ARN 以使用該角色。

MAX\$1BATCH\$1ROWS *integer*  
Amazon Redshift 在單一批次請求中針對單一 SageMaker AI 調用傳送的列數上限。只有具有遠端推論的 BYOM 才支援。批次中的實際列數同樣取決於輸入大小，但小於或等於此值。此參數的最小值為 1。最大值為 `INT_MAX`，或 2,147,483,647。只有在輸入和傳回的資料類型皆為 `SUPER` 時，才需要此參數。預設值為 `INT_MAX`，或 2,147,483,647。

將模型部署到 SageMaker AI 端點時，SageMaker AI 會在 Amazon Redshift 中建立模型的資訊。然後透過外部函數執行推斷。您可以使用 SHOW MODEL 命令來檢視 Amazon Redshift 叢集上的模型資訊。

#### 用於遠端推論的 CREATE MODEL 使用須知
<a name="r_remote-create-model-usage-notes"></a>

使用 CREATE Model 進行遠端推論之前，請考慮下列事項：
+ 端點必須由擁有 Amazon Redshift 叢集的相同 AWS 帳戶託管。
+ 請確定 Amazon SageMaker AI 端點具有足夠的資源來容納來自 Amazon Redshift 的推論呼叫，或是可以自動調整 Amazon SageMaker AI 端點的規模。
+ 如果您不是使用 `SUPER` 資料類型作為輸入，則模型只會接受逗號分隔值 (CSV) 格式的輸入，其對應至 SageMaker AI 中的內容類型 `text/CSV`。
+ 如果您不是使用 `SUPER` 資料類型作為輸入，則模型的輸出會是單一值，其類型為您建立函式時所指定。輸出格式為透過 SageMaker AI 中的內容類型 `text/CSV` 的逗號分隔值 (CSV)。`VARCHAR` 資料類型前後不可加上引號，也不可包含新行，而且每個輸出必須各為新的一行。
+ 模型接受 null 作為空字串。
+ 輸入資料類型為 `SUPER` 時，只支援一個輸入引數。
+ 輸入資料類型為 `SUPER` 時，傳回的資料類型也必須是 `SUPER`。
+ 當輸入和傳回的資料類型皆為 SUPER 時，需要 MAX\$1BATCH\$1ROWS。
+ 輸入資料類型為 `SUPER` 時，端點調用的內容類型在 MAX\$1BATCH\$1ROWS 為 `1` 的情況下會是 `application/json`，而在所有其他情況下則為 `application/jsonlines`。
+ 傳回的資料類型為 `SUPER` 時，端點調用的接受類型在 MAX\$1BATCH\$1ROWS 為 `1` 的情況下會是 `application/json`，而在所有其他情況下則為 `application/jsonlines`。

##### 用於遠端推論的 CREATE MODEL 範例
<a name="r_remote-create-model-example"></a>

下列範例會建立使用 SageMaker AI 端點進行預測的模型。請確定端點正在執行以進行預測，並在 CREATE MODEL 命令中指定其名稱。

```
CREATE MODEL remote_customer_churn
FUNCTION remote_fn_customer_churn_predict (varchar, int, float, float)
RETURNS int
SAGEMAKER 'customer-churn-endpoint'
IAM_ROLE default;
```

 下列範例會使用大型語言模型 (LLM) 建立具有遠端推論的 BYOM。Amazon SageMaker AI Jumpstart 上託管的 LLM 接受並傳回 `application/json` 內容類型，而且每次調用支援單一 JSON。輸入和傳回的資料類型必須為 `SUPER`，且 MAX\$1BATCH\$1ROWS 必須設定為 1。

```
CREATE MODEL sample_super_data_model
FUNCTION sample_super_data_model_predict(super)
RETURNS super
SAGEMAKER 'sample_super_data_model_endpoint'
IAM_ROLE default
SETTINGS (MAX_BATCH_ROWS 1);
```

## CREATE MODEL 與 K-MEANS
<a name="r_k-means_create_model"></a>

Amazon Redshift 支援可將未標示資料分組的 K 平均值演算法。此演算法可解決您想在資料中探索分組的叢集問題。未分類的資料會根據其相似性和差異進行分組和分割。

### CREATE MODEL 與 K-MEANS 語法
<a name="r_k-means-create-model-synposis"></a>

```
CREATE MODEL model_name
FROM { table_name | ( select_statement ) }
FUNCTION function_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>' }
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS 'string'
HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  KMS_KEY_ID 'kms_string', |
    -- optional
  S3_GARBAGE_COLLECT on / off, |
    -- optional
  MAX_CELLS integer, |
    -- optional
  MAX_RUNTIME integer
    -- optional);
```

### CREATE MODEL 與 K-MEANS 參數
<a name="r_k-means-create-model-parameters"></a>

 *AUTO OFF*   
關閉預處理器、演算法和超參數選擇的 CREATE MODEL 自動探索。

MODEL\$1TYPE KMEANS  
指定使用 KMEANS 來訓練模型。

PREPROCESSORS 'string'  
指定特定資料欄集的特定預處理器組合。格式會是 columnSets 清單，以及要套用到每一組資料欄的適當轉換。Amazon Redshift 支援 3 個 K 平均值預處理器，即 StandardScaler、MinMax 和 NumericPassthrough。如果您不想對 K 平均值套用任何預處理，請明確選擇 NumericPassthrough 作為轉換器。如需轉換器的相關資訊，請參閱 [CREATE MODEL 和使用者指引參數](#r_user_guidance-create-model-parameters)。  
K 平均值演算法會使用歐幾里德距離來計算相似性。預處理資料可確保模型的特徵保持相同的比例並產生可靠的結果。

HYPERPARAMETERS DEFAULT EXCEPT ( K 'val' [, ...] )  
指定是否使用 K 平均值參數。使用 K 平均值演算法時，您必須指定 `K` 參數。如需詳細資訊，請參閱《Amazon SageMaker AI 開發人員指南》**中的 [K 平均值超參數](https://docs.aws.amazon.com/sagemaker/latest/dg/k-means-api-config.html)

下列範例會準備 K 平均值的資料。

```
CREATE MODEL customers_clusters
FROM customers
FUNCTION customers_cluster
IAM_ROLE default
AUTO OFF
MODEL_TYPE KMEANS
PREPROCESSORS '[
{
  "ColumnSet": [ "*" ],
  "Transformers": [ "NumericPassthrough" ]
}
]'
HYPERPARAMETERS DEFAULT EXCEPT ( K '5' )
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket');

select customer_id, customers_cluster(...) from customers;
customer_id | customers_cluster
--------------------
12345            1
12346            2
12347            4
12348
```

## CREATE MODEL 與預測
<a name="r_forecast_model"></a>

Redshift ML 中的預測模型會使用 Amazon Forecast 來建立準確的時間序列預測。這樣做可讓您使用一段時間內的歷史資料來預測未來事件。Amazon Forecast 的常見使用案例包括使用零售產品資料來決定如何為庫存定價格、製造數量資料來預測要訂購多少項目，以及使用 Web 流量資料來預測 Web 伺服器可能接收的流量。

 [Amazon Forecast 的配額限制](https://docs.aws.amazon.com/forecast/latest/dg/limits.html)會在 Amazon Redshift 預測模型中強制執行。例如，預測的最大數量為 100，但可調整。捨棄預測模型不會自動刪除 Amazon Forecast 中的相關聯資源。如果您刪除 Redshift 叢集，所有相關聯的模型也會被刪除。

請注意，預測模型目前僅適用於下列區域：
+ 美國東部 (俄亥俄) (us-east-2)
+ 美國東部 (維吉尼亞北部) (us-east-1)
+ 美國西部 (奧勒岡) (us-west-2)
+ 亞太區域 (孟買) (ap-south-1)
+ 亞太區域 (首爾) (ap-northeast-2)
+ 亞太地區 (新加坡) (ap-southeast-1)
+ 亞太地區 (雪梨) (ap-southeast-2)
+ 亞太區域 (東京) (ap-northeast-1)
+ 歐洲 (法蘭克福) (eu-central-1)
+ 歐洲 (愛爾蘭) (eu-west-1)

### CREATE MODEL 與預測語法
<a name="r_forecast_model-synopsis"></a>

```
CREATE [ OR REPLACE ] MODEL forecast_model_name 
FROM { table_name | ( select_query ) } 
TARGET column_name
IAM_ROLE { default | 'arn:aws:iam::<account-id>:role/<role-name>'} 
AUTO ON
MODEL_TYPE FORECAST
SETTINGS (
  S3_BUCKET 'amzn-s3-demo-bucket',
  HORIZON integer,
  FREQUENCY forecast_frequency
  [PERCENTILES '0.1', '0.5', '0.9']
  )
```

### CREATE MODEL 與預測參數
<a name="r_forecast_model-parameters"></a>

 *forecast\$1model\$1name*   
模型的名稱。模型名稱必須是唯一的。

FROM \$1 table\$1name \$1 ( select\$1query ) \$1  
指定訓練資料的 table\$1name 或查詢。這可以是系統中現有的資料表，也可以是與 Amazon RedShift 相容的 SELECT 查詢 (以括號括住)。資料表或查詢結果至少必須有三個資料欄：(1) 指定時間序列名稱的 varchar 資料欄。每個資料集可以有多個時間序列；(2) 一個日期時間資料欄；以及 (3) 要預測的目標資料欄。此目標資料欄必須是整數或浮點數。如果您提供的資料集包含三個以上的資料欄，Amazon Redshift 會假設所有其他資料欄都是相關時間序列的一部分。請注意，相關的時間序列必須是整數或浮點數類型。如需相關時間序列的相關資訊，請參閱[使用相關時間序列資料集](https://docs.aws.amazon.com/forecast/latest/dg/related-time-series-datasets.html)。

TARGET column\$1name  
成為預測目標的資料欄名稱。該資料欄必須存在於 FROM 子句中。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::<account-id>:role/<role-name>' \$1  
使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 CREAT MODEL 命令時與叢集關聯的 IAM 角色。或者，您可以指定 IAM 角色的 ARN 以使用該角色。

AUTO ON  
開啟演算法和超參數選擇的 CREATE MODEL 自動探索。在建立預測模型時指定開啟，以使用 Forecast AutoPredictor，其中 Amazon Forecast 會將最佳演算法組合套用至資料集中的每個時間序列。

MODEL\$1TYPE FORECAST  
指定使用 FORECAST 來訓練模型。

S3\$1BUCKET 'amzn-s3-demo-bucket'  
您之前建立的 Amazon Simple Storage Service 儲存貯體名稱，用於在 Amazon Redshift 和 Amazon Forecast 之間共用訓練資料和成品。Amazon Redshift 會在卸載訓練資料之前，在此儲存貯體中建立一個子資料夾。訓練完成後，Amazon Redshift 會刪除建立的子資料夾及其內容。

HORIZON 整數  
預測模型可傳回的預測數量上限。模型一經過訓練，就無法再變更此整數。

FREQUENCY forecast\$1frequency  
指定您想要的預測細微程度。可用選項為 `Y | M | W | D | H | 30min | 15min | 10min | 5min | 1min`。如果您正在訓練預測模型，則需要此選項。

PERCENTILES 字串  
逗號分隔的字串，可指定用來訓練預測器的預測類型。預測類型可以是 0.01 到 0.99 之間的分位數，增量單位為 0.01 或更高。您也可以使用平均值指定平均預測。您最多可以指定五種預測類型。

下列範例說明如何建立簡單預測模型。

```
CREATE MODEL forecast_example
FROM forecast_electricity_
TARGET target 
IAM_ROLE 'arn:aws:iam::<account-id>:role/<role-name>'
AUTO ON 
MODEL_TYPE FORECAST
SETTINGS (S3_BUCKET 'amzn-s3-demo-bucket',
          HORIZON 24,
          FREQUENCY 'H',
          PERCENTILES '0.25,0.50,0.75,mean',
          S3_GARBAGE_COLLECT OFF);
```

建立預測模型後，您可以使用預測資料建立新資料表。

```
CREATE TABLE forecast_model_results as SELECT Forecast(forecast_example)
```

然後，您可以查詢新資料表以取得預測。

```
SELECT * FROM forecast_model_results
```

# CREATE PROCEDURE
<a name="r_CREATE_PROCEDURE"></a>

為目前的資料庫建立新的預存程序或取代現有的程序。

如需詳細資訊和範例，請參閱 [在 Amazon Redshift 中建立預存程序](stored-procedure-overview.md)。

## 所需權限
<a name="r_CREATE_PROCEDURE-privileges"></a>

您必須具有下列其中一種方式取得的許可，才能執行 CREATE OR REPLACE PROCEDURE：
+ 對於 CREATE PROCEDURE：
  + 超級使用者
  + 建立預存程序的結構描述上具有 CREATE 和 USAGE 權限的使用者
+ 對於 REPLACE PROCEDURE：
  + 超級使用者
  + 程序擁有者

## 語法
<a name="r_CREATE_PROCEDURE-synopsis"></a>

```
CREATE [ OR REPLACE ] PROCEDURE sp_procedure_name  
  ( [ [ argname ] [ argmode ] argtype [, ...] ] )
[ NONATOMIC ]
AS $$
  procedure_body
$$ LANGUAGE plpgsql
[ { SECURITY INVOKER | SECURITY DEFINER } ]
[ SET configuration_parameter { TO value | = value } ]
```

## Parameters
<a name="r_CREATE_PROCEDURE-parameters"></a>

 OR REPLACE   
此子句指定如果已有一個程序的名稱和輸入引數資料類型 (或簽章) 與此程序相同，則取代現有程序。您只能將程序取代為定義一組相同資料類型的新程序。  
如果您定義的程序與現有程序同名，但簽章不同，則會建立新程序。換言之，程序名稱是過載。如需詳細資訊，請參閱[多載程序名稱](stored-procedure-naming.md#stored-procedure-overloading-name)。

 *sp\$1procedure\$1name*   
程序的名稱。如果您指定結構描述名稱 (例如 **myschema.myprocedure**)，則會在指定的結構描述中建立程序。否則會在目前結構描述中建立程序。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
我們建議您在所有預存程序名稱前加上 `sp_`。Amazon Redshift 會保留預存程序名稱的 `sp_` 字首。您可以使用 `sp_` 字首，以確保您的預存程序不會與任何現有或未來的 Amazon Redshift 內建預存程序或函數名稱發生衝突。如需詳細資訊，請參閱[命名預存程序](stored-procedure-naming.md)。  
如果輸入引數的資料類型 (或簽章) 不同，您可以定義多個同名的程序。換言之，在此情況下程序名稱是過載。如需詳細資訊，請參閱[多載程序名稱](stored-procedure-naming.md#stored-procedure-overloading-name)

*[argname] [ argmode] argtype*   
引數名稱、引數模式和資料類型的清單。僅資料類型是必要的。名稱和模式是選用的，其位置可調換。  
引數模式可以是 IN、OUT 或 INOUT。預設值為 IN。  
您可以使用 OUT 和 INOUT 引數，從程序呼叫傳回一或多個值。有 OUT 或 INOUT 引數時，程序呼叫會傳回一個包含 *n* 欄的結果列，其中 *n* 是 OUT 或 INOUT 引數總數。  
INOUT 引數同時為輸入和輸出引數。*輸入引數*包括 IN 和 INOUT 引數，*輸出引數*包括 OUT 和 INOUT 引數。  
CALL 陳述式中不指定 OUT 引數。在預存程序 CALL 陳述式中，請指定 INOUT 引數。從巢狀呼叫傳遞和傳回值，以及傳回 `refcursor` 時，INOUT 引數可能很有用。如需 `refcursor` 類型的詳細資訊，請參閱[游標](c_PLpgSQL-statements.md#r_PLpgSQL-cursors)。  
引數資料類型可以是任何標準 Amazon Redshift 資料類型。此外，引數資料類型還可以是 `refcursor`。  
您最多可以指定 32 個輸入引數和 32 個輸出引數。

AS \$1\$1 *procedure\$1body* \$1\$1   
包圍要執行之程序的結構。常值關鍵字 AS \$1\$1 和 \$1\$1 是必要的。  
Amazon Redshift 會要求您使用稱為 \$1 符號引用的格式包圍程序中的陳述式。包圍範圍當中的任何內容都會原封不動傳遞。您不需要逸出任何特殊字元，因為字串的內容是逐字撰寫。  
使用 *\$1 符號引用*時，您會使用一組 \$1\$1 符號配對表示要執行之陳述式的開頭和結尾，如以下範例所示。  

```
$$ my statement $$
```
您也可以選擇在每組配對的兩個 \$1 符號之間指定字串來協助識別陳述式。您在包圍配對的開頭和結尾中使用的字串必須相同。此字串區分大小寫，且遵循與未加引號的識別碼相同的限制條件，不過後者不可包含 \$1 符號。下列範例使用字串 test。  

```
$test$ my statement $test$
```
此語法也適用於巢狀 \$1 符號引用。如需 \$1 符號引用的詳細資訊，請參閱 PostgreSQL 文件中的[辭典結構](https://www.postgresql.org/docs/9.0/sql-syntax-lexical.html)下的「\$1 符號引用的字串常數」。

 *procedure\$1body*   
一組有效的 PL/pgSQL 陳述式。PL/pgSQL 陳述式以程序性建構 (包括迴圈和條件式表達式) 來擴增 SQL 命令，以控制邏輯流程。大部分 SQL 命令可用於程序主體中，包括資料修改語言 (DML) (例如 COPY、UNLOAD 和 INSERT) 和資料定義語言 (DDL) (例如 CREATE TABLE)。如需詳細資訊，請參閱[PL/pgSQL 語言參考](c_pl_pgSQL_reference.md)。

LANGUAGE *plpgsql*  
語言值。指定 `plpgsql`。您必須具有語言的使用許可，才能使用 `plpgsql`。如需詳細資訊，請參閱[GRANT](r_GRANT.md)。

NONATOMIC  
在非原子交易模式中建立預存程序。NONATOMIC 模式會自動提交程序中的陳述式。此外，當 NONATOMIC 程序內部發生錯誤時，如果錯誤是由例外狀況區塊處理，則不會重新擲回錯誤。如需詳細資訊，請參閱[管理交易](stored-procedure-transaction-management.md)及[RAISE](c_PLpgSQL-statements.md#r_PLpgSQL-messages-errors)。  
將預存程序定義為 `NONATOMIC` 時，請考慮下列事項：  
+ 當您巢狀化預存程序呼叫時，必須以相同的交易模式建立所有程序。
+ 在 NONATOMIC 模式下建立程序時，不支援 `SECURITY DEFINER` 選項和 `SET configuration_parameter` 選項。
+ 處理隱含遞交時，任何已開啟的 (明確或隱含) 游標皆會自動關閉。因此，您必須在開始游標循環之前開啟明確的交易，以確保循環迭代中的任何 SQL 都不會隱含遞交。

SECURITY INVOKER \$1 SECURITY DEFINER  
指定 `NONATOMIC` 時不支援 `SECURITY DEFINER` 選項。  
程序的安全模式決定程序在執行時間的存取權限。程序必須有存取基礎資料庫物件的許可。  
若為 SECURITY INVOKER 模式，程序會使用呼叫程序的使用者的權限。使用者必須具有基礎資料庫物件的明確權限。預設為 SECURITY INVOKER。  
對於 SECURITY DEFINER 模式，程序會使用程序擁有者的權限。程序擁有者定義為在執行階段擁有該程序的使用者，而不一定是最初定義程序的使用者。呼叫程序的使用者必須有程序的執行權限，但不需要基礎物件的任何權限。

SET configuration\$1parameter \$1 TO value \$1 = value \$1  
指定 `NONATOMIC` 時不支援這些選項。  
SET 子句會在進入程序時將指定的 `configuration_parameter` 設為指定的值。當程序離開時，此子句會接著將 `configuration_parameter` 還原到先前的值。

## 使用須知
<a name="r_CREATE_PROCEDURE-usage"></a>

如果使用 SECURITY DEFINER 選項建立預存程序，則在從預存程序中調用 CURRENT\$1USER 函數時，Amazon Redshift 會傳回預存程序擁有者的使用者名稱。

## 範例
<a name="r_CREATE_PROCEDURE-examples"></a>

**注意**  
如果在執行這些範例時，您遇到類似以下的錯誤：  

```
ERROR: 42601: [Amazon](500310) unterminated dollar-quoted string at or near "$$
```
請參閱 [Amazon Redshift 中的預存程序概觀](stored-procedure-create.md)。

下列範例建立具有兩個輸入參數的程序。

```
CREATE OR REPLACE PROCEDURE test_sp1(f1 int, f2 varchar(20))
AS $$
DECLARE
  min_val int;
BEGIN
  DROP TABLE IF EXISTS tmp_tbl;
  CREATE TEMP TABLE tmp_tbl(id int);
  INSERT INTO tmp_tbl values (f1),(10001),(10002);
  SELECT min_val MIN(id) FROM tmp_tbl;
  RAISE INFO 'min_val = %, f2 = %', min_val, f2;
END;
$$ LANGUAGE plpgsql;
```

**注意**  
 當您撰寫預存程序時，我們建議您採用保護敏感值的最佳作法：  
 不要在預存程序邏輯中對任何敏感資訊進行硬式編碼。例如，請勿在預存程序主體的 CREATE USER 陳述式中指派使用者密碼。這會造成安全性風險，因為硬式編碼值可以記錄為目錄資料表中的結構描述資料。應改為透過參數將敏感值 (例如密碼) 當做引數傳遞給預存程序。  
如需預存程序的相關資訊，請參閱 [CREATE PROCEDURE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_PROCEDURE.html) 和[在 Amazon Redshift 中建立預存程序](https://docs.aws.amazon.com/redshift/latest/dg/stored-procedure-overview.html)。如需目錄資料表的相關資訊，請參閱[系統目錄資料表](https://docs.aws.amazon.com/redshift/latest/dg/c_intro_catalog_views.html)。

下列範例建立具有一個 IN 參數、一個 OUT 參數和一個 INOUT 參數的程序。

```
CREATE OR REPLACE PROCEDURE test_sp2(f1 IN int, f2 INOUT varchar(256), out_var OUT varchar(256))
AS $$
DECLARE
  loop_var int;
BEGIN
  IF f1 is null OR f2 is null THEN
    RAISE EXCEPTION 'input cannot be null';
  END IF;
  DROP TABLE if exists my_etl;
  CREATE TEMP TABLE my_etl(a int, b varchar);
    FOR loop_var IN 1..f1 LOOP
        insert into my_etl values (loop_var, f2);
        f2 := f2 || '+' || f2;
    END LOOP;
  SELECT INTO out_var count(*) from my_etl;
END;
$$ LANGUAGE plpgsql;
```

下列範例會建立使用 `SECURITY DEFINER` 參數的程序。此程序會使用擁有程序之使用者的權限來執行。

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_definer()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
```

下列範例會建立使用 `SECURITY INVOKER` 參數的程序。此程序會使用執行程序之使用者的權限來執行。

```
CREATE OR REPLACE PROCEDURE sp_get_current_user_invoker()
AS $$
DECLARE curr_user varchar(250);
BEGIN
  SELECT current_user INTO curr_user;
  RAISE INFO '%', curr_user;
END;
$$ LANGUAGE plpgsql
SECURITY INVOKER;
```

# CREATE RLS POLICY
<a name="r_CREATE_RLS_POLICY"></a>

建立新的資料列層級安全性政策，以提供資料庫物件的精細存取權。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以建立政策。

## 語法
<a name="r_CREATE_RLS_POLICY-synopsis"></a>

```
CREATE RLS POLICY { policy_name | database_name.policy_name }
[ WITH (column_name data_type [, ...]) [ [AS] relation_alias ] ]
USING ( using_predicate_exp )
```

## Parameters
<a name="r_CREATE_RLS_POLICY-parameters"></a>

 *policy\$1name*   
政策的名稱。

database\$1name  
要建立政策的資料庫名稱。您可以在連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫上建立政策。

WITH (*column\$1name data\$1type [, ...]*)   
指定參考政策附加資料表資料欄的 *column\$1name* 和 *data\$1type*。  
只有當 RLS 政策未參考任何附加政策的資料表資料欄時，您才可以省略 WITH 子句。

AS *relation\$1alias*  
為要附加 RLS 政策的資料表指定選擇性別名。

USING (* using\$1predicate\$1exp *)  
指定套用至查詢中 WHERE 子句的篩選條件。Amazon Redshift 會在查詢層級使用者述詞之前套用政策述詞。例如，**current\$1user = ‘joe’ and price > 10** 會限制 Joe 只能查看價格大於 \$110 的記錄。

如需在 Amazon Redshift 聯合許可目錄上使用 CREATE RLS POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

## 使用須知
<a name="r_CREATE_RLS_POLICY-usage"></a>

使用 CREATE RLS POLICY 陳述式時，請注意以下內容：
+ Amazon Redshift 支援篩選，這些篩選可以是查詢中 WHERE 子句的一部分。
+ 所有附加至資料表的政策都必須使用相同的資料表別名建立。
+ 您必須使用 GRANT 和 REVOKE 陳述式，明確授予及撤銷參考查閱資料表之 RLS 政策的 SELECT 許可。查閱資料表是在政策定義中使用的資料表物件。如需詳細資訊，請參閱[GRANT](r_GRANT.md)及[REVOKE](r_REVOKE.md)。
+ Amazon Redshift 資料列層級安全性不支援在政策定義中使用下列物件類型：目錄資料表、跨資料庫關聯性、外部資料表、一般檢視、後期繫結檢視、開啟 RLS 政策的資料表和暫存資料表。

## 範例
<a name="r_CREATE_RLS_POLICY-examples"></a>

以下範例會建立稱為 policy\$1concerts 的 RLS 政策。此政策適用於稱為 catgroup 的 VARCHAR(10) 欄，並將 USING 篩選器設定為僅傳回 catgroup 值為 `'Concerts'` 的列。

```
CREATE RLS POLICY policy_concerts
WITH (catgroup VARCHAR(10))
USING (catgroup = 'Concerts');
```

如需使用 RLS 政策的完整範例，請參閱 [資料列層級安全完整範例](t_rls-example.md)。

# CREATE ROLE
<a name="r_CREATE_ROLE"></a>

建立作為權限集合的新自訂角色。如需 Amazon Redshift 系統定義角色的清單，請參閱 [Amazon Redshift 系統定義角色](r_roles-default.md)。查詢 [SVV\$1ROLES](r_SVV_ROLES.md) 以檢視叢集或工作群組中目前建立的角色。

可以建立的角色數量有配額限制。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配額和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

## 所需的許可
<a name="r_CREATE_ROLE-privileges"></a>

以下是 CREATE ROLE 所需的權限。
+ 超級使用者
+ 具有 CREATE ROLE 權限的使用者

## 語法
<a name="r_CREATE_ROLE-synopsis"></a>

```
CREATE ROLE role_name
[ EXTERNALID external_id ]
```

## Parameters
<a name="r_CREATE_ROLE-parameters"></a>

*role\$1name*  
角色的名稱。角色名稱必須是唯一的，且不能與任何使用者名稱相同。角色名稱不能是保留字。  
超級使用者或擁有 CREATE ROLE 權限的一般使用者可以建立角色。如果使用者不是超級使用者，但使用者已被授予 WITH GRANT OPTION 角色和 ALTER 權限的 USAGE 權限，就可以將此角色授予任何人。

EXTERNALID *external\$1id*  
與身分提供者相關聯的角色識別碼。如需詳細資訊，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

## 範例
<a name="r_CREATE_ROLE-examples"></a>

下列範例會建立 `sample_role1` 角色。

```
CREATE ROLE sample_role1;
```

下列範例會使用與身分提供者相關聯的外部 ID 來建立角色 `sample_role1`。

```
CREATE ROLE sample_role1 EXTERNALID "ABC123";
```

# CREATE SCHEMA
<a name="r_CREATE_SCHEMA"></a>

為目前資料庫定義新的結構描述。

## 所需權限
<a name="r_CREATE_SCHEMA-privileges"></a>

以下是 CREATE SCHEMA 所需的權限：
+ 超級使用者
+ 具有 CREATE SCHEMA 權限的使用者

## 語法
<a name="r_CREATE_SCHEMA-synopsis"></a>

```
CREATE SCHEMA [ IF NOT EXISTS ] schema_name [ AUTHORIZATION username ]
           [ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ]

CREATE SCHEMA AUTHORIZATION username[ QUOTA {quota [MB | GB | TB] | UNLIMITED} ] [ schema_element [ ... ] ]
```

## Parameters
<a name="r_CREATE_SCHEMA-parameters"></a>

 IF NOT EXISTS   
此子句會指出，若指定的結構描述已存在，則命令不應進行任何變更，且應傳回結構描述存在的訊息，而不是在發生錯誤的情況下終止。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 CREATE SCHEMA 嘗試建立已存在的結構描述而失敗。

 *schema\$1name*   
新結構描述的名稱。結構描述名稱不可以是 `PUBLIC`。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
[search\$1path](r_search_path.md) 組態參數中結構描述的清單會決定，在沒有結構描述名稱的情況下參考名稱相同的物件時，這些物件的優先順序。

AUTHORIZATION   
將所有權提供給指定使用者的子句。

 *username*   
結構描述擁有者的名稱。

 *schema\$1element*   
要在結構描述內建立的一個或多個物件的定義。

QUOTA  
所指定之結構描述可以使用的磁碟空間數上限。這個空間是集體磁碟使用量。它包含所有永久資料表、所指定之結構描述下的具體化檢視，以及在每個計算節點上具有 ALL 分佈之所有資料表的複本。結構描述配額不會將暫時資料表納入考量，此暫時資料表是作為暫時命名空間或結構描述一部分而建立的。  
若要檢視設定的結構描述配額，請參閱 [SVV\$1SCHEMA\$1QUOTA\$1STATE](r_SVV_SCHEMA_QUOTA_STATE.md)。  
若要檢視超出結構描述配額的記錄，請參閱 [STL\$1SCHEMA\$1QUOTA\$1VIOLATIONS](r_STL_SCHEMA_QUOTA_VIOLATIONS.md)。  
Amazon Redshift 會將選取的值轉換為 MB。GB 是您未指定值時的預設測量單位。  
您必須是資料庫超級使用者，才能設定和變更結構描述配額。不是超級使用者，但具有 CREATE SCHEMA 許可的使用者可以建立具有已定義配額的結構描述。當您在未定義配額的情況下建立結構描述時，結構描述會有無限的配額。當您將配額設為低於結構描述所使用的目前值時，除非您釋放磁碟空間，否則 Amazon Redshift 不允許進一步擷取。DELETE 陳述式會從資料表刪除資料，並只在 VACUUM 執行時，才會釋出磁碟空間。  
Amazon Redshift 會在確認交易之前檢查每筆交易是否存在配額違規情況。Amazon Redshift 會根據設定的配額，檢查每個已修改結構描述的大小 (結構描述中所有資料表使用的磁碟空間)。因為配額違規檢查發生在交易結束時，所以在確定之前，大小限制可以暫時超過交易內的配額。當交易超過配額時，Amazon Redshift 會停止交易、禁止後續導入，並還原所有變更，直到您釋放磁碟空間為止。由於背景 VACUUM 和內部清除，有可能在交易取消之後您檢查結構描述時結構描述不是完整的。  
在例外情況下，Amazon Redshift 會忽略配額違規，並在特定情況下遞交交易。Amazon Redshift 會針對僅由下列一或多個陳述式組成的交易執行此操作，而且在相同交易中沒有 INSERT 或 COPY 擷取陳述式：  
+ DELETE
+ TRUNCATE
+ VACUUM
+ DROP TABLE
+ 只在將資料從完整結構描述移到另一個非完整結構描述時，ALTER TABLE APPEND 才適用

 *UNLIMITED*   
Amazon Redshift 不會限制結構描述總大小的增長。

## 限制
<a name="r_CREATE_SCHEMA-limit"></a>

Amazon Redshift 會對結構描述強制實施下列限制。
+ 每個資料庫最多 9900 個結構描述。

## 範例
<a name="r_CREATE_SCHEMA-examples"></a>

下列範例會建立名為 US\$1SALES 的結構描述，並將所有權提供給使用者 DWUSER。

```
create schema us_sales authorization dwuser;
```

下列範例會建立名為 US\$1SALES 的結構描述、將擁有權提供給使用者 DWUSER，並將配額設定為 50 GB。

```
create schema us_sales authorization dwuser QUOTA 50 GB;
```

若要檢視新的結構描述，請查詢 PG\$1NAMESPACE 目錄資料表，如下所示。

```
select nspname as schema, usename as owner
from pg_namespace, pg_user
where pg_namespace.nspowner = pg_user.usesysid
and pg_user.usename ='dwuser';

   schema |  owner
----------+----------
 us_sales | dwuser
(1 row)
```

下列範例會建立 US\$1SALES 結構描述，或不執行任何動作，並於該結構描述已存在時傳回訊息。

```
create schema if not exists us_sales;
```

# CREATE TABLE
<a name="r_CREATE_TABLE_NEW"></a>

在目前資料庫中建立新的資料表。您可以定義資料欄清單，每個資料欄都會保留不同類型的資料。資料表的擁有者是 CREATE TABLE 命令的發行者。

## 所需權限
<a name="r_CREATE_TABLE-privileges"></a>

以下是 CREATE TABLE 所需的權限：
+ 超級使用者
+ 具有 CREATE TABLE 權限的使用者

## 語法
<a name="r_CREATE_TABLE_NEW-synopsis"></a>

```
CREATE [ [LOCAL ] { TEMPORARY | TEMP } ] TABLE
[ IF NOT EXISTS ] table_name
( { column_name data_type [column_attributes] [ column_constraints ]
  | table_constraints
  | LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] }
  [, ... ]  )
[ BACKUP { YES | NO } ]
[table_attributes]

where column_attributes are:
  [ DEFAULT default_expr ]
  [ IDENTITY ( seed, step ) ]
  [ GENERATED BY DEFAULT AS IDENTITY ( seed, step ) ]
  [ ENCODE encoding ]
  [ DISTKEY ]
  [ SORTKEY ]
  [ COLLATE { CASE_SENSITIVE | CS | CASE_INSENSITIVE | CI } ]

and column_constraints are:
  [ { NOT NULL | NULL } ]
  [ { UNIQUE  |  PRIMARY KEY } ]
  [ REFERENCES reftable [ ( refcolumn ) ] ]

and table_constraints  are:
  [ UNIQUE ( column_name [, ... ] ) ]
  [ PRIMARY KEY ( column_name [, ... ] )  ]
  [ FOREIGN KEY (column_name [, ... ] ) REFERENCES reftable [ ( refcolumn ) ]


and table_attributes are:
  [ DISTSTYLE { AUTO | EVEN | KEY | ALL } ]
  [ DISTKEY ( column_name ) ]
  [ [COMPOUND | INTERLEAVED ] SORTKEY ( column_name [,...]) |  [ SORTKEY AUTO ] ]
  [ ENCODE AUTO ]
```

## Parameters
<a name="r_CREATE_TABLE_NEW-parameters"></a>

LOCAL   
選用。雖然陳述式中可接受此關鍵字，但是在 Amazon Redshift 中沒有作用。

TEMPORARY \$1 TEMP   
建立臨時資料表的關鍵字，只能在目前工作階段中看見。資料表會在建立所在的工作階段結束時自動捨棄。臨時資料表可與永久資料表同名。臨時資料表是以不同的工作階段專屬結構描述建立 (您無法指定此結構描述的名稱)。此臨時結構描述會成為搜尋路徑中的第一個結構描述，因此，除非您以結構描述名稱限定資料表名稱來存取永久資料表，否則臨時資料表的優先順序高於永久資料表。如需結構描述和優先順序的相關資訊，請參閱 [search\$1path](r_search_path.md)。  
根據預設，資料庫使用者依其 PUBLIC 群組中的自動成員資格，具有建立臨時資料表的許可。若要拒絕使用者的此權限，請撤銷 PUBLIC 群組的 TEMP 權限，然後明確將 TEMP 權限僅授予特定使用者或使用者群組。

IF NOT EXISTS  
此子句會指出，若指定的資料表已存在，則命令不應進行任何變更，且應傳回資料表存在的訊息，而不是在發生錯誤的情況下停止。請注意，現有資料表可能與這裡建立的資料表完全不一樣；只有資料表名稱進行比較。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 CREATE TABLE 嘗試建立已存在的資料表而失敗。

 *table\$1name*   
要建立的資料表名稱。  
若您指定 '\$1' 開頭的資料表名稱，所建立的資料表會是臨時資料表。以下是範例：  

```
create table #newtable (id int);
```
您也可以使用 '\$1 '參考資料表。例如：  

```
select * from #newtable;
```
資料表名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。Amazon Redshift 會依節點類型強制執行每個叢集的資料表數目配額限制，包括使用者定義的臨時資料表，以及 Amazon Redshift 在查詢處理或系統維護期間建立的臨時資料表。或者，資料表名稱也可透過資料庫和結構描述名稱來限定。在以下範例中，資料庫名稱為 `tickit`，結構描述名稱為 `public`，而資料表名稱為 `test`。  

```
create table tickit.public.test (c1 int);
```
如果資料庫或結構描述不存在，則不會建立資料表，而且陳述式會傳回錯誤。您無法在系統資料庫 `template0`、`template1`、`padb_harvest` 或 `sys:internal` 中建立資料表或視觀表。  
若提供結構描述名稱，則會在該結構描述中建立新資料表 (假設建立者具有存取結構描述的權限)。資料表名稱對於該結構描述來說必須是唯一的。如果未指定結構描述，則會使用目前資料庫結構描述建立資料表。如果您要建立臨時資料表，就不能指定結構描述名稱，因為臨時資料表會採用特殊結構描述。  
若臨時資料表是在不同的工作階段中建立的話，在同一個資料庫中可同時有多個同名的臨時資料表存在，因為資料表會指派至不同的結構描述。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

 *column\$1name*   
要在新資料表中建立的資料欄名稱。資料欄名稱的長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。您可以使用 UTF-8 多位元組字元，最長可達 4 個位元組。單一資料表中可定義的資料欄數目上限為 1,600 個。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  
若您要建立「寬資料表」，則務必注意，在載入和查詢處理期間，您的資料欄清單未超過中繼結果的資料列寬度界限。如需詳細資訊，請參閱[使用須知](#r_CREATE_TABLE_usage)。

 *data\$1type*   
要建立之資料欄的資料類型。若是 CHAR 和 VARCHAR 資料欄，您可以改用 MAX 關鍵字，而不宣告長度上限。MAX 會將 CHAR 的長度上限設定為 4,096 個位元組，或將 VARCHAR 的長度上限設定為 65535 個位元組。GEOMETRY 物件的大小上限是 1,048,447 位元組。  
如需有關 Amazon Redshift 支援資料類型的資訊，請參閱 [資料類型](c_Supported_data_types.md)。

DEFAULT *default\$1expr*   <a name="create-table-default"></a>
此子句會指派資料欄的預設資料值。*default\$1expr* 的資料類型必須符合資料欄的資料類型。DEFAULT 值必須是無變數的表達式。不允許子查詢、目前資料表中其他資料欄的交叉參考，以及使用者定義的功能。  
*default\$1expr* 表達式是在未指定資料欄值的任何 INSERT 操作中使用。若未指定預設值，則資料欄的預設值為 null。  
若在既定資料欄清單上進行的 COPY 操作省略有 DEFAULT 值的資料欄，則 COPY 命令會插入 *default\$1expr* 的值。

IDENTITY(*seed*, *step*)   <a name="identity-clause"></a>
此子句會指出資料欄是 IDENTITY 資料欄。IDENTITY 資料欄包含唯一的自動產生值。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。  
當您使用 `INSERT` 或 `INSERT INTO [tablename] VALUES()` 陳述式新增資料列時，這些值會從指定為 *seed* 的值開始，並依指定為 *step* 的數字遞增。  
使用 `INSERT INTO [tablename] SELECT * FROM` 或 `COPY` 陳述式載入資料表時，會並行載入資料並將其分發至節點片段。為確保身分值是唯一的，Amazon Redshift 會在建立身分值時略過一些值。身分值是唯一的，但順序可能不符合來源檔案中的順序。

GENERATED BY DEFAULT AS IDENTITY(*seed*, *step*)   <a name="identity-generated-bydefault-clause"></a>
指定資料欄是預設 IDENTITY 資料欄的子句，其可讓您自動將唯一值指派給資料欄。IDENTITY 資料欄的資料類型必須是 INT 或 BIGINT。當您新增沒有值的資料列時，這些值會從指定為 *seed* 的值開始，並依指定為 *step* 的數字遞增。如需如何產生值的詳細資訊，請參閱[IDENTITY](#identity-clause)。  
此外，在 INSERT、UPDATE 或 COPY 期間，您可以提供沒有 EXCLIIT\$1IDS 的值。Amazon Redshift 會使用該值插入身分資料欄，而不是使用系統產生的值。此值可以是複本、小於種子的值，或是介於步驟值之間的值。Amazon Redshift 不會檢查資料欄中的值是否是唯一的。提供一值並不會影響下一個系統產生的值。  
如果您需要資料欄中的唯一性，請不要新增複本值。改為新增小於種子或介於步驟值之間的唯一值。
請記住下列有關預設身分資料欄的事項：  
+ 預設身分資料欄為 NOT NULL。無法插入 NULL。
+ 若要將產生的值插入至預設身分資料欄，請使用關鍵字 `DEFAULT`。

  ```
  INSERT INTO tablename (identity-column-name) VALUES (DEFAULT);
  ```
+ 置換預設身分資料欄的值並不會影響下一個產生的值。
+ 您無法利用 ALTER TABLE ADD COLUMN 陳述式來新增預設身分資料欄。
+ 您可以利用 ALTER TABLE APPEND 陳述式來附加預設身分資料欄。

ENCODE *encoding*   
資料欄的壓縮編碼。ENCODE AUTO 是資料表的預設值。Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。如果您為資料表中的任何資料欄指定壓縮編碼，資料表就不會再設定為 ENCODE AUTO。Amazon Redshift 不再自動管理資料表中所有資料欄的壓縮編碼。您可以為資料表指定 ENCODE AUTO 選項，讓 Amazon Redshift 自動管理資料表中所有資料欄的壓縮編碼。  
  
Amazon Redshift 會自動將初始壓縮編碼指派給您未指定壓縮編碼的資料欄，如下所示：  
+ 暫時資料表中的所有資料欄預設都會有指派的 RAW 壓縮。
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY 或 GEOGRAPHY 資料類型的資料行會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR、VARCHAR 或 VARBYTE 的資料欄會有指派的 LZO 壓縮。
若您不想要壓縮資料欄，請明確指定 RAW 編碼。
 支援以下 [compression encodings](c_Compression_encodings.md#compression-encoding-list)：  
+ AZ64
+ BYTEDICT
+ DELTA
+ DELTA32K
+ LZO
+ MOSTLY8
+ MOSTLY16
+ MOSTLY32
+ RAW (無壓縮)
+ RUNLENGTH
+ TEXT255
+ TEXT32K
+ ZSTD

DISTKEY  
此關鍵字會指定資料欄是資料表的分佈索引鍵。資料表中只能有一個資料欄是分佈索引鍵。您可以在資料欄名稱後面使用 DISTKEY 關鍵字，或使用 DISTKEY (*column\$1name*) 語法使其成為資料表定義的一部分。兩種方法的效果一樣。如需詳細資訊，請參閱本主題稍後的 DISTSTYLE 參數。  
分佈索引鍵資料欄的資料類型可以是：BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ、CHAR 或 VARCHAR。

SORTKEY  
此關鍵字會指定資料欄是資料表的排序索引鍵。當資料載入資料表時，資料會依指定為排序索引鍵的一個或多個資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵，或使用 SORTKEY (*column\$1name* [, ...]) 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。此語法只會建立複合排序索引鍵。  
您最多可為每個資料表定義 400 個 SORTKEY 資料欄。  
排序索引鍵資料欄的資料類型可以是：BOOLEAN、REAL、DOUBLE PRECISION、SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ、CHAR 或 VARCHAR。

COLLATE \$1 CASE\$1SENSITIVE \$1 CS \$1 CASE\$1INSENSITIVE \$1 CI \$1  
指定資料欄上的字串搜尋或比較是區分大小寫或不區分大小寫的子句。預設值與資料庫目前的區分大小寫設定相同。  
僅字串型資料類型支援 COLLATE，包括 CHAR、VARCHAR 和 SUPER 資料欄中的字串值。如需不區分大小寫的 SUPER 資料查詢詳細資訊，請參閱 [不區分大小寫的查詢](query-super.md#case-insensitive-super-queries)。  
若要尋找資料庫定序資訊，請使用下列命令：  

```
SELECT db_collation();
                     
db_collation
----------------
 case_sensitive
(1 row)
```
CASE\$1SENSITIVE 和 CS 可互換，並產生相同的結果。同樣地，CASE\$1INSENSITIVE 和 CI 可互換，並產生相同的結果。

NOT NULL \$1 NULL   
NOT NULL 會指定不允許資料欄包含 null 值。NULL 是預設值，指出資料欄可接受 null 值。IDENTITY 資料欄預設會宣告為 NOT NULL。

UNIQUE  
此關鍵字會指定資料欄只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同，但多了可橫跨多個資料欄的額外功能。若要定義唯一資料表限制條件，請使用 UNIQUE (*column\$1name* [, ... ]) 語法。  
唯一限制條件僅供參考，系統不會強制執行它們。

PRIMARY KEY  
此關鍵字會指定資料欄是資料表的主索引鍵。只能使用資料欄定義將一個資料欄定義為主索引鍵。若要定義具有多資料欄主索引鍵的資料表限制條件，請使用 PRIMARY KEY (*column\$1name* [, ... ]) 語法。  
將資料欄識別為主索引鍵即可提供有關結構描述設計的中繼資料。主索引鍵表示，其他資料表可倚賴這組資料欄做為資料列的唯一識別碼。一個資料表中可指定一個主索引鍵，無論是資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄，這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。  
主索引鍵也會定義為 NOT NULL。  
主索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

References *reftable* [ ( *refcolumn* ) ]  
此子句會指定外部索引鍵限制條件，表示資料欄包含的值只能是符合參考資料表中某一資料列之參考資料欄的值。參考資料欄應為參考資料表中唯一或主索引鍵限制條件的資料欄。  
 外部索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

LIKE *parent\$1table* [ \$1 INCLUDING \$1 EXCLUDING \$1 DEFAULTS ]   <a name="create-table-like"></a>
此子句會指定現有資料表，新資料表會自動從該資料表複製資料欄名稱、資料類型及 NOT NULL 限制條件。新資料表和父資料表是分開的，對父資料表所做的變更不會套用至新資料表。複製資料欄定義的預設表達式只會在指定了 INCLUDING DEFAULTS 時複製。預設行為是執行預設表達式，如此一來，新資料表中所有資料欄的預設值都是 null。  
使用 LIKE 選項建立的資料表不會繼承主索引鍵和外部索引鍵限制條件。LIKE 資料表會繼承分佈樣式、排序索引鍵、BACKUP 及 NULL 屬性，但您無法明確設定這些屬性在 CREATE TABLE ... LIKE 陳述式。

BACKUP \$1 YES \$1 NO \$1   <a name="create-table-backup"></a>
此子句會指定資料表是否應包含在自動化和手動叢集快照中。  
若是像臨時資料表這類不會包含重要資料的資料表，指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間，並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響，因此指定了 BACKUP NO 的資料表會在節點發生故障時還原。預設值為 BACKUP YES。  
RA3 佈建叢集和 Amazon Redshift Serverless 工作群組不支援無備份資料表。在 RA3 叢集或無伺服器工作群組中標記為無備份的資料表會視為永久資料表，且在拍攝快照時一律會備份，並一律在從快照還原時還原。為了避免無備份資料表的快照成本，請在拍攝快照之前截斷這些資料表。

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
定義整個資料表的資料分佈樣式的關鍵字。Amazon Redshift 會根據資料表上指定的分佈樣式，將資料表的資料列分散到運算節點。預設值為 AUTO。  
您為資料表選取的分佈樣式會影響資料庫的整體效能。如需詳細資訊，請參閱[分配資料以實現查詢最佳化](t_Distributing_data.md)。可能的分佈樣式如下：  
+ AUTO：Amazon Redshift 會根據資料表資料來指派最佳分佈樣式。例如，如果指定 AUTO 分佈樣式，Amazon Redshift 一開始會將 ALL 分佈樣式指派給小型資料表。當資料表變大時，Amazon Redshift 可能會將分佈樣式變更為 KEY，並選擇主索引鍵 (或複合主鍵的資料欄) 作為 DISTKEY。如果資料表變大，並且沒有任何資料欄適合作為 DISTKEY，則 Amazon Redshift 會將分佈樣式變更為 EVEN。分佈樣式的變更會發生在背景中，對使用者查詢的影響最小。

  若要檢視套用至資料表的分佈樣式，請查詢 PG\$1CLASS 系統目錄資料表。如需詳細資訊，請參閱[檢視分佈樣式](viewing-distribution-styles.md)。
+ EVEN：資料表中的資料會採循環分佈的方式，均勻分配到叢集中的各個節點。資料列 ID 會用來決定分佈，並且將大致相同的資料列數分佈到每個節點。
+ KEY：資料是依 DISTKEY 資料欄中的值分佈。當您將聯結資料表的聯結資料欄設定為分佈索引鍵時，兩個資料表的聯結資料列會在運算節點上並存。資料並存時，最佳化工具就能更有效率地執行聯結。若您指定 DISTSTYLE KEY，則必須命名 DISTKEY 資料欄，無論是資料表或做為資料欄定義的一部分皆可。如需詳細資訊，請參閱本主題前段的 DISTKEY 參數。
+  ALL：整個資料表的副本分佈至每個節點。此分佈樣式可確保每個節點上都有任何聯結所需的所有資料列，但儲存空間的需求也會倍增，並且會增加資料表的負載和維護次數。ALL 分佈在 KEY 分佈不適用的情況下搭配特定維度資料表使用時，可改善執行時間，但必須在效能提升與維護成本之間進行權衡。

DISTKEY (*column\$1name*)  
此限制條件會指定要做為資料表分佈索引鍵的資料欄。您可以在資料欄名稱後面使用 DISTKEY 關鍵字，或使用 DISTKEY (*column\$1name*) 語法使其成為資料表定義的一部分。兩種方法的效果一樣。如需詳細資訊，請參閱本主題前段的 DISTSTYLE 參數。

[COMPOUND \$1 INTERLEAVED ] SORTKEY (* column\$1name* [,...]) \$1 [ SORTKEY AUTO ]  
指定資料表的一個或多個排序索引鍵。當資料載入資料表時，資料會依指定為排序索引鍵的資料欄排序。您可以在資料欄名稱後面使用 SORTKEY 關鍵字指定單欄排序索引鍵，或使用 `SORTKEY (column_name [ , ... ] )` 語法指定一個或多個資料欄做為資料表的排序索引鍵資料欄。  
您也可以選擇指定 COMPOUND 或 INTERLEAVED 排序樣式。如果您使用資料欄指定 SORTKEY，則預設值為 COMPOUND。如需詳細資訊，請參閱[排序索引鍵](t_Sorting_data.md)。  
若沒有指定任何排序索引鍵選項，則預設值為 AUTO。  
您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄或 8 個 INTERLEAVED SORTKEY 資料欄。    
AUTO  
指定 Amazon Redshift 會根據資料表資料指派最佳排序索引鍵。例如，如果指定 AUTO 排序索引鍵，Amazon Redshift 一開始就不會為資料表指派任何排序索引鍵。如果 Amazon Redshift 判斷排序索引鍵可以改善查詢效能，那麼 Amazon Redshift 可能會在變更資料表的排序索引鍵。資料表的實際排序是透過自動資料表排序來完成的。如需詳細資訊，請參閱[自動資料表排序](t_Reclaiming_storage_space202.md#automatic-table-sort)。  
Amazon Redshift 不會修改已具有排序或分佈索引鍵的資料表。有一個例外情況是，如果資料表具有從未在 JOIN 中使用過的分佈索引鍵，則當 Amazon Redshift 判斷有更好的索引鍵時，則索引鍵可能會變更。  
若要檢視資料表的排序索引鍵，請查詢 SVV\$1TABLE\$1INFO 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1TABLE\$1INFO](r_SVV_TABLE_INFO.md)。若要檢視資料表的 Amazon Redshift Advisor 建議，請查詢 SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS 系統目錄檢視。如需詳細資訊，請參閱[SVV\$1ALTER\$1TABLE\$1RECOMMENDATIONS](r_SVV_ALTER_TABLE_RECOMMENDATIONS.md)。若要檢視 Amazon Redshift 所採取的動作，請查詢 SVL\$1AUTO\$1WORKER\$1ACTION 系統目錄檢視。如需詳細資訊，請參閱[SVL\$1AUTO\$1WORKER\$1ACTION](r_SVL_AUTO_WORKER_ACTION.md)。  
COMPOUND  
指定使用複合索引鍵排序資料，該索引鍵是由列出的所有資料欄組成，並依其列出順序排列。當查詢依據排序資料欄的順序掃描資料列時，複合排序索引鍵最實用。當查詢依賴次要排序資料欄時，使用複合索引鍵排序的效能優勢就會降低。您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄。  
INTERLEAVED  
指定使用交錯排序索引鍵排序資料。最多可以為交錯排序索引鍵指定八個資料欄。  
交錯排序索引鍵對排序索引鍵中的每個資料欄 (或資料欄子集) 都提供相等的權重，所以查詢不會取決於排序索引鍵中資料欄的順序。當查詢使用一個或多個次要排序資料欄時，交錯排序可大幅改善查詢效能。交錯排序在執行資料載入和清空操作時，會產生很少的額外負荷成本，  
不要在具有依序增加屬性 (如身分資料欄、日期或時間戳記) 的資料欄上使用交錯排序索引鍵。

ENCODE AUTO   
讓 Amazon Redshift 能夠自動調整資料表中所有資料欄的編碼類型，以最佳化查詢效能。ENCODE AUTO 會保留您在建立資料表時指定的初始編碼類型。然後，如果 Amazon Redshift 判斷新的編碼類型可以改善查詢效能，Amazon Redshift 就可以變更資料表資料欄的編碼類型。如果您沒有在資料表中的任何資料欄上指定編碼類型，ENCODE AUTO 就是預設值。

UNIQUE ( *column\$1name* [,...] )  
此限制條件會指定，資料表中一個包含一個或多個資料欄的群組只能包含唯一值。唯一資料表限制條件的行為與資料欄限制條件的行為相同，但多了可橫跨多個資料欄的額外功能。在唯一限制條件的細節中，不會將 null 值視為相等。每個唯一資料表限制條件必須命名一組資料欄，這組資料欄有別於為資料表所定義的任何其他唯一或主索引鍵限制條件所命名的資料欄組。  
 唯一限制條件僅供參考，系統不會強制執行它們。

PRIMARY KEY ( *column\$1name* [,...] )  
此限制條件會指定，資料表中的一個或多個資料欄只能包含唯一的 (不重複) 非 null 值。將一組資料欄識別為主索引鍵也會提供有關結構描述設計的中繼資料。主索引鍵表示，其他資料表可倚賴這組資料欄做為資料列的唯一識別碼。一個資料表中可指定一個主索引鍵，無論是單一資料欄限制條件或資料表限制條件都可行。主索引鍵限制條件應命名一組資料欄，這組資料欄有別於由為相同資料表所定義的任何唯一限制條件命名的其他資料欄組。  
 主索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

FOREIGN KEY ( *column\$1name* [, ... ] ) REFERENCES *reftable* [ ( *refcolumn* ) ]   
此限制條件會指定外部索引鍵限制條件，其要求新資料表中一個包含一個或多個資料欄的群組包含的值，只能是符合參考資料表中某一資料列之參考資料欄的值。如果省略 *refcolumn*，則會使用 *reftable* 的主索引鍵。參考資料欄必須為參考資料表中唯一或主索引鍵限制條件的資料欄。  
外部索引鍵條件限制僅供參考。系統不會強制執行這些限制，不過規劃器會使用這些限制。

## 使用須知
<a name="r_CREATE_TABLE_usage"></a>

唯一性、主索引鍵和外部索引鍵限制僅供參考，Amazon Redshift 不會在您填入資料表時*強制執行它們*。例如，如果您將資料插入具有相依性的資料表中，即使插入違反限制也可以成功執行。儘管如此，主索引鍵和外部索引鍵仍會做為規劃提示，而且如果您的 ETL 程序或應用程式中的某些其他程序強制其完整性，則應該宣告它們。如需如何捨棄具有相依性之資料表的資訊，請參閱 [DROP TABLE](r_DROP_TABLE.md)。

### 限制和配額
<a name="r_CREATE_TABLE_usage-limits"></a>

建立資料表時，請考量下列限制。
+ 根據節點類型，叢集中的資料表數目上限有所限制。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。
+ 資料表名稱的字元數上限為 127 個。
+ 單一資料表中可定義的資料欄數目上限為 1,600 個。
+ 單一資料表中可定義的 SORTKEY 資料欄數目上限為 400 個。

### 欄位層級設定和資料表層級設定的摘要
<a name="r_CREATE_TABLE_usage-summary_of_settings"></a>

 在資料欄層級或資料表層級可設定數種屬性和設定。某些情況下，在資料欄層級或資料表層級設定屬性或限制條件的效果相同。而有些情況下則會產生不同的結果。

 下列清單摘要說明資料欄層級和資料表層級設定：

DISTKEY  
在資料欄層級或資料表層級設定的效果並無差異。  
如果設定了 DISTKEY，無論是在資料欄層級或資料表層級，DISTSTYLE 都必須設定為 KEY，或完全不設定。DISTSTYLE 只能在資料表層級設定。

SORTKEY  
若在資料欄層級設定，SORTKEY 必須是單一資料欄。若在資料表層級設定 SORTKEY，可由一個或多個資料欄組成複合或交錯的複合排序索引鍵。

COLLATE CASE\$1SENSITIVE \$1 COLLATE CASE\$1INSENSITIVE  
Amazon Redshift 不支援修改欄的區分大小寫組態。當您將新的欄附加到資料表時，Amazon Redshift 會使用預設值來區分大小寫。Amazon Redshift 在附加新的資料欄時不支援 COLLATE 關鍵字。  
如需如何使用資料庫定序建立資料庫的資訊，請參閱 [CREATE DATABASE](r_CREATE_DATABASE.md)。  
如需 COLLATE 函數的詳細資訊，請參閱 [COLLATE 函數](r_COLLATE.md)。

UNIQUE  
在資料欄層級可將一個或多個索引鍵設定為 UNIQUE；UNIQUE 限制條件會分別套用至每個資料欄。若在資料表層級設定 UNIQUE，可由一個或多個資料欄組成複合 UNIQUE 限制條件。

PRIMARY KEY  
若在資料欄層級設定，PRIMARY KEY 必須是單一資料欄。若在資料表層級設定 PRIMARY KEY，可由一個或多個資料欄組成複合主索引鍵。

FOREIGN KEY  
無論 FOREIGN KEY 是在資料欄層級或資料表層級設定，其效果並無差異。在資料欄層級的語法為單純的 `REFERENCES` *reftable* [( *refcolumn* )]。

### 傳入資料的分佈
<a name="r_CREATE_TABLE_usage-distribution-of-incoming-data"></a>

當傳入資料的雜湊分佈機制與目標資料表的機制相同時，不需要在資料載入時實際分佈資料。例如，如果新資料表設定了分佈索引鍵，而且要從另一個分佈在相同索引鍵資料欄上的資料表插入資料，則會使用相同的節點和分割就地載入資料。不過，如果來源和目標資料表都設定為 EVEN 分佈，則資料會重新分佈至目標資料表中。

### 寬資料表
<a name="r_CREATE_TABLE_usage-wide-tables"></a>

您或許能夠建立非常寬的資料表，但無法在資料表上執行查詢處理，像是 INSERT 或 SELECT 陳述式。有固定寬度資料欄 (如 CHAR) 的資料表寬度上限為 64KB - 1 (或 65535 個位元組)。如果資料表包含 VARCHAR 資料欄，資料表就能擁有較大的宣告寬度，而不會傳回錯誤，因為 VARCHARS 資料欄的宣告寬度不會完全計入計算出的查詢處理限制。VARCHAR 資料欄的有效查詢處理限制會因為一些因素而不同。

如果資料表對於插入或選取操作來說太寬，您會收到下列錯誤。

```
ERROR:  8001
DETAIL:  The combined length of columns processed in the SQL statement
exceeded the query-processing limit of 65535 characters (pid:7627)
```

## 範例
<a name="r_CREATE_TABLE_usage-examples"></a>

如需示範如何使用 CREATE TABLE 命令的範例，請參閱 [範例](r_CREATE_TABLE_examples.md) 主題。

# 範例
<a name="r_CREATE_TABLE_examples"></a>

以下範例示範 Amazon Redshift CREATE TABLE 陳述式中各種不同的資料欄和資料表屬性。如需 CREATE TABLE 的相關資訊，包括參數定義，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

許多範例都使用 *TICKIT* 範例資料集中的資料表和資料。如需詳細資訊，請參閱 [tz 資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

 您可以在 CREATE TABLE 命令中使用資料庫名稱和結構描述名稱作為資料表名稱的字首。例如：`dev_database.public.sales`。資料庫名稱必須是您所連線的資料庫。任何在另一個資料庫中建立資料庫物件的嘗試都會失敗，並顯示操作無效錯誤。

## 建立含有分佈索引鍵、複合排序索引鍵和壓縮的資料表
<a name="r_CREATE_TABLE_examples-create-a-table-with-distribution-key"></a>

下列範例會在 TICKIT 資料庫中建立 SALES 資料表，並且為數個資料欄定義壓縮。LISTID 會宣告為分佈索引鍵，而 LISTID 和 SELLERID 會宣告為多資料欄複合排序索引鍵。另外也會為資料表定義主索引鍵和外部索引鍵限制條件。在範例中建立資料表之前，如果限制條件不存在，您可能需要將 UNIQUE 條件限制新增至外部索引鍵參考的每個資料行。

```
create table sales(
salesid integer not null,
listid integer not null,
sellerid integer not null,
buyerid integer not null,
eventid integer not null encode mostly16,
dateid smallint not null,
qtysold smallint not null encode mostly8,
pricepaid decimal(8,2) encode delta32k,
commission decimal(8,2) encode delta32k,
saletime timestamp,
primary key(salesid),
foreign key(listid) references listing(listid),
foreign key(sellerid) references users(userid),
foreign key(buyerid) references users(userid),
foreign key(dateid) references date(dateid))
distkey(listid)
compound sortkey(listid,sellerid);
```

結果如下：

```
schemaname | tablename | column     | type                        | encoding | distkey | sortkey | notnull
-----------+-----------+------------+-----------------------------+----------+---------+---------+--------
public     | sales     | salesid    | integer                     | lzo      | false   |       0 | true
public     | sales     | listid     | integer                     | none     | true    |       1 | true
public     | sales     | sellerid   | integer                     | none     | false   |       2 | true
public     | sales     | buyerid    | integer                     | lzo      | false   |       0 | true
public     | sales     | eventid    | integer                     | mostly16 | false   |       0 | true
public     | sales     | dateid     | smallint                    | lzo      | false   |       0 | true
public     | sales     | qtysold    | smallint                    | mostly8  | false   |       0 | true
public     | sales     | pricepaid  | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | commission | numeric(8,2)                | delta32k | false   |       0 | false
public     | sales     | saletime   | timestamp without time zone | lzo      | false   |       0 | false
```

下列範例會使用不區分大小寫的資料欄 col1 建立資料表 t1。

```
create table T1 (
  col1 Varchar(20) collate case_insensitive
 );
            
insert into T1 values ('bob'), ('john'), ('Tom'), ('JOHN'), ('Bob');
```

查詢資料表：

```
select * from T1 where col1 = 'John';
   
col1
------
 john
 JOHN
(2 rows)
```

## 使用交錯排序索引鍵建立資料表
<a name="CREATE_TABLE_NEW-create-a-table-using-interleaved-sortkey"></a>

以下範例會建立具有交錯排序索引鍵的 CUSTOMER 資料表。

```
create table customer_interleaved (
  c_custkey     	integer        not null,
  c_name        	varchar(25)    not null,
  c_address     	varchar(25)    not null,
  c_city        	varchar(10)    not null,
  c_nation      	varchar(15)    not null,
  c_region      	varchar(12)    not null,
  c_phone       	varchar(15)    not null,
  c_mktsegment      varchar(10)    not null)
diststyle all
interleaved sortkey (c_custkey, c_city, c_mktsegment);
```

## 使用 IF NOT EXISTS 建立資料表
<a name="CREATE_TABLE_NEW-create-a-table-using-if-not-exists"></a>

 下列範例會建立 CITIES 資料表，或不執行任何動作，並於該資料表已存在時傳回訊息：

```
create table if not exists cities(
cityid integer not null,
city varchar(100) not null,
state char(2) not null);
```

## 建立採用 ALL 分佈的資料表
<a name="CREATE_TABLE_NEW-create-a-table-with-all-distribution"></a>

 以下範例會建立採用 ALL 分佈的 VENUE 資料表。

```
create table venue(
venueid smallint not null,
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid))
diststyle all;
```

## 建立採用 EVEN 分佈的資料表
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-even-distribution"></a>

以下範例會建立名為 MYEVENT 且包含三個資料欄的資料表。

```
create table myevent(
eventid int,
eventname varchar(200),
eventcity varchar(30))
diststyle even;
```

資料表會均勻分佈且不會排序。資料表沒有宣告的 DISTKEY 或 SORTKEY 欄。

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'myevent';
            
  column   |          type          | encoding | distkey | sortkey
-----------+------------------------+----------+---------+---------
 eventid   | integer                | lzo      | f       |       0
 eventname | character varying(200) | lzo      | f       |       0
 eventcity | character varying(30)  | lzo      | f       |       0
(3 rows)
```

## 建立 LIKE (類似) 另一個資料表的暫時資料表
<a name="r_CREATE_TABLE_NEW-create-a-temporary-table-that-is-like-another-table"></a>

以下範例會建立名為 TEMPEVENT 的臨時資料表，它的資料欄繼承自 EVENT 資料表。

```
create temp table tempevent(like event); 
```

此資料表也會繼承其父資料表的 DISTKEY 和 SORTKEY 屬性：

```
select "column", type, encoding, distkey, sortkey
 from pg_table_def where tablename = 'tempevent';

  column   |            type             | encoding | distkey | sortkey
-----------+-----------------------------+----------+---------+---------
 eventid   | integer                     | none     | t       |       1
 venueid   | smallint                    | none     | f       |       0
 catid     | smallint                    | none     | f       |       0
 dateid    | smallint                    | none     | f       |       0
 eventname | character varying(200)      | lzo      | f       |       0
 starttime | timestamp without time zone | bytedict | f       |       0
(6 rows)
```

## 建立具有 IDENTITY 欄位的資料表
<a name="r_CREATE_TABLE_NEW-create-a-table-with-an-identity-column"></a>

以下範例會建立名為 VENUE\$1IDENT 的資料表，其中有一個名為 VENUEID 的 IDENTITY 資料欄。此資料欄從 0 開始，並隨每筆記錄遞增 1。VENUEID 也會宣告為資料表的主索引鍵。

```
create table venue_ident(venueid bigint identity(0, 1),
venuename varchar(100),
venuecity varchar(30),
venuestate char(2),
venueseats integer,
primary key(venueid));
```

## 建立具有預設 IDENTITY 欄位的資料表
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-identity-column"></a>

以下範例會建立名為 `t1` 的資料表。此資料表具有名為 `hist_id` 的 IDENTITY 資料欄，以及名為 `base_id` 的預設 IDENTITY 資料欄。

```
CREATE TABLE t1(
  hist_id BIGINT IDENTITY NOT NULL, /* Cannot be overridden */
  base_id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, /* Can be overridden */
  business_key varchar(10) ,
  some_field varchar(10)
);
```

將資料列插入至資料表顯示已同時產生 `hist_id` 及 `base_id` 值。

```
INSERT INTO T1 (business_key, some_field) values ('A','MM');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
```

插入第二列顯示已產生 `base_id` 的預設值。

```
INSERT INTO T1 (base_id, business_key, some_field) values (DEFAULT, 'B','MNOP');
```

```
SELECT * FROM t1;

 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
```

插入第三列顯示 `base_id` 的值不需要是唯一的。

```
INSERT INTO T1 (base_id, business_key, some_field) values (2,'B','MNNN');
```

```
SELECT * FROM t1;
            
 hist_id | base_id | business_key | some_field
---------+---------+--------------+------------
       1 |       1 | A            | MM
       2 |       2 | B            | MNOP
       3 |       2 | B            | MNNN
```

## 建立具有 DEFAULT 欄位的資料表
<a name="r_CREATE_TABLE_NEW-create-a-table-with-default-column-values"></a>

下列範例會建立 CATEGORYDEF 資料表，它會宣告每個資料欄的預設值：

```
create table categorydef(
catid smallint not null default 0,
catgroup varchar(10) default 'Special',
catname varchar(10) default 'Other',
catdesc varchar(50) default 'Special events',
primary key(catid));
            
insert into categorydef values(default,default,default,default);
```

```
select * from categorydef;
            
 catid | catgroup | catname |    catdesc
-------+----------+---------+----------------
     0 | Special  | Other   | Special events
(1 row)
```

## DISTSTYLE、DISTKEY 和 SORTKEY 選項
<a name="r_CREATE_TABLE_NEW-diststyle-distkey-and-sortkey-options"></a>

下列範例說明 DISTKEY、SORTKEY 和 DISTSTYLE 選項的運作方式。在此範例中，COL1 是分佈索引鍵，因此分佈樣式必須設定為 KEY，或是不設定。根據預設，資料表沒有排序索引鍵，因此不會排序：

```
create table t1(col1 int distkey, col2 int) diststyle key;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't1';

column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | az64     | t       | 0
col2   | integer | az64     | f       | 0
```

在下列範例中，會將同一個資料欄定義為分佈索引鍵和排序索引鍵。同樣地，分佈樣式必須設定為 KEY，或是不設定。

```
create table t2(col1 int distkey sortkey, col2 int);
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't2';
            
column |  type   | encoding | distkey | sortkey
-------+---------+----------+---------+---------
col1   | integer | none     | t       | 1
col2   | integer | az64     | f       | 0
```

在下列範例中，不會將任何資料欄設定為分佈索引鍵，COL2 會設定為排序索引鍵，而分佈樣式會設定為 ALL：

```
create table t3(col1 int, col2 int sortkey) diststyle all;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't3';
            
Column |  Type   | Encoding | DistKey | SortKey
-------+---------+----------+---------+--------
col1   | integer | az64     | f       | 0
col2   | integer | none     | f       | 1
```

在下列範例中，分佈樣式會設定為 EVEN，但不會明確定義任何排序索引鍵；因此，資料表會均勻分佈，但不會排序。

```
create table t4(col1 int, col2 int) diststyle even;
```

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 't4';
            
             column |  type   |encoding | distkey | sortkey
--------+---------+---------+---------+--------
col1    | integer | az64    | f       | 0
col2    | integer | az64    | f       | 0
```

## 使用 ENCODE AUTO 選項建立資料表
<a name="r_CREATE_TABLE_NEW-create-a-table-with-encode-option"></a>

下列範例會建立具有自動壓縮編碼的 `t1` 資料表。如果您沒有在任何資料欄上指定編碼類型，ENCODE AUTO 就是資料表的預設值。

```
create table t1(c0 int, c1 varchar);
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t2` 資料表。

```
create table t2(c0 int, c1 varchar) encode auto;
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t3` 資料表。資料欄 `c0` 是以初始編碼類型 DELTA 所定義。如果其他編碼提供更好的查詢效能，Amazon Redshift 可以變更編碼。

```
create table t3(c0 int encode delta, c1 varchar) encode auto;
```

下列範例會透過指定 ENCODE AUTO 建立具有自動壓縮編碼的 `t4` 資料表。資料欄 `c0` 是以初始編碼 DELTA 來定義，而資料欄 `c1` 則以 LZO 初始編碼來定義。如果其他編碼提供更好的查詢效能，Amazon Redshift 可以變更這些編碼。

```
create table t4(c0 int encode delta, c1 varchar encode lzo) encode auto;
```

# CREATE TABLE AS
<a name="r_CREATE_TABLE_AS"></a>

**Topics**
+ [語法](#r_CREATE_TABLE_AS-synopsis)
+ [Parameters](#r_CREATE_TABLE_AS-parameters)
+ [CTAS 使用須知](r_CTAS_usage_notes.md)
+ [CTAS 範例](r_CTAS_examples.md)

根據查詢建立新資料表。此資料表的擁有者是發出命令的使用者。

載入的新資料表包含命令中的查詢所定義的資料。資料表資料欄的名稱和資料類型會與查詢的輸出資料欄相關聯。CREATE TABLE AS (CTAS) 命令會建立新資料表，並評估查詢以載入新資料表。

## 語法
<a name="r_CREATE_TABLE_AS-synopsis"></a>

```
CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ]
TABLE table_name
[ ( column_name [, ... ] ) ]
[ BACKUP { YES | NO } ]
[ table_attributes ]
AS query

where table_attributes are:
[ DISTSTYLE { AUTO | EVEN | ALL | KEY } ]
[ DISTKEY( distkey_identifier ) ]
[ [ COMPOUND | INTERLEAVED ] SORTKEY( column_name [, ...] ) ]
```

## Parameters
<a name="r_CREATE_TABLE_AS-parameters"></a>

LOCAL   
雖然陳述式中可接受此選用關鍵字，但是在 Amazon Redshift 中沒有作用。

TEMPORARY \$1 TEMP   
建立臨時資料表。臨時資料表會在其建立所在的工作階段結束時自動捨棄。

 *table\$1name*   
要建立的資料表名稱。  
若您指定 '\$1' 開頭的資料表名稱，所建立的資料表會是臨時資料表。例如：  

```
create table #newtable (id) as select * from oldtable;
```
資料表名稱長度上限為 127 個位元組；超過此長度的名稱會截斷至 127 個位元組。Amazon Redshift 會依節點類型強制執行每個叢集的資料表數量配額限制。資料表名稱也可透過資料庫和結構描述名稱來限定，如下表所示。  

```
create table tickit.public.test (c1) as select * from oldtable;
```
在此範例中，`tickit` 是資料庫名稱，而 `public` 是結構描述名稱。如果資料庫或結構描述不存在，則陳述式會傳回錯誤。  
若提供結構描述名稱，則會在該結構描述中建立新資料表 (假設建立者具有存取結構描述的權限)。資料表名稱對於該結構描述來說必須是唯一的。如果未指定結構描述，則會使用目前資料庫結構描述建立資料表。如果您要建立臨時資料表，就不能指定結構描述名稱，因為臨時資料表會採用特殊結構描述。  
若臨時資料表是在不同的工作階段中建立的話，則允許在同一個資料庫中同時有多個同名的臨時資料表存在。這些資料表會指派至不同的結構描述。

 *column\$1name*   
新資料表中資料欄的名稱。若未提供任何資料欄名稱，則會採用查詢的輸出資料欄名稱做為資料欄名稱。表達式會使用預設資料欄名稱。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

BACKUP \$1 YES \$1 NO \$1   
此子句會指定資料表是否應包含在自動化和手動叢集快照中。  
若是像臨時資料表這類不會包含重要資料的資料表，指定 BACKUP NO 可以在建立快照以及從快照還原時節省處理時間，並減少 Amazon Simple Storage Service 上的儲存空間。BACKUP NO 設定對於將資料自動複寫到叢集內其他節點的操作並無影響，因此指定了 BACKUP NO 的資料表會在節點發生故障時還原。預設值為 BACKUP YES。  
RA3 佈建叢集和 Amazon Redshift Serverless 工作群組不支援無備份資料表。在 RA3 叢集或無伺服器工作群組中標記為無備份的資料表會視為永久資料表，且在拍攝快照時一律會備份，並一律在從快照還原時還原。為了避免無備份資料表的快照成本，請在拍攝快照之前截斷這些資料表。

DISTSTYLE \$1 AUTO \$1 EVEN \$1 KEY \$1 ALL \$1  
定義整個資料表的資料分佈樣式的關鍵字。Amazon Redshift 會根據資料表上指定的分佈樣式，將資料表的資料列分散到運算節點。預設值為 DISTSTYLE AUTO。  
您為資料表選取的分佈樣式會影響資料庫的整體效能。如需詳細資訊，請參閱[分配資料以實現查詢最佳化](t_Distributing_data.md)。  
+ AUTO：Amazon Redshift 會根據資料表資料來指派最佳分佈樣式。若要檢視套用至資料表的分佈樣式，請查詢 PG\$1CLASS 系統目錄資料表。如需詳細資訊，請參閱[檢視分佈樣式](viewing-distribution-styles.md)。
+ EVEN：資料表中的資料會採循環分佈的方式，均勻分配到叢集中的各個節點。資料列 ID 會用來決定分佈，並且將大致相同的資料列數分佈到每個節點。這是預設分佈方法。
+ KEY：資料是依 DISTKEY 資料欄中的值分佈。當您將聯結資料表的聯結資料欄設定為分佈索引鍵時，兩個資料表的聯結資料列會在運算節點上並存。資料並存時，最佳化工具就能更有效率地執行聯結。若您指定 DISTSTYLE KEY，則必須命名一個 DISTKEY 資料欄。
+  ALL：整個資料表的副本分佈至每個節點。此分佈樣式可確保每個節點上都有任何聯結所需的所有資料列，但儲存空間的需求也會倍增，並且會增加資料表的負載和維護次數。ALL 分佈在 KEY 分佈不適用的情況下搭配特定維度資料表使用時，可改善執行時間，但必須在效能提升與維護成本之間進行權衡。

DISTKEY (*column*)  
指定分佈索引鍵的資料欄名稱或位置編號。使用資料表的選用資料欄清單中所指定的名稱，或是查詢的選取清單中指定的名稱。或者，使用位置編號，其中選取的第一個資料欄為 1、第二個為 2，以此類推。資料表中只能有一個資料欄是分佈索引鍵：  
+ 如果您將資料欄宣告為 DISTKEY 資料欄，則 DISTSTYLE 必須設定為 KEY，或完全不設定。
+ 如果您未宣告 DISTKEY 資料欄，則可以將 DISTSTYLE 設定為 EVEN。
+ 如果您不指定 DISTKEY 或 DISTSTYLE，則 CTAS 會根據 SELECT 子句的查詢計畫判斷新資料表的分佈樣式。如需詳細資訊，請參閱[欄位和資料表屬性的繼承](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes)。
您可以將同一個資料欄定義為分佈索引鍵和排序索引鍵；此方法主要目的是在所指的資料欄要與查詢中的資料欄聯結時加速聯結。

[ COMPOUND \$1 INTERLEAVED ] SORTKEY ( *column\$1name* [, ... ] )  
指定資料表的一個或多個排序索引鍵。當資料載入資料表時，資料會依指定為排序索引鍵的資料欄排序。  
您也可以選擇指定 COMPOUND 或 INTERLEAVED 排序樣式。預設值為 COMPOUND。如需詳細資訊，請參閱[排序索引鍵](t_Sorting_data.md)。  
您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄或 8 個 INTERLEAVED SORTKEY 資料欄。  
如果您不指定 SORTKEY，則 CTAS 會根據 SELECT 子句的查詢計畫判斷新資料表的排序索引鍵。如需詳細資訊，請參閱[欄位和資料表屬性的繼承](r_CTAS_usage_notes.md#r_CTAS_usage_notes-inheritance-of-column-and-table-attributes)。    
COMPOUND  
指定使用複合索引鍵排序資料，該索引鍵是由列出的所有資料欄組成，並依其列出順序排列。當查詢依據排序資料欄的順序掃描資料列時，複合排序索引鍵最實用。當查詢依賴次要排序資料欄時，使用複合索引鍵排序的效能優勢就會降低。您最多可為每個資料表定義 400 個 COMPOUND SORTKEY 資料欄。  
INTERLEAVED  
指定使用交錯排序索引鍵排序資料。最多可以為交錯排序索引鍵指定八個資料欄。  
交錯排序索引鍵對排序索引鍵中的每個資料欄 (或資料欄子集) 都提供相等的權重，所以查詢不會取決於排序索引鍵中資料欄的順序。當查詢使用一個或多個次要排序資料欄時，交錯排序可大幅改善查詢效能。交錯排序在執行資料載入和清空操作時，會產生很少的額外負荷成本，

AS *query*   
Amazon Redshift 支援的任何查詢 (SELECT 陳述式)。

# CTAS 使用須知
<a name="r_CTAS_usage_notes"></a>

## 限制
<a name="r_CTAS_usage_notes-limits"></a>

Amazon Redshift 會依節點類型強制執行每個叢集的資料表數量配額限制。

資料表名稱的字元數上限為 127 個。

單一資料表中可定義的資料欄數目上限為 1,600 個。

## 欄位和資料表屬性的繼承
<a name="r_CTAS_usage_notes-inheritance-of-column-and-table-attributes"></a>

CREATE TABLE AS (CTAS) 資料表不會從其建立的來源資料表繼承限制條件、身分資料欄、預設資料欄值或主索引鍵。

您無法指定 CTAS 資料表的資料欄壓縮編碼。Amazon Redshift 會自動指派壓縮編碼，如下所示：
+ 定義為排序索引鍵的資料欄會有指派的 RAW 壓縮。
+ 定義為 BOOLEAN、REAL、DOUBLE PRECISION、GEOMETRY 或 GEOGRAPHY 資料類型的資料行會有指派的 RAW 壓縮。
+ 定義為 SMALLINT、INTEGER、BIGINT、DECIMAL、DATE、TIME、TIMETZ、TIMESTAMP 或 TIMESTAMPTZ 的資料欄會有指派的 AZ64 壓縮。
+ 定義為 CHAR、VARCHAR 或 VARBYTE 的資料欄會有指派的 LZO 壓縮。

如需詳細資訊，請參閱[壓縮編碼](c_Compression_encodings.md)及[資料類型](c_Supported_data_types.md)。

若要明確指派資料欄編碼，請使用 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

CTAS 會根據 SELECT 子句的查詢計畫判斷新資料表的分佈樣式和排序索引鍵。

若是複雜的查詢，像是包含聯結、彙總、order by 子句或限制子句的查詢，CTAS 會根據查詢計畫盡可能選擇最佳分佈樣式和排序索引鍵。

**注意**  
為了在大型資料集或複雜查詢上發揮最佳效能，建議您使用一般資料集進行測試。

您可藉由查看查詢計畫來了解查詢最佳化工具選擇哪些資料欄 (如有的話) 來排序和分佈資料，如此經常能夠預測出 CTAS 會選擇哪個分佈索引鍵和排序索引鍵。如果查詢計畫的頂端節點是來自單一資料表的簡單循序掃描 (XN Seq Scan)，則 CTAS 通常會使用來源資料表的分佈樣式和排序索引鍵。若查詢計畫的頂端節點是循序掃描以外的其他項目 (像是 XN Limit、XN Sort、XN HashAggregate 等)，則 CTAS 會根據查詢計畫盡可能選擇最佳分佈樣式和排序索引鍵。

例如，假設您使用下列類型的 SELECT 子句建立五個資料表：
+ 簡單 select 陳述式 
+ 限制子句 
+ 使用 LISTID 的 order by 子句 
+ 使用 QTYSOLD 的 order by 子句 
+ 含有 group by 子句的 SUM 彙總函數。

下列範例顯示每個 CTAS 陳述式的查詢計畫。

```
explain create table sales1_simple as select listid, dateid, qtysold from sales;
                           QUERY PLAN
----------------------------------------------------------------
 XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(1 row)


explain create table sales2_limit as select listid, dateid, qtysold from sales limit 100;
                              QUERY PLAN
----------------------------------------------------------------------
 XN Limit  (cost=0.00..1.00 rows=100 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)


explain create table sales3_orderbylistid as select listid, dateid, qtysold from sales order by listid;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: listid
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales4_orderbyqty as select listid, dateid, qtysold from sales order by qtysold;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Sort  (cost=1000000016724.67..1000000017155.81 rows=172456 width=8)
   Sort Key: qtysold
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(3 rows)


explain create table sales5_groupby as select listid, dateid, sum(qtysold) from sales group by listid, dateid;
                              QUERY PLAN
----------------------------------------------------------------------
 XN HashAggregate  (cost=3017.98..3226.75 rows=83509 width=8)
   ->  XN Seq Scan on sales  (cost=0.00..1724.56 rows=172456 width=8)
(2 rows)
```

若要檢視每個資料表的分佈索引鍵和排序索引鍵，請查詢 PG\$1TABLE\$1DEF 系統目錄資料表，如下所示。

```
select * from pg_table_def where tablename like 'sales%';

      tablename       |   column   | distkey | sortkey
----------------------+------------+---------+---------
 sales                | salesid    | f       |       0
 sales                | listid     | t       |       0
 sales                | sellerid   | f       |       0
 sales                | buyerid    | f       |       0
 sales                | eventid    | f       |       0
 sales                | dateid     | f       |       1
 sales                | qtysold    | f       |       0
 sales                | pricepaid  | f       |       0
 sales                | commission | f       |       0
 sales                | saletime   | f       |       0
 sales1_simple        | listid     | t       |       0
 sales1_simple        | dateid     | f       |       1
 sales1_simple        | qtysold    | f       |       0
 sales2_limit         | listid     | f       |       0
 sales2_limit         | dateid     | f       |       0
 sales2_limit         | qtysold    | f       |       0
 sales3_orderbylistid | listid     | t       |       1
 sales3_orderbylistid | dateid     | f       |       0
 sales3_orderbylistid | qtysold    | f       |       0
 sales4_orderbyqty    | listid     | t       |       0
 sales4_orderbyqty    | dateid     | f       |       0
 sales4_orderbyqty    | qtysold    | f       |       1
 sales5_groupby       | listid     | f       |       0
 sales5_groupby       | dateid     | f       |       0
 sales5_groupby       | sum        | f       |       0
```

下表顯示結果摘要。為了簡化起見，我們省略了說明計畫中的成本、資料列和寬度詳細資訊。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_CTAS_usage_notes.html)

您可以在 CTAS 陳述式中明確指定分佈樣式和排序索引鍵。例如，以下陳述式會使用 EVEN 分佈建立資料表，並指定 SALESID 做為排序索引鍵。

```
create table sales_disteven
diststyle even
sortkey (salesid)
as
select eventid, venueid, dateid, eventname
from event;
```

## 壓縮編碼
<a name="r_CTAS_usage_notes_encoding"></a>

ENCODE AUTO 會用來作為資料表的預設值。Amazon Redshift 會自動管理資料表中所有資料欄的壓縮編碼。

## 傳入資料的分佈
<a name="r_CTAS_usage_notes-distribution-of-incoming-data"></a>

當傳入資料的雜湊分佈機制與目標資料表的機制相同時，不需要在資料載入時實際分佈資料。例如，如果新資料表設定了分佈索引鍵，而且要從另一個分佈在相同索引鍵資料欄上的資料表插入資料，則會使用相同的節點和分割就地載入資料。不過，如果來源和目標資料表都設定為 EVEN 分佈，則資料會重新分佈至目標資料表中。

## 自動 ANALYZE 操作
<a name="r_CTAS_usage_notes-automatic-analyze-operations"></a>

Amazon Redshift 會自動分析您使用 CTAS 命令建立的資料表。您不需要在初次建立這些資料表時，對其執行 ANALYZE 命令。若您修改這些資料表，則應依照與其他資料表相同的方式進行分析。

# CTAS 範例
<a name="r_CTAS_examples"></a>

以下範例會為 EVENT 資料表建立名為 EVENT\$1BACKUP 的資料表：

```
create table event_backup as select * from event;
```

產生的資料表會從 EVENT 資料表繼承分佈和排序索引鍵。

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'event_backup';

column    | type                        | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+--------
catid     | smallint                    | none     | false   |       0
dateid    | smallint                    | none     | false   |       1
eventid   | integer                     | none     | true    |       0
eventname | character varying(200)      | none     | false   |       0
starttime | timestamp without time zone | none     | false   |       0
venueid   | smallint                    | none     | false   |       0
```

以下命令會從 EVENT 資料表選取四個資料欄，藉此建立名為 EVENTDISTSORT 的新資料表。新資料表會依 EVENTID 分佈並依 EVENTID 和 DATEID 排序：

```
create table eventdistsort
distkey (1)
sortkey (1,3)
as
select eventid, venueid, dateid, eventname
from event;
```

結果如下所示：

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistsort';

column   |          type          | encoding | distkey | sortkey
---------+------------------------+----------+---------+-------
eventid   | integer               | none     | t       | 1
venueid   | smallint              | none     | f       | 0
dateid    | smallint              | none     | f       | 2
eventname | character varying(200)| none     | f       | 0
```

您可以使用分佈和排序索引鍵的資料欄名稱建立完全相同的資料表。例如：

```
create table eventdistsort1
distkey (eventid)
sortkey (eventid, dateid)
as
select eventid, venueid, dateid, eventname
from event;
```

以下陳述式會將均勻分佈套用至資料表，但不會定義明確的排序索引鍵。

```
create table eventdisteven
diststyle even
as
select eventid, venueid, dateid, eventname
from event;
```

資料表不會從 EVENT 資料表 (EVENTID) 繼承排序索引鍵，因為針對新資料表指定了 EVEN 分佈。新資料表沒有排序索引鍵，也沒有分佈索引鍵。

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdisteven';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+---------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 0
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

以下陳述式會套用均勻分佈，並定義排序索引鍵：

```
create table eventdistevensort diststyle even sortkey (venueid)
as select eventid, venueid, dateid, eventname from event;
```

 產生的資料表有排序索引鍵，但沒有分佈索引鍵。

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'eventdistevensort';

column    |          type          | encoding | distkey | sortkey
----------+------------------------+----------+---------+-------
eventid   | integer                | none     | f       | 0
venueid   | smallint               | none     | f       | 1
dateid    | smallint               | none     | f       | 0
eventname | character varying(200) | none     | f       | 0
```

以下陳述式會依傳入資料 (依 EVENTID 排序) 的不同索引鍵資料欄重新分佈 EVENT 資料表，並且不會定義 SORTKEY 資料欄；因此資料表不會排序。

```
create table venuedistevent distkey(venueid)
as select * from event;
```

結果如下所示：

```
select "column", type, encoding, distkey, sortkey
from pg_table_def where tablename = 'venuedistevent';

 column   |            type             | encoding | distkey | sortkey
----------+-----------------------------+----------+---------+-------
eventid   | integer                     | none     | f       | 0
venueid   | smallint                    | none     | t       | 0
catid     | smallint                    | none     | f       | 0
dateid    | smallint                    | none     | f       | 0
eventname | character varying(200)      | none     | f       | 0
starttime | timestamp without time zone | none     | f       | 0
```

# 建立 範本
<a name="r_CREATE_TEMPLATE"></a>

為 Amazon Redshift 命令建立可重複使用的範本，例如 [COPY](r_COPY.md)。範本存放可在多個命令執行中參考的常用參數，可改善一致性並降低手動參數規格。

範本不需要跨多個操作重複指定相同的格式參數，而來源路徑、目標資料表和授權可能因操作而異。

## 所需權限
<a name="r_CREATE_TEMPLATE-privileges"></a>

若要建立範本，您必須具有下列其中一項：
+ 超級使用者權限
+ 您要建立範本之結構描述的 CREATE 許可，或您要建立範本之資料庫中結構描述的 CREATE 範圍許可

## 語法
<a name="r_CREATE_TEMPLATE-synopsis"></a>

```
CREATE [ OR REPLACE ] TEMPLATE [database_name.][schema_name.]template_name
FOR COPY [ AS ]
[ [ FORMAT ] [ AS ] data_format ]
[ parameter [ argument ] [ , ... ] ];
```

## Parameters
<a name="r_CREATE_TEMPLATE-parameters"></a>

 *或 取代*   
如果指定資料庫和結構描述中已存在同名的範本，則會取代現有的範本。您只能將範本取代為定義相同操作類型的新範本，例如 COPY。您必須擁有必要的權限才能取代範本。

*database\$1name*  
（選用） 建立範本的資料庫名稱。如果未指定，則會在目前的資料庫中建立範本。  
如果資料庫或結構描述不存在，則不會建立範本，且陳述式會傳回錯誤。您無法在系統資料庫 `template0`、、 `template1` `padb_harvest` 或 中建立範本`sys:internal`。

*schema\$1name*  
（選用） 建立範本的結構描述名稱。如果未指定，則會在目前的結構描述中建立範本。  
如果指定結構描述名稱，則會在該結構描述中建立新的範本 （假設建立者可存取該結構描述）。範本名稱必須是該結構描述的唯一名稱。

*template\$1name*  
要建立的範本名稱。或者，範本名稱可以符合資料庫和結構描述名稱的資格。在下列範例中，資料庫名稱為 `demo_database`，結構描述名稱為 `demo_schema`，範本名稱為 `test`。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。  

```
CREATE TEMPLATE demo_database.demo_schema.test FOR COPY AS CSV;
```

COPY  
指定建立範本的 Redshift 命令類型。目前，僅支援 COPY 命令。

【 【 格式】 【 AS 】 *data\$1format* 】   
這是選擇性的參數。這會指定 COPY 操作的資料格式。

【 *參數* 【 引數 】】  
指定 redshift 命令的任何有效參數。  
例如，COPY 命令的範本可包含：  
+ [資料格式參數](copy-parameters-data-format.md)
+ [檔案壓縮參數](copy-parameters-file-compression.md)
+ [資料轉換參數](copy-parameters-data-conversion.md)
+ [資料載入操作](copy-parameters-data-load.md)
如需支援參數的完整清單，請參閱 [COPY](r_COPY.md)命令。

### 使用須知
<a name="create_template-usage-notes"></a>
+ 根據預設，所有使用者對 PUBLIC 結構描述都具有 CREATE 和 USAGE 權限。若要不允許使用者在資料庫的 PUBLIC 結構描述內建立物件，請使用 REVOKE 命令來移除該權限。
+ 當範本和命令中都存在參數時，命令參數優先。
+ 範本是資料庫物件，並遵循標準 Redshift 物件命名和許可規則。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。
+ 範本不能包含[COPY](r_COPY.md)命令的資訊清單檔案規格。

### 限制
<a name="create_template-limitations"></a>
+ 建立範本時，必須至少指定一個參數。
+ 排除參數 – 範本中不能包含命令特定的參數，例如來源路徑、目標資料表、授權憑證和資訊清單檔案規格。這些參數必須在實際命令中指定。
+ 每個叢集的範本上限 – 每個叢集最多可以建立 1，000 個範本。此限制適用於叢集中所有資料庫和結構描述的範本總數。
+ 跨資料庫參考 – 範本無法跨資料庫參考。
+ 資料共用 – 範本不能包含在資料共用中。範本必須在需要它們的每個叢集中個別建立。

## 範例
<a name="r_CREATE_TEMPLATE-examples"></a>

下列範例會建立 COPY 命令的範本 

```
CREATE TEMPLATE test_schema.demo_template
FOR COPY
AS
FORMAT JSON 'auto'
NULL AS ''
MAXERROR 100;
```

使用 [顯示範本](r_SHOW_TEMPLATE.md)取得範本的定義：

```
SHOW TEMPLATE test_schema.demo_template;
CREATE OR REPLACE TEMPLATE dev.test_schema.demo_template FOR COPY AS FORMAT AS JSON 'auto' NULL '' MAXERROR 100;
```

 查詢[SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md)系統檢視以取得範本的詳細資訊。

```
SELECT * FROM SYS_REDSHIFT_TEMPLATE;

database_name | schema_name | template_name | template_type |        create_time         |     last_modified_time     | owner_id | last_modified_by | template_parameters 
---------------+-------------+---------------+---------------+----------------------------+----------------------------+----------+------------------+---------------------
 dev           | test_schema | demo_template |             1 | 2025-12-17 20:06:01.944171 | 2025-12-17 20:06:01.944171 |        1 |                1 | {
    "JSON": "auto",
    "MAXERROR": 100,
    "NULL": ""
}
```

# CREATE USER
<a name="r_CREATE_USER"></a>

建立新的資料庫使用者。視權限和角色而定，資料庫使用者可以擷取資料、執行命令，以及在資料庫中執行其他動作。您必須是資料庫超級使用者才能執行此命令。

## 所需權限
<a name="r_CREATE_USER-privileges"></a>

以下是 CREATE USER 所需的權限：
+ 超級使用者
+ 具有 CREATE USER 權限的使用者

## 語法
<a name="r_CREATE_USER-synopsis"></a>

```
CREATE USER name [ WITH ]
PASSWORD { 'password' | 'md5hash' | 'sha256hash' | DISABLE }
[ option [ ... ] ]

where option can be:

CREATEDB | NOCREATEDB
| CREATEUSER | NOCREATEUSER
| SYSLOG ACCESS { RESTRICTED | UNRESTRICTED }
| IN GROUP groupname [, ... ]
| VALID UNTIL 'abstime'
| CONNECTION LIMIT { limit | UNLIMITED }
| SESSION TIMEOUT limit
| EXTERNALID external_id
```

## Parameters
<a name="r_CREATE_USER-parameters"></a>

 *name*   
欲建立的使用者名稱。使用者名稱不可以是 `PUBLIC`。如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。

WITH  
選用的關鍵字。WITH 會被 Amazon Redshift 忽略

PASSWORD \$1 '*password*' \$1 '*md5hash*' \$1 '*sha256hash*' \$1 DISABLE \$1  
設定使用者的密碼。  
根據預設，使用者可以變更自己擁有的密碼，除非密碼遭到停用。若要停用使用者的密碼，請指定 DISABLE。當使用者的密碼停用時，密碼會從系統中刪除，使用者只能使用暫時 AWS Identity and Access Management (IAM) 使用者登入資料登入。如需詳細資訊，請參閱[使用 IAM 身分驗證來產生資料庫使用者登入資料](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-user-credentials.html)。只有超級使用者能夠啟用或停用密碼，您無法停用超級使用者的密碼。若要啟用密碼，請執行 [ALTER USER](r_ALTER_USER.md) 並指定密碼。  
您可以以純文字、MD5 雜湊字串或 SHA256 雜湊字串形式指定密碼。  
 當您使用 AWS 管理主控台 AWS CLI或 Amazon Redshift API 啟動新叢集時，您必須為初始資料庫使用者提供純文字密碼。您之後可以使用 [ALTER USER](r_ALTER_USER.md) 變更密碼。
若是純文字，密碼必須滿足下列限制條件：  
+ 長度必須為 8 到 64 個字元。
+ 至少須包含一個大寫字母、一個小寫字母和一個數字。
+ 它可以使用任何 ASCII 字元 (ASCII 碼 33–126)，但 ' (單引號)、" (雙引號)、\$1、/ 或 @ 除外。
除了以純文字傳遞 CREATE USER 密碼參數之外，更安全的替代方法是指定包括密碼和使用者名稱的 MD5 雜湊字串。  
當您指定 MD5 雜湊字串時，CREATE USER 命令會檢查有效的 MD5 雜湊字串，但不會驗證字串的密碼部分。在此情況下可能會建立密碼，例如空字串，但此密碼無法用來登入資料庫。
若要指定 MD5 密碼，請依照下列步驟執行：  

1. 串連密碼和使用者名稱。

   例如，密碼 `ez` 和使用者 `user1` 的串連字串為 `ezuser1`。

1. 將串連字串轉換成 32 個字元的 MD5 雜湊字串。您可以使用任何 MD5 公用程式來建立雜湊字串。以下範例會使用 Amazon Redshift [MD5 函數](r_MD5.md) 和串連運算子 ( \$1\$1 ) 傳回 32 個字元的 MD5 雜湊字串。

   ```
   select md5('ez' || 'user1');
                           
   md5
   --------------------------------
   153c434b4b77c89e6b94f12c5393af5b
   ```

1. 在 MD5 雜湊字串前方串連 '`md5`' 並提供串連字串做為 *md5hash* 引數。

   ```
   create user user1 password 'md5153c434b4b77c89e6b94f12c5393af5b';
   ```

1. 使用登入憑證登入資料庫。

   例如，以 `user1` 的身分和密碼 `ez` 登入。
另一個安全的替代方法是指定密碼字串的 SHA-256 雜湊，或是您可以提供自己的有效 SHA-256 摘要和用於建立摘要的 256 位元 Salt。  
+ 摘要 — 雜湊函數的輸出。
+ Salt — 隨機產生且可與密碼結合的資料，有助於減少雜湊函數輸出中的模式。

```
'sha256|Mypassword'
```

```
'sha256|digest|256-bit-salt'
```
在下列範例中，Amazon Redshift 會產生並管理 Salt。  

```
CREATE USER admin PASSWORD 'sha256|Mypassword1';
```
下列範例會提供有效 SHA-256 摘要和用來建立摘要的 256 位元 Salt。  
要指定密碼並使用自己的 Salt 對其進行雜湊，請按照以下步驟操作：  

1. 建立 256 位元 Salt。您可以透過使用任何十六進位字串產生器產生 64 個字元長的字串來取得 Salt。在此範例中，Salt 是 `c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6`。

1.  使用 FROM\$1HEX 函數將您的 Salt 轉換為二進位。這是因為 SHA2 函數需要 Salt 的二進位表示法。請參閱以下陳述式。

   ```
   SELECT FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6');
   ```

1.  使用 CONCAT 函數將您的 Salt 附加到您的密碼中。在此範例中，密碼為 `Mypassword1`。請參閱以下陳述式。

   ```
   SELECT CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6'));
   ```

1. 使用 SHA2 函數從您的密碼和 salt 組合中建立摘要。請參閱以下陳述式。

   ```
   SELECT SHA2(CONCAT('Mypassword1',FROM_HEX('c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6')), 0);
   ```

1.  使用先前步驟中的摘要和 Salt，建立使用者。請參閱以下陳述式。

   ```
   CREATE USER admin PASSWORD 'sha256|821708135fcc42eb3afda85286dee0ed15c2c461d000291609f77eb113073ec2|c721bff5d9042cf541ff7b9d48fa8a6e545c19a763e3710151f9513038b0f6c6';
   ```

1. 使用登入憑證登入資料庫。

    例如，以 `admin` 的身分和密碼 `Mypassword1` 登入。
如果您在未指定雜湊函數的情況下，以純文字格式設定密碼，則會使用使用者名稱作為 Salt 來產生 MD5 摘要。

CREATEDB \$1 NOCREATEDB   
CREATEDB 選項可讓新使用者建立資料庫。預設值是 NOCREATEDB。

CREATEUSER \$1 NOCREATEUSER   
CREATEUSER 選項可建立具有所有資料庫權限的超級使用者，包括 CREATE USER。預設值為 NOCREATEUSER。如需詳細資訊，請參閱[超級使用者](r_superusers.md)。

SYSLOG ACCESS \$1 RESTRICTED \$1 UNRESTRICTED \$1  <a name="create-user-syslog-access"></a>
此子句會指定使用者對 Amazon Redshift 系統資料表和檢視的存取層級。  
具有 SYSLOG ACCESS RESTRICTED 許可的一般使用者，只能看見該使用者在使用者可見的系統資料表和檢視中產生的列。預設值為 RESTRICTED。  
具有 SYSLOG ACCESS UNRESTRICTED 許可的一般使用者，可以看見使用者可見的系統資料表和檢視中的所有列，包括其他使用者產生的列。UNRESTRICTED 並不會讓一般使用者存取超級使用者可查看的資料表。只有超級使用者可看見超級使用者可查看的資料表。  
若使用者擁有不受限制的系統資料表存取權限，該使用者就能查看其他使用者產生的資料。例如，STL\$1QUERY 和 STL\$1QUERYTEXT 包含 INSERT、UPDATE 和 DELETE 陳述式的全文，當中可能包含使用者產生的敏感資料。
所有使用者皆可看到 SVV\$1TRANSACTIONS 中的所有資料列。  
如需詳細資訊，請參閱[系統資料表和檢視中資料的可見性](cm_chap_system-tables.md#c_visibility-of-data)。

IN GROUP *groupname*   
指定使用者所屬現有群組的名稱。可列出多個群組名稱。

VALID UNTIL *abstime*   
VALID UNTIL 選項會設定絕對時間，在這段時間過後使用者密碼就會失效。根據預設，密碼沒有時間限制。

CONNECTION LIMIT \$1 *limit* \$1 UNLIMITED \$1   
允許使用者同時開啟的資料庫連線數目上限。超級使用者不受此限制規範。使用 UNLIMITED 關鍵字可允許同時連線的最大數目。另外也可能限制每個資料庫的連線數目。如需詳細資訊，請參閱[CREATE DATABASE](r_CREATE_DATABASE.md)。預設值為 UNLIMITED。若要檢視目前連線數目，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統畫面。  
如果同時套用使用者和資料庫連線數目限制，則必須在使用者嘗試連線時，在不超過這兩項限制的情況下提供一個未使用的連線位置。

SESSION TIMEOUT *limit*  
工作階段保持非作用中或閒置的時間上限 (以秒為單位)。範圍是 60 秒 (一分鐘) 到 1,728,000 秒 (20 天)。如果未為使用者設定工作階段逾時，則會套用叢集設定。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的 [Amazon Redshift 中的配額和限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。  
當您設定工作階段逾時時，只會套用至新的工作階段。  
若要檢視有關作用中使用者工作階段的資訊 (包括開始時間、使用者名稱和工作階段逾時)，請查詢 [STV\$1SESSIONS](r_STV_SESSIONS.md) 系統檢視。若要檢視有關使用者工作階段歷史記錄的資訊，請查詢 [STL\$1SESSIONS](r_STL_SESSIONS.md) 檢視。若要擷取有關資料庫使用者的資訊 (包括工作階段逾時值)，請查詢 [SVL\$1USER\$1INFO](r_SVL_USER_INFO.md) 檢視。

EXTERNALID *external\$1id*  
與身分提供者相關聯的使用者識別碼。使用者必須停用密碼。如需詳細資訊，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

### 使用須知
<a name="create_user-usage-notes"></a>

根據預設，所有使用者對 PUBLIC 結構描述都具有 CREATE 和 USAGE 權限。若要不允許使用者在資料庫的 PUBLIC 結構描述內建立物件，請使用 REVOKE 命令來移除該權限。

使用 IAM 身分驗證建立資料庫使用者登入資料時，您可能會希望建立只能使用臨時登入資料登入的超級使用者。您無法停用超級使用者的密碼，但是可以使用隨機產生的 MD5 雜湊字串建立未知的密碼。

```
create user iam_superuser password 'md5A1234567890123456780123456789012' createuser;
```

無論 `enable_case_sensitive_identifier` 組態選項的設定為何，都會保留以雙引號括住的 *username* 大小寫。如需詳細資訊，請參閱[enable\$1case\$1sensitive\$1identifier](r_enable_case_sensitive_identifier.md)。

## 範例
<a name="r_CREATE_USER-examples"></a>

以下命令會建立名為 dbuser 的使用者與密碼 "abcD1234"、建立資料庫的權限，以及 30 個連線限制。

```
create user dbuser with password 'abcD1234' createdb connection limit 30;
```

 查詢 PG\$1USER\$1INFO 目錄資料表以檢視有關資料庫使用者的詳細資訊。

```
select * from pg_user_info;
         
 usename   | usesysid | usecreatedb | usesuper | usecatupd | passwd   | valuntil | useconfig | useconnlimit
-----------+----------+-------------+----------+-----------+----------+----------+-----------+-------------
 rdsdb     |        1 | true        | true     | true      | ******** | infinity |           |
 adminuser |      100 | true        | true     | false     | ******** |          |           | UNLIMITED
 dbuser    |      102 | true        | false    | false     | ******** |          |           | 30
```

在以下範例中，帳戶密碼的有效期限至 2017 年 6 月 10 日。

```
create user dbuser with password 'abcD1234' valid until '2017-06-10';
```

 以下範例會建立使用者，以及包含特殊字元且區分大小寫的密碼。

```
create user newman with password '@AbC4321!';
```

 若要在 MD5 密碼中使用反斜線 ('\$1')，請使用來源字串中的反斜線逸出反斜線。以下範例會建立名為 `slashpass` 的使用者，並使用單一反斜線 ('`\`') 做為密碼。

```
select md5('\\'||'slashpass');
         
md5
--------------------------------
0c983d1a624280812631c5389e60d48c
```

使用 md5 密碼建立使用者。

```
create user slashpass password 'md50c983d1a624280812631c5389e60d48c';
```

下列範例會建立將閒置工作階段逾時設定為 120 秒的使用者 `dbuser`。

```
CREATE USER dbuser password 'abcD1234' SESSION TIMEOUT 120;
```

以下範例會建立名為 `bob` 的使用者。命名空間為 `myco_aad`。這只是範例。若要成功執行命令，您必須擁有已註冊的身分提供者。如需詳細資訊，請參閱 [Amazon Redshift 的原生身分提供者 (IdP) 聯合合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

```
CREATE USER myco_aad:bob EXTERNALID "ABC123" PASSWORD DISABLE;
```

# CREATE VIEW
<a name="r_CREATE_VIEW"></a>

在資料庫中建立檢視。檢視不會實際具體化；定義檢視的查詢會在每次查詢中參考檢視時執行。若要建立外部資料表的檢視，請包含 WITH NO SCHEMA BINDING 子句。

若要建立標準檢視，您需要存取基礎資料表或基礎檢視。若要查詢標準檢視，您需要選取檢視本身的許可，但不需要選取基礎資料表的許可。如果您建立參照其他結構描述中資料表或視觀表的視觀表，或是建立參照具體化視觀表的視觀表，則需要使用權限。若要查詢近期繫結視觀表，您需要選取近期繫結視觀表本身的權限。您也應該確認近期繫結檢視的擁有者具有所參考物件 (資料表、檢視或使用者定義的函式) 的選取許可。如需近期繫結檢視的詳細資訊，請參閱 [使用須知](#r_CREATE_VIEW_usage_notes)。

## 所需的許可
<a name="r_CREATE_VIEW-privileges"></a>

若要使用 CREATE VIEW，則須具有下列其中一項許可。
+ 若要使用 CREATE [ OR REPLACE ] VIEW 建立檢視：
  + 超級使用者
  + 具有 CREATE [ REPLACE ] VIEW 許可的使用者
+ 若要使用 CREATE OR REPLACE VIEW 取代現有檢視：
  + 超級使用者
  + 具有 CREATE [ OR REPLACE ] VIEW 許可的使用者
  + 檢視擁有者

如果使用者想要存取包含使用者定義函式的檢視，則該使用者必須具有該函式的 EXECUTE 許可。

## 語法
<a name="r_CREATE_VIEW-synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW name [ ( column_name [, ...] ) ] AS query
[ WITH NO SCHEMA BINDING ]
```

## Parameters
<a name="r_CREATE_VIEW-parameters"></a>

OR REPLACE   
如果有同名的檢視存在，則會取代該檢視。您只能將檢視取代為使用相同的資料欄名稱和資料類型產生一組相同資料欄的新查詢。CREATE OR REPLACE VIEW 會鎖定檢視的讀取和寫入，直到操作完成。  
當檢視被替換時，其他屬性 (例如所有權和授予的權限) 會保留下來。

 *name*   
檢視的名稱。如果有提供結構描述名稱 (例如 `myschema.myview`)，則會使用指定的結構描述建立檢視。否則，檢視會在目前結構描述中建立。檢視名稱必須與相同結構描述中的任何其他檢視或資料表名稱不同。  
若您指定 '\$1' 開頭的檢視名稱，所建立的檢視會是臨時檢視，而且只可在目前工作階段中看見。  
如需有效名稱的相關資訊，請參閱 [名稱與識別碼](r_names.md)。您無法在系統資料庫 template0、template1 和 padb\$1harvest 或 sys:internal中建立資料表或視觀表。

 *column\$1name*   
選用的名稱清單，將用於檢視中的資料欄。若未提供任何資料欄名稱，則會從查詢衍生資料欄名稱。單一檢視中可定義的資料欄數目上限為 1,600 個。

 *query*   
判斷值為資料表的查詢 (採用 SELECT 陳述式的形式)。此資料表會定義檢視中的資料欄和資料列。

 WITH NO SCHEMA BINDING   
此子句會指定檢視不會與底層資料庫物件繫結，像是資料表和使用者定義的函數。因此，檢視和其參考的物件之間並無相依性。即使參考的物件不存在，您仍可以建立檢視。由於沒有相依性，您可以捨棄或修改參考物件，而不會影響檢視。Amazon Redshift 在查詢檢視之前不會檢查相依姓。近期繫結檢視不支援遞迴一般資料表表達式 (rCTE)。若要檢視近期繫結視觀表的詳細資訊，請執行 [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md) 函數。  
若包含 WITH NO SCHEMA BINDING 子句，則 SELECT 陳述式中參考的資料表和檢視都必須以結構描述名稱限定。檢視建立時，結構描述必須存在，即使參考的資料表不存在也一樣。例如，下列陳述式會傳回錯誤。  

```
create view myevent as select eventname from event
with no schema binding;
```
下列陳述式會成功執行。  

```
create view myevent as select eventname from public.event
with no schema binding;
```

**注意**  
您無法在檢視中進行更新、插入或刪除操作。

## 使用須知
<a name="r_CREATE_VIEW_usage_notes"></a>



### 近期繫結檢視
<a name="r_CREATE_VIEW_late-binding-views"></a>

在對檢視進行查詢之前，近期繫結檢視不會檢查底層資料庫物件，像是資料表和其他檢視。因此，您可以修改或捨棄底層物件，而不會捨棄和重新建立檢視。若您捨棄底層物件，對近期繫結檢視的查詢將會失敗。若對近期繫及檢視的查詢參考底層物件中不存在的資料欄，則查詢將會失敗。

 若您捨棄後再次建立近期繫結檢視的基礎資料表或檢視，則會建立具有預設存取許可的新物件。您可能需要對將查詢檢視的使用者授予基礎物件的許可。

若要建立近期繫結檢視，請包含 WITH NO SCHEMA BINDING 子句。以下範例會建立不含結構描述繫結的檢視。

```
create view event_vw as select * from public.event
with no schema binding;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | eventname     | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

以下範例顯示您可以修改基礎資料表，但不重新建立檢視。

```
alter table event rename column eventname to title;
```

```
select * from event_vw limit 1;
            
eventid | venueid | catid | dateid | title         | starttime
--------+---------+-------+--------+---------------+--------------------
      2 |     306 |     8 |   2114 | Boris Godunov | 2008-10-15 20:00:00
```

您只能在近期繫結檢視中參考 Amazon Redshift Spectrum 外部資料表。近期繫結檢視的應用方式之一，就是查詢 Amazon Redshift 和 Redshift Spectrum 這兩種資料表。例如，您可以使用 [UNLOAD](r_UNLOAD.md) 命令將舊資料封存至 Amazon S3。然後建立參考 Amazon S3 中資料的 Redshift Spectrum 外部資料表，並建立查詢這兩種資料表的檢視。以下範例會使用 UNION ALL 子句聯結 Amazon Redshift `SALES` 資料表和 Redshift Spectrum `SPECTRUM.SALES` 資料表。

```
create view sales_vw as
select * from public.sales
union all
select * from spectrum.sales
with no schema binding;
```

如需建立 Redshift Spectrum 外部資料表的相關資訊，包括 `SPECTRUM.SALES` 資料表，請參閱 [開始使用 Amazon Redshift Spectrum](c-getting-started-using-spectrum.md)。

**重要**  
當您從近期繫結檢視建立標準檢視時，標準檢視的定義會包含進行標準檢視時的近期繫結檢視定義，包括近期繫結檢視的擁有者。如果您在基礎近期繫結檢視中進行變更，在您重新建立標準檢視之前，這些變更不會在標準檢視中使用。因此，查詢標準檢視時，其一律使用近期繫結檢視的定義和近期繫結檢視的擁有者，以便在建立標準檢視時檢查許可。

若要更新標準檢視表以參考近期繫結檢視的最新定義，請使用您用來建立標準檢視的初始檢視定義來執行 CREATE OR REPLACE VIEW。

請參閱下列範例，了解如何從近期繫結檢視建立標準檢視。

```
create view sales_vw_lbv as 
select * from public.sales 
with no schema binding;

show view sales_vw_lbv;
                            Show View DDL statement
--------------------------------------------------------------------------------
 create view sales_vw_lbv as select * from public.sales with no schema binding;
(1 row)

create view sales_vw as 
select * from sales_vw_lbv;

show view sales_vw;
                                               Show View DDL statement
---------------------------------------------------------------------------------------------------------------------
 SELECT sales_vw_lbv.price, sales_vw_lbv."region" FROM (SELECT sales.price, sales."region" FROM sales) sales_vw_lbv;
(1 row)
```

請注意，標準檢視的 DDL 陳述式中所顯示的近期繫結檢視是在建立標準檢視時定義的，之後不會隨著近期繫結檢視上所做的任何變更進行更新。

## 範例
<a name="r_CREATE_VIEW-examples"></a>

範例命令會使用稱為 *TICKIT* 資料庫的一組物件和資料範例。如需詳細資訊，請參閱 [tz 資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

以下命令會從名為 EVENT 的資料表建立名為 *myevent* 的檢視。

```
create view myevent as select eventname from event
where eventname = 'LeAnn Rimes';
```

以下命令會從名為 USERS 的資料表建立名為 *myuser* 的檢視。

```
create view myuser as select lastname from users;
```

以下命令會從名為 USERS 的資料表建立或取代名為 *myuser* 的檢視。

```
create or replace view myuser as select lastname from users;
```

以下範例會建立不含結構描述繫結的檢視。

```
create view myevent as select eventname from public.event
with no schema binding;
```

# DEALLOCATE
<a name="r_DEALLOCATE"></a>

解除配置預備陳述式。

## 語法
<a name="r_DEALLOCATE-synopsis"></a>

```
DEALLOCATE [PREPARE] plan_name
```

## Parameters
<a name="r_DEALLOCATE-parameters"></a>

PREPARE   
此關鍵字為選用並且會予以忽略。

 *plan\$1name*   
要解除配置之預備陳述式的名稱。

## 使用須知
<a name="r_DEALLOCATE_usage_notes"></a>

DEALLOCATE 是用來解除配置先前預備的 SQL 陳述式。若您未明確解除配置預備陳述式，則會在目前工作階段結束時將它解除配置。如需預備陳述式的相關資訊，請參閱 [PREPARE](r_PREPARE.md)。

## 另請參閱
<a name="r_DEALLOCATE-see-also"></a>

 [EXECUTE](r_EXECUTE.md), [PREPARE](r_PREPARE.md) 

# DECLARE
<a name="declare"></a>

定義新的資料指標。使用資料指標可從完整查詢的結果集中一次擷取幾個資料列。

擷取資料指標的第一列時，整個結果集會在領導節點上、記憶體中或磁碟上具體化 (如有需要)。由於在大型結果集內使用資料指標可能會對效能造成負面影響，因此建議您盡量使用替代方式。如需詳細資訊，請參閱[使用游標時的效能考量](#declare-performance)。

您必須在交易區塊內宣告資料指標。每個工作階段中一次只能開啟一個資料指標。

如需詳細資訊，請參閱 [FETCH](fetch.md)、[CLOSE](close.md)。

## 語法
<a name="declare-synopsis"></a>

```
DECLARE cursor_name CURSOR FOR query
```

## Parameters
<a name="declare-parameters"></a>

*cursor\$1name*   
新資料指標的名稱。

 *query*   
填入資料指標的 SELECT 陳述式。

## DECLARE CURSOR 使用須知
<a name="declare-usage"></a>

若您的用戶端應用程式使用 ODBC 連線，且您的查詢建立的結果集太大，無法納入記憶體中，則您可以使用資料指標將結果集串流到用戶端應用程式。當您使用資料指標時，整個結果集會在領導節點上具體化，然後您的用戶端就能以遞增方式擷取結果。

**注意**  
若要在 Microsoft Windows 的 ODBC 中啟用資料指標，請在您用於 Amazon Redshift 的 ODBC DSN 中啟用**使用宣告/擷取**選項。建議您使用 ODBC DSN 選項對話方塊中的 **Cache Size (快取大小)** 欄位，將多節點叢集上的 ODBC 快取大小設定為 4,000 或更大的數字，以減少往返次數。在單一節點叢集上，將 Cache Size (快取大小) 設定為 1,000。

由於使用資料指標可能會對效能造成負面影響，因此建議您盡量使用替代方式。如需詳細資訊，請參閱[使用游標時的效能考量](#declare-performance)。

在滿足以下限制的情況下，可支援 Amazon Redshift 資料指標：
+ 每個工作階段中一次只能開啟一個資料指標。
+ 資料指標必須在交易內使用 (BEGIN … END)。
+ 所有資料指標累積的結果集大小上限受限於叢集節點類型。若您需要更大的結果集，可將大小調整為 XL 或 8XL 節點組態。

  如需詳細資訊，請參閱[游標限制條件](#declare-constraints)。

## 游標限制條件
<a name="declare-constraints"></a>

擷取資料指標的第一列時，整個結果集會在領導節點上具體化。若結果集無法納入記憶體內，則會視需要寫入磁碟中。為保護領導節點的完整性，Amazon Redshift 會根據叢集的節點類型對所有資料指標結果集的大小強制執行限制條件。

下表說明每個叢集節點類型的結果集大小總計上限。結果集大小上限的單位是 MB。


| Node type | 每個叢集的結果集上限 (MB) | 
| --- | --- | 
|   DC2 Large 多個節點   | 192，000 | 
|   DC2 Large 單節點   | 8,000 | 
|   DC2 8XL 多個節點   | 3，200，000 | 
|   RA3 16XL 多個節點   | 14，400，000 | 
|   RA3 4XL 多個節點   | 3，200，000 | 
|   RA3 XLPLUS 多個節點   | 1,000,000 | 
|   RA3 XLPLUS 單節點   | 64，000 | 
|   RA3 LARGE 多個節點   | 240，000 | 
|   RA3 LARGE 單一節點   | 8,000 | 
| Amazon Redshift Serverless | 150，000 | 

若要檢視叢集的使用中資料指標組態，請以超級使用者身分查詢 [STV\$1CURSOR\$1CONFIGURATION](r_STV_CURSOR_CONFIGURATION.md) 系統資料表。若要檢視使用中資料指標的狀態，請查詢 [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md) 系統資料表。使用者只能看見自己擁有之資料指標的資料列，但超級使用者可檢視所有資料指標。

## 使用游標時的效能考量
<a name="declare-performance"></a>

由於資料指標會在開始傳回結果至用戶端之前，於領導節點上將整個結果集具體化，因此在非常大型的結果集內使用資料指標會對效能產生負面影響。強烈建議您不要在非常大型的結果集內使用資料指標。在某些情況下，例如應用程式使用 ODBC 連線時，資料指標可能會是唯一可行的解決方案。不過我們建議您盡量使用以下替代方式：
+ 使用 [UNLOAD](r_UNLOAD.md) 匯出大型資料表。使用 UNLOAD 時，運算節點會平行運作，將資料直接傳輸至 Amazon Simple Storage Service 上的資料檔案。如需詳細資訊，請參閱[在 Amazon Redshift 中卸載資料](c_unloading_data.md)。
+ 在您的用戶端應用程式中設定 JDBC 擷取大小參數。若您使用 JDBC 連線且發生用戶端記憶體不足的錯誤，您可以藉由設定 JDBC 擷取大小參數，讓用戶端分小批擷取結果集。如需詳細資訊，請參閱[設定 JDBC 擷取大小參數](set-the-JDBC-fetch-size-parameter.md)。

## DECLARE CURSOR 範例
<a name="declare-example"></a>

以下範例會宣告名為 LOLLAPALOOZA 的資料指標來選取 Lollapalooza 活動的銷售資訊，然後使用資料指標從結果集擷取資料列：

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

下列範例會使用資料表中的所有結果在參考游標上循環：

```
CREATE TABLE tbl_1 (a int, b int);
INSERT INTO tbl_1 values (1, 2),(3, 4);

CREATE OR REPLACE PROCEDURE sp_cursor_loop() AS $$
DECLARE
    target record;
    curs1 cursor for select * from tbl_1;
BEGIN
    OPEN curs1;
    LOOP
        fetch curs1 into target;
        exit when not found;
        RAISE INFO 'a %', target.a;
    END LOOP;
    CLOSE curs1;
END;
$$ LANGUAGE plpgsql;

CALL sp_cursor_loop();
         
SELECT message 
   from svl_stored_proc_messages 
   where querytxt like 'CALL sp_cursor_loop()%';
         
  message
----------
      a 1
      a 3
```

# DELETE
<a name="r_DELETE"></a>

刪除資料表中的資料列。

**注意**  
單一 SQL 陳述式的大小上限為 16 MB。

## 語法
<a name="r_DELETE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
DELETE [ FROM ] { table_name | materialized_view_name }
    [ { USING } table_name, ... ]
    [ WHERE condition ]
```

## Parameters
<a name="r_DELETE-parameters"></a>

WITH 子句  
指定一個或多個 *common-table-expressions* 的選用子句。請參閱 [WITH 子句](r_WITH_clause.md)。

FROM  
FROM 關鍵字為選用，但指定了 USING 子句時除外。`delete from event;` 和 `delete event;` 這兩個陳述式是相同的操作，會將 EVENT 資料表的所有資料列移除。  
若要刪除資料表中的所有資料列，請對資料表執行 [TRUNCATE](r_TRUNCATE.md)。TRUNCATE 比 DELETE 更有效率，而且不需要 VACUUM 和 ANALYZE。不過請注意，TRUNCATE 會遞交其執行所在的交易。

 *table\$1name*   
暫時性或持久性資料表。只有資料表的擁有者，或具有資料表 DELETE 權限的使用者可從資料表中刪除資料列。  
請考慮使用 TRUNCATE 命令在大型資料表上快速執行非限定的刪除操作；請參閱 [TRUNCATE](r_TRUNCATE.md)。  
從資料表中刪除大量資料列之後：  
+ 清空資料表以回收儲存空間和重新排序資料列。
+ 分析資料表以更新查詢規劃器的統計資訊。

 *materialized\$1view\$1name*   
具體化視觀表。DELETE 陳述式可在用於 [將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md) 的具體化視觀表上作用。只有具體化視觀表的擁有者或在具體化視觀表上具有 DELETE 權限的使用者，才能從中刪除資料列。  
您無法使用未授予使用者 IGNORE RLS 權限的資料列層級安全性 (RLS) 政策，在具體化視觀表上執行 DELETE 來進行串流擷取。有一個例外情況：如果執行 DELETE 的使用者已授予 IGNORE RLS，則可成功執行。如需詳細資訊，請參閱 [RLS 政策擁有權和管理](https://docs.aws.amazon.com/redshift/latest/dg/t_rls_ownership.html)。

USING *table\$1name*, ...  
USING 關鍵字會在 WHERE 子句條件中參考其他資料表時，用來加入資料表清單。例如，以下陳述式會從 EVENT 資料表中，刪除所有滿足 EVENT 和 SALES 資料表聯結條件的資料列。SALES 資料表必須在 FROM 清單中明確命名：  

```
delete from event using sales where event.eventid=sales.eventid;
```
若您在 USING 子句中重複目標資料表名稱，則 DELETE 操作會執行自我聯結。您可以在 WHERE 子句中使用子查詢來取代 USING 語法，做為撰寫相同查詢的替代方式。

WHERE *condition*   
此選用子句會限制僅刪除符合條件的資料列。例如，條件可以是資料欄上的限制、聯結條件，或根據查詢結果的條件。查詢可參考 DELETE 命令的目標以外的資料表。例如：  

```
delete from t1
where col1 in(select col2 from t2);
```
如未指定任何條件，則會刪除資料表中的所有資料列。

## 使用須知
<a name="r_DELETE-usage"></a>
+ DELETE 操作在連線至下列任一項的 Amazon Redshift 串流具體化視觀表上執行時，會保留獨佔鎖定：
  +  Amazon Kinesis Data Stream 
  +  Amazon Managed Streaming for Apache Kafka 主題 
  +  支援的外部串流，例如 Confluent Cloud Kafka 主題 

  如需詳細資訊，請參閱[將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md)。

## 範例
<a name="r_DELETE-examples"></a>

從 CATEGORY 資料表刪除所有資料列：

```
delete from category;
```

從 CATEGORY 資料表刪除 CATID 值介於 0 和 9 之間的資料列：

```
delete from category
where catid between 0 and 9;
```

從 LISTING 資料表刪除其 SELLERID 值不存在 SALES 資料表中的資料列：

```
delete from listing
where listing.sellerid not in(select sales.sellerid from sales);
```

以下兩個查詢都會根據 EVENT 資料表的聯結和對 CATID 資料欄的額外限制，從 CATEGORY 資料表刪除一個資料列：

```
delete from category
using event
where event.catid=category.catid and category.catid=9;
```

```
delete from category
where catid in
(select category.catid from category, event
where category.catid=event.catid and category.catid=9);
```

下列查詢會刪除 `mv_cities` 具體化視觀表中的所有資料列。此範例中的具體化視觀表名稱為範例：

```
delete from mv_cities;
```

# DESC DATASHARE
<a name="r_DESC_DATASHARE"></a>

顯示使用 ALTER DATASHARE 新增至資料共用中的資料庫物件清單。Amazon Redshift 會顯示資料表、檢視和函數的名稱、資料庫、結構描述及類型。

您可以使用系統檢視找到有關資料共用物件的其他資訊。如需詳細資訊，請參閱 [SVV\$1DATASHARE\$1OBJECTS](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARE_OBJECTS.html) 和 [SVV\$1DATASHARES](https://docs.aws.amazon.com/redshift/latest/dg/r_SVV_DATASHARES.html)。

## 語法
<a name="r_DESC_DATASHARE-synopsis"></a>

```
DESC DATASHARE datashare_name [ OF [ ACCOUNT account_id ] NAMESPACE namespace_guid ]
```

## Parameters
<a name="r_DESC_DATASHARE-parameters"></a>

 *datashare\$1name*   
資料共用的名稱。

NAMESPACE *namespace\$1guid*   
指定資料共用所用命名空間的值。當您以取用者叢集管理員身分執行 DESC DATAHSARE 時，請指定 NAMESPACE 參數以檢視輸入資料共用。

ACCOUNT *account\$1id*  
指定資料共用所屬帳戶的值。

## 使用須知
<a name="r_DESC_DATASHARE-usage"></a>

身為消費者帳戶管理員，當您執行 DESC DATASHARE 以查看 AWS 帳戶中的傳入資料共用時，請指定 NAMESPACE 選項。當您執行 DESC DATASHARE 來查看跨 AWS 帳戶的傳入資料共用時，請指定帳戶和 NAMESPACE 選項。

## 範例
<a name="r_DESC_DATASHARE-examples"></a>

下列範例顯示生產者叢集上有關輸出資料共用的資訊。

```
DESC DATASHARE salesshare;

producer_account |          producer_namespace           | share_type  | share_name   | object_type |        object_name           |  include_new
-----------------+---------------------------------------+-------------+--------------+-------------+------------------------------+--------------
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | TABLE       | public.tickit_sales_redshift |
 123456789012    | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d  | OUTBOUND    |  salesshare  | SCHEMA      | public                       |   t
```

下列範例顯示取用者叢集上有關輸入資料共用的資訊。

```
DESC DATASHARE salesshare of ACCOUNT '123456789012' NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';

 producer_account |          producer_namespace          | share_type | share_name | object_type |         object_name          |  include_new
------------------+--------------------------------------+------------+------------+-------------+------------------------------+--------------
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | table       | public.tickit_sales_redshift |
 123456789012     | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d | INBOUND    | salesshare | schema      | public                       |
(2 rows)
```

# DESC IDENTITY PROVIDER
<a name="r_DESC_IDENTITY_PROVIDER"></a>

顯示身分提供者的相關資訊。只有超級使用者可以描述身分提供者。

## 語法
<a name="r_DESC_IDENTITY_PROVIDER-synopsis"></a>

```
DESC IDENTITY PROVIDER identity_provider_name
```

## Parameters
<a name="r_DESC_IDENTITY_PROVIDER-parameters"></a>

 *identity\$1provider\$1name*   
身分提供者的名稱。

## 範例
<a name="r_DESC_IDENTITY_PROVIDER-examples"></a>

下列範例顯示身分提供者的相關資訊。

```
DESC IDENTITY PROVIDER azure_idp;
```

輸出範例。

```
  uid   |   name    | type  |              instanceid              | namespc |                                                                                                                                                 params                                                                                                                                                  | enabled
--------+-----------+-------+--------------------------------------+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+---------
 126692 | azure_idp | azure | e40d4bb2-7670-44ae-bfb8-5db013221d73 | aad     | {"issuer":"https://login.microsoftonline.com/e40d4bb2-7670-44ae-bfb8-5db013221d73/v2.0", "client_id":"871c010f-5e61-4fb1-83ac-98610a7e9110", "client_secret":'', "audience":["https://analysis.windows.net/powerbi/connector/AmazonRedshift", "https://analysis.windows.net/powerbi/connector/AWSRDS"]} | t
(1 row)
```

# DETACH MASKING POLICY
<a name="r_DETACH_MASKING_POLICY"></a>

從資料欄中分離已附加的動態資料遮罩政策。如需動態資料遮罩的相關資訊，請參閱 [動態資料遮罩](t_ddm.md)。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以分離遮罩政策。

## 語法
<a name="r_DETACH_MASKING_POLICY-synopsis"></a>

```
DETACH MASKING POLICY
{
  policy_name ON table_name
  | database_name.policy_name ON database_name.schema_name.table_name
}
( output_column_names )
FROM { user_name | ROLE role_name | PUBLIC };
```

## Parameters
<a name="r_DETACH_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
欲分離的遮罩政策名稱。

database\$1name  
建立政策和關係的資料庫名稱。政策和關係必須位於相同的資料庫。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

schema\$1name  
關係所屬的結構描述名稱。

 *table\$1name*   
要將遮罩政策分離的資料表名稱。

*output\$1column\$1names*   
已附加遮罩政策的資料欄名稱。

*user\$1name*   
已附加遮罩政策的使用者名稱。  
您只能在單一 DETACH MASKING POLICY 陳述式中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

*role\$1name*   
已附加遮罩政策的角色名稱。  
您只能在單一 DETACH MASKING POLICY 陳述式中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

*PUBLIC*   
顯示政策已附加至資料表中的所有使用者。  
您只能在單一 DETACH MASKING POLICY 陳述式中設定 user\$1name、role\$1name 和 PUBLIC 中的其中一個。

如需在 Amazon Redshift 聯合許可目錄上使用 DETACH MASKING POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

# DETACH RLS POLICY
<a name="r_DETACH_RLS_POLICY"></a>

將資料表上的資料列層級安全性政策從一或多個使用者或角色中分離。

超級使用者和具有 `sys:secadmin` 角色的使用者或角色可以分離政策。

## 語法
<a name="r_DETACH_RLS_POLICY-synopsis"></a>

```
DETACH RLS POLICY
{
  policy_name ON [TABLE] table_name [, ...]
  | database_name.policy_name ON [TABLE] database_name.schema_name.table_name [, ...]
}
FROM { user_name | ROLE role_name | PUBLIC } [, ...];
```

## Parameters
<a name="r_DETACH_RLS_POLICY-parameters"></a>

 *policy\$1name*   
政策的名稱。

database\$1name  
建立政策和關係的資料庫名稱。政策和關係必須位於相同的資料庫。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

schema\$1name  
關係所屬的結構描述名稱。

table\$1name  
連接至關係之資料列層級安全政策的名稱。

FROM \$1 *user\$1name* \$1 ROLE *role\$1name* \$1 PUBLIC\$1 [, ...]  
指定政策是否要從一或多個指定的使用者或角色中分離。

如需在 Amazon Redshift 聯合許可目錄中使用 DETACH RLS POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

## 使用須知
<a name="r_DETACH_RLS_POLICY-usage"></a>

使用 DETACH RLS POLICY 陳述式時，請注意以下內容：
+ 您可以從關係、使用者、角色或公用項目中分離政策。

## 範例
<a name="r_DETACH_RLS_POLICY-examples"></a>

下列範例會將資料表上的政策與角色分離。

```
DETACH RLS POLICY policy_concerts ON tickit_category_redshift FROM ROLE analyst, ROLE dbadmin;
```

# DROP DATABASE
<a name="r_DROP_DATABASE"></a>

捨棄資料庫。

您無法在交易區塊 (BEGIN ... END) 內執行 DROP DATABASE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

## 語法
<a name="r_DROP_DATABASE-synopsis"></a>

```
DROP DATABASE database_name [ FORCE ]
```

## Parameters
<a name="r_DROP_DATABASE-parameters"></a>

 *database\$1name*   
要捨棄之資料庫的名稱。您無法捨棄 dev、padb\$1harvest、template0、template1 或 sys:internal 資料庫，也無法捨棄目前的資料庫。  
若要捨棄外部資料庫，請捨棄外部結構描述。如需詳細資訊，請參閱[DROP SCHEMA](r_DROP_SCHEMA.md)。

 FORCE   
當您指定 FORCE 時，DROP DATABASE 會在捨棄資料庫之前，嘗試終止作用中的連線。如果所有作用中連線都在逾時內成功終止，則捨棄會繼續。如果並非所有連線都終止，則命令會擲回錯誤。

## DROP DATABASE 使用須知
<a name="r_DROP_DATABASE_usage"></a>

使用 DROP DATABASE 陳述式時，請考慮下列事項︰
+ 一般而言，我們不建議使用 DROP DATABASE 陳述式來捨棄包含 AWS Data Exchange 資料共用的資料庫。如果這樣做，則可以存取資料共用的 AWS 帳戶 將失去存取權限。執行此類修改可能會違反 AWS Data Exchange中的資料產品條款。

  下列範例顯示當包含 AWS Data Exchange 資料共用的資料庫遭到捨棄時發生的錯誤。

  ```
  DROP DATABASE test_db;
  ERROR:   Drop of database test_db that contains ADX-managed datashare(s) requires session variable datashare_break_glass_session_var to be set to value 'ce8d280c10ad41'
  ```

  若要允許捨棄資料庫，請設定下列變數，然後再次執行 DROP DATABASE 陳述式。

  ```
  SET datashare_break_glass_session_var to 'ce8d280c10ad41';
  ```

  ```
  DROP DATABASE test_db;
  ```

  在這種情況下，Amazon Redshift 會產生隨機的一次性值來設定工作階段變數，以允許對包含 AWS Data Exchange 資料共用的資料庫執行 DROP DATABASE。

## 範例
<a name="r_DROP_DATABASE-examples"></a>

以下範例會捨棄名為 TICKIT\$1TEST 的資料庫：

```
drop database tickit_test;
```

# DROP DATASHARE
<a name="r_DROP_DATASHARE"></a>

捨棄資料共用。此命令無法還原。

只有超級使用者或資料共用擁有者可以捨棄資料共用。

## 所需權限
<a name="r_DROP_DATASHARE-privileges"></a>

以下是 DROP DATASHARE 所需的權限：
+ 超級使用者
+ 具有 DROP DATASHARE 權限的使用者
+ 資料共用擁有者

## 語法
<a name="r_DROP_DATASHARE-synopsis"></a>

```
DROP DATASHARE datashare_name;
```

## Parameters
<a name="r_DROP_DATASHARE-parameters"></a>

 *datashare\$1name*   
要捨棄的資料共用名稱。

## DROP DATASHARE 使用須知
<a name="r_DROP_DATASHARE_usage"></a>

使用 DROP DATASHARE 陳述式時，請考慮下列事項︰
+ 一般而言，建議您不要使用 DROP DATASHARE 陳述式捨棄 AWS Data Exchange 資料共用。如果您這麼做， AWS 帳戶 可存取資料共用的 會失去存取權。執行此類修改可能會違反 AWS Data Exchange中的資料產品條款。

  下列範例顯示捨棄 AWS Data Exchange 資料共用時的錯誤。

  ```
  DROP DATASHARE salesshare;
  ERROR:  Drop of ADX-managed datashare salesshare requires session variable datashare_break_glass_session_var to be set to value '620c871f890c49'
  ```

  若要允許捨棄 AWS Data Exchange 資料共用，請設定下列變數，然後再次執行 DROP DATASHARE 陳述式。

  ```
  SET datashare_break_glass_session_var to '620c871f890c49';
  ```

  ```
  DROP DATASHARE salesshare;
  ```

  在此情況下，Amazon Redshift 會產生隨機的一次性值來設定工作階段變數，以允許 AWS Data Exchange 資料共用的 DROP DATASHARE。

## 範例
<a name="r_DROP_DATASHARE-examples"></a>

以下範例會捨棄名為 `salesshare` 的資料共用。

```
DROP DATASHARE salesshare;
```

# DROP EXTERNAL VIEW
<a name="r_DROP_EXTERNAL_VIEW"></a>

從資料庫中捨棄外部檢視。捨棄外部檢視後會將其從檢視相關聯的所有 SQL 引擎中移除，例如 Amazon Athena 和 Amazon EMR Spark。此命令無法反轉。如需有關 Data Catalog 檢視的詳細資訊，請參閱 [AWS Glue Data Catalog 檢視](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。

## 語法
<a name="r_DROP_EXTERNAL_VIEW-synopsis"></a>

```
DROP EXTERNAL VIEW schema_name.view_name [ IF EXISTS ]
{catalog_name.schema_name.view_name | awsdatacatalog.dbname.view_name | external_schema_name.view_name}
```

## Parameters
<a name="r_DROP_EXTERNAL_VIEW-parameters"></a>

 *schema\$1name.view\$1name*   
連接到 AWS Glue 資料庫的結構描述，後面接著檢視的名稱。

IF EXISTS  
只有在檢視存在時才捨棄檢視。

catalog\$1name.schema\$1name.view\$1name \$1 awsdatacatalog.dbname.view\$1name \$1 external\$1schema\$1name.view\$1name  
捨棄視觀表時所使用的結構描述標記法。您可以指定 使用您建立的 AWS Glue Data Catalog Glue 資料庫，或您建立的外部結構描述。如需詳細資訊，請參閱[CREATE DATABASE](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_DATABASE.html) 和 [CREATE EXTERNAL SCHEMA](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_EXTERNAL_SCHEMA.html)。

 *query\$1definition*   
Amazon Redshift 執行以變更檢視的 SQL 查詢的定義。

## 範例
<a name="r_DROP_EXTERNAL_VIEW-examples"></a>

下列範例會捨棄名為 sample\$1schema.glue\$1data\$1catalog\$1view 的 Data Catalog 視觀表。

```
DROP EXTERNAL VIEW sample_schema.glue_data_catalog_view IF EXISTS
```

# DROP FUNCTION
<a name="r_DROP_FUNCTION"></a>

從資料庫移除使用者定義的函數 (UDF)。必須指定函數的簽章 (或引數資料類型的清單)，因為可能有多個同名但簽章不同的函數存在。您無法捨棄 Amazon Redshift 內建函數。

此命令無法還原。

## 所需權限
<a name="r_DROP_FUNCTION-privileges"></a>

以下是 DROP FUNCTION 所需的權限：
+ 超級使用者
+ 具有 DROP FUNCTION 權限的使用者
+ 函數擁有者

## 語法
<a name="r_DROP_FUNCTION-synopsis"></a>

```
DROP FUNCTION name
( [arg_name] arg_type   [, ...] )
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_FUNCTION-parameters"></a>

 *name*   
要移除的函數名稱。

 *arg\$1name*   
輸入引數的名稱。DROP FUNCTION 會忽略引數名稱，因為只需要引數資料類型即可判斷函數的身分。

 *arg\$1type*   
輸入引數的資料類型。您可以提供最多包含 32 種資料類型的逗號分隔清單。

 CASCADE   
此關鍵字指定自動捨棄取決於函數的物件，例如檢視。  
若要建立不相依於函數的檢視，請在檢視定義中包含 WITH NO SCHEMA BINDING 子句。如需詳細資訊，請參閱[CREATE VIEW](r_CREATE_VIEW.md)。

 RESTRICT   
此關鍵字指定，若有任何物件取決於函數，則不捨棄函數並傳回訊息。這是預設動作。

## 範例
<a name="r_DROP_FUNCTION-examples"></a>

下列範例會捨棄名為 `f_sqrt` 的函數：

```
drop function f_sqrt(int);
```

若要移除有相依性的函數，請使用 CASCADE 選項，如下所範例所示：

```
drop function f_sqrt(int)cascade;
```

# DROP GROUP
<a name="r_DROP_GROUP"></a>

刪除使用者群組。此命令無法還原。此命令不會刪除群組中的個別使用者。

請參閱 DROP USER 以刪除個別使用者。

## 語法
<a name="r_DROP_GROUP-synopsis"></a>

```
DROP GROUP name
```

## 參數
<a name="r_DROP_GROUP-parameter"></a>

 *name*   
要刪除的使用者群組名稱。

## 範例
<a name="r_DROP_GROUP-example"></a>

以下範例會刪除 `guests` 使用者群組：

```
DROP GROUP guests;
```

如果群組有物件上的任何權限，則您無法捨棄群組。如果您嘗試捨棄這類群組，則會收到下列錯誤。

```
ERROR: group "guests" can't be dropped because the group has a privilege on some object
```

如果群組具有物件的權限，則您必須先撤銷權限，再捨棄群組。若要尋找 `guests` 群組具有其權限的物件，請使用下列範例。如需範例中所使用中繼資料檢視的詳細資訊，請參閱 [SVV\$1RELATION\$1PRIVILEGES](https://docs.aws.amazon.com//redshift/latest/dg/r_SVV_RELATION_PRIVILEGES.html)。

```
SELECT DISTINCT namespace_name, relation_name, identity_name, identity_type 
FROM svv_relation_privileges
WHERE identity_type='group' AND identity_name='guests';

+----------------+---------------+---------------+---------------+
| namespace_name | relation_name | identity_name | identity_type |
+----------------+---------------+---------------+---------------+
| public         | table1        | guests        | group         |
+----------------+---------------+---------------+---------------+
| public         | table2        | guests        | group         |
+----------------+---------------+---------------+---------------+
```

下列範例會撤銷 `public` 使用者群組的 `guests` 結構描述中所有資料表的所有權限，然後捨棄群組。

```
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM GROUP guests;
DROP GROUP guests;
```

# DROP IDENTITY PROVIDER
<a name="r_DROP_IDENTITY_PROVIDER"></a>

刪除身分提供者。此命令無法還原。只有超級使用者可以捨棄身分提供者。

## 語法
<a name="r_DROP_IDENTITY_PROVIDER-synopsis"></a>

```
DROP IDENTITY PROVIDER identity_provider_name [ CASCADE ]
```

## 參數
<a name="r_DROP_IDENTITY_PROVIDER-parameter"></a>

 *identity\$1provider\$1name*   
要刪除的身分提供者名稱。

 CASCADE   
刪除身分提供者時，刪除附加至身分提供者的使用者和角色。

## 範例
<a name="r_DROP_IDENTITY_PROVIDER-example"></a>

下列範例會刪除 *oauth\$1provider* 身分提供者。

```
DROP IDENTITY PROVIDER oauth_provider;
```

如果您捨棄身分提供者，某些使用者可能無法登入，或使用設定為使用身分提供者的用戶端工具。

# DROP LIBRARY
<a name="r_DROP_LIBRARY"></a>

從資料庫移除自訂 Python 程式庫。只有程式庫擁有者或超級使用者可以捨棄程式庫。

DROP LIBRARY 無法在交易區塊內 (BEGIN … END) 執行。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

此命令無法還原。DROP LIBRARY 命令會立即遞交。如果倚賴程式庫的 UDF 同時執行，UDF 可能會失敗，即使 UDF 是在交易內執行也一樣。

如需詳細資訊，請參閱[CREATE LIBRARY](r_CREATE_LIBRARY.md)。

## 所需權限
<a name="r_DROP_LIBRARY-privileges"></a>

以下是 DROPLIBRARY 所需的權限：
+ 超級使用者
+ 具有 DROP LIBRARY 權限的使用者
+ 程式庫擁有者

## 語法
<a name="r_DROP_LIBRARY-synopsis"></a>

```
DROP LIBRARY library_name
```

## Parameters
<a name="r_DROP_LIBRARY-parameters"></a>

 *library\$1name*   
程式庫的名稱。

# DROP MASKING POLICY
<a name="r_DROP_MASKING_POLICY"></a>

從所有資料庫中捨棄動態資料遮罩政策。您無法捨棄仍然附加至一或多個資料表的遮罩政策。如需動態資料遮罩的相關資訊，請參閱 [動態資料遮罩](t_ddm.md)。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以捨棄遮罩政策。

## 語法
<a name="r_DROP_MASKING_POLICY-synopsis"></a>

```
DROP MASKING POLICY { policy_name | database_name.policy_name };
```

## Parameters
<a name="r_DROP_MASKING_POLICY-parameters"></a>

 *policy\$1name*   
要捨棄的遮罩政策名稱。

database\$1name  
要從中捨棄政策的資料庫名稱。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

如需在 Amazon Redshift 聯合許可目錄上使用 DROP MASKING POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

# DROP MODEL
<a name="r_DROP_MODEL"></a>

從資料庫移除模型。只有模型擁有者或超級使用者可以捨棄模型。

DROP MODEL 也會刪除從此模型衍生的所有相關聯預測函數、與該模型相關的所有 Amazon Redshift 成品，以及與模型相關的所有 Amazon S3 資料。雖然模型仍在 Amazon SageMaker AI 中進行訓練，但 DROP MODEL 將會取消這些操作。

此命令無法還原。DROP MODEL 命令會立即遞交。

## 所需的許可
<a name="r_DROP_MODEL-privileges"></a>

以下是 DROP MODEL 所需的許可：
+ 超級使用者
+ 具有 DROP MODEL 許可的使用者
+ 模型擁有者
+ 結構描述擁有者

## 語法
<a name="r_DROP_MODEL-synopsis"></a>

```
DROP MODEL [ IF EXISTS ] model_name
```

## Parameters
<a name="r_DROP_MODEL-parameters"></a>

 *IF EXISTS*   
此子句會指出，若指定的結構描述已存在，則命令不應進行任何變更，且應傳回結構描述存在的訊息。

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

## 範例
<a name="r_DROP_MODEL-examples"></a>

下列範例會捨棄模型 demo\$1ml.customer\$1churn。

```
DROP MODEL demo_ml.customer_churn
```

# DROP MATERIALIZED VIEW
<a name="materialized-view-drop-sql-command"></a>

移除具體化檢視。

如需具體化檢視的相關資訊，請參閱 [Amazon Redshift 中的具體化視觀表](materialized-view-overview.md)。

## 語法
<a name="mv_DROP_MATERIALIZED_VIEW-synopsis"></a>

```
DROP MATERIALIZED VIEW [ IF EXISTS ] mv_name [, ... ] [ CASCADE | RESTRICT ]
```

## Parameters
<a name="mv_DROP_MATERIALIZED_VIEW-parameters"></a>

IF EXISTS  
指定要檢查具名具體化檢視是否存在的子句。如果具體化檢視不存在，則 `DROP MATERIALIZED VIEW` 命令會傳回錯誤訊息。這個子句在編寫指令碼時相當有用，可用來避免指令碼在您卸除不存在的具體化檢視時失敗。

*mv\$1name*  
要卸除的具體化檢視名稱。

CASCADE  
此子句指出，自動捨棄具體化視觀表依賴的物件，例如其他檢視。

RESTRICT  
此子句指出，若有任何物件相依於檢視，則不捨棄具體化視觀表。這是預設值。

## 使用須知
<a name="mv_DROP_MATERIALIZED_VIEW-usage"></a>

只有具體化檢視的擁有者可以在該檢視上使用 `DROP MATERIALIZED VIEW`。超級使用者或特別被授予 DROP 權限的使用者可以是此狀況的例外。

當您為具體化視觀表撰寫捨棄陳述式，且存在名稱相符的檢視時，這會導致錯誤，並指示您使用 DROP VIEW。即使在您使用 `DROP MATERIALIZED VIEW IF EXISTS` 的情況下，也會發生錯誤。

## 範例
<a name="mv_DROP_MATERIALIZED_VIEW-examples"></a>

以下範例會卸除 `tickets_mv` 具體化檢視。

```
DROP MATERIALIZED VIEW tickets_mv;
```

# DROP PROCEDURE
<a name="r_DROP_PROCEDURE"></a>

捨棄程序。若要捨棄程序，程序名稱和輸入引數資料類型 (簽章) 都是必要的。您可以選擇性包含完整引數資料類型，包括 OUT 引數。若要尋找程序的簽章，請使用 [SHOW PROCEDURE](r_SHOW_PROCEDURE.md) 命令。如需程序簽章的相關資訊，請參閱 [PG\$1PROC\$1INFO](r_PG_PROC_INFO.md)。

## 所需權限
<a name="r_DROP_PROCEDURE-privileges"></a>

以下是 DROP PROCEDURE 所需的權限：
+ 超級使用者
+ 具有 DROP PROCEDURE 權限的使用者
+ 程序擁有者

## 語法
<a name="r_DROP_PROCEDURE-synopsis"></a>

```
DROP PROCEDURE sp_name ( [ [ argname ] [ argmode ] argtype [, ...] ] )
```

## Parameters
<a name="r_DROP_PROCEDURE-parameters"></a>

 *sp\$1name*   
要移除的程序的名稱。

 *argname*   
輸入引數的名稱。DROP PROCEDURE 會忽略引數名稱，因為只需要引數資料類型即可判斷程序的身分。

 *argmode*   
引數的模式，可以是 IN、OUT 或 INOUT。OUT 引數是選用的，因為不用來識別預存程序。

 *argtype*   
輸入引數的資料類型。如需支援的資料類型清單，請參閱 [資料類型](c_Supported_data_types.md)。

## 範例
<a name="r_DROP_PROCEDURE-examples"></a>

下列範例捨棄名為 `quarterly_revenue` 的預存程序。

```
DROP PROCEDURE quarterly_revenue(volume INOUT bigint, at_price IN numeric,result OUT int);
```

# DROP RLS POLICY
<a name="r_DROP_RLS_POLICY"></a>

捨棄所有資料庫中所有資料表的資料列層級安全性政策。

超級使用者和具有 sys:secadmin 角色的使用者或角色可以捨棄政策。

## 語法
<a name="r_DROP_RLS_POLICY-synopsis"></a>

```
DROP RLS POLICY [ IF EXISTS ] 
{ policy_name | database_name.policy_name }
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_RLS_POLICY-parameters"></a>

 *IF EXISTS*   
指出指定政策是否已存在的子句。

 *policy\$1name*   
政策的名稱。

database\$1name  
要從中捨棄政策的資料庫名稱。資料庫可以是連線的資料庫或支援 Amazon Redshift 聯合許可的資料庫。

 *CASCADE*   
指示在捨棄政策之前，自動將政策從所有附加的資料表分離的子句。

 *RESTRICT*   
指出政策在附加至某些資料表時不要捨棄政策。這是預設值。

如需在 Amazon Redshift 聯合許可目錄上使用 DROP RLS POLICY，請參閱[使用 Amazon Redshift 聯合許可管理存取控制](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html)。

## 範例
<a name="r_DROP_RLS_POLICY-examples"></a>

下列範例會捨棄資料列層級安全性政策。

```
DROP RLS POLICY policy_concerts;
```

# DROP ROLE
<a name="r_DROP_ROLE"></a>

從資料庫中移除角色。只有建立角色的角色擁有者、具有 WITH ADMIN 選項的使用者或超級使用者可以捨棄角色。

如果角色已授予使用者或相依於此角色的其他角色，則您無法捨棄角色。

## 所需權限
<a name="r_DROP_ROLE-privileges"></a>

以下是 DROP ROLE 所需的權限：
+ 超級使用者
+ 角色擁有者，也就是建立角色的使用者，或是已被授予角色且該角色具有 WITH ADMIN OPTION 權限的使用者。

## 語法
<a name="r_DROP_ROLE-synopsis"></a>

```
DROP ROLE role_name [ FORCE | RESTRICT ] 
```

## Parameters
<a name="r_DROP_ROLE-parameters"></a>

*role\$1name*  
角色的名稱。

[ FORCE \$1 RESTRICT ]  
預設設定為 RESTRICT。當您嘗試捨棄繼承另一個角色的角色時，Amazon Redshift 會擲回錯誤。使用 FORCE 移除所有角色指派 (如果有的話)。

## 範例
<a name="r_DROP_ROLE-examples"></a>

下列範例會捨棄 `sample_role` 角色。

```
DROP ROLE sample_role FORCE;
```

下列範例會嘗試捨棄角色 sample\$1role1，該角色已透過預設 RESTRICT 選項授予使用者。

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
DROP ROLE sample_role1;
ERROR:  cannot drop this role since it has been granted on a user
```

若要成功捨棄已授予使用者的 sample\$1role1，請使用 FORCE 選項。

```
DROP ROLE sample_role1 FORCE;
```

下列範例會嘗試捨棄角色 sample\$1role2，該角色已透過預設 RESTRICT 選項，讓另一個角色與其相依。

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO sample_role2;
DROP ROLE sample_role2;
ERROR:  cannot drop this role since it depends on another role
```

若要成功捨棄具有其他相依角色的 sample\$1role2，請使用 FORCE 選項。

```
DROP ROLE sample_role2 FORCE;
```

# DROP SCHEMA
<a name="r_DROP_SCHEMA"></a>

刪除結構描述。針對外部結構描述，您也可以捨棄與結構描述相關聯的外部資料庫。此命令無法還原。

## 所需權限
<a name="r_DROP_SCHEMA-privileges"></a>

以下是 DROP SCHEMA 所需的權限：
+ 超級使用者
+ 結構描述擁有者
+ 具有 DROP SCHEMA 權限的使用者

## 語法
<a name="r_DROP_SCHEMA-synopsis"></a>

```
DROP SCHEMA [ IF EXISTS ] name [, ...]
[ DROP EXTERNAL DATABASE ]
[ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_SCHEMA-parameters"></a>

IF EXISTS  
此子句會指出，若指定的結構描述不存在，則命令不應進行任何變更，且應傳回結構描述不存在的訊息，而不是在發生錯誤的情況下終止。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 DROP SCHEMA 對不存在的結構描述執行而失敗。

 *name*   
要捨棄的結構描述名稱。您可以指定多個結構描述名稱，以逗號分隔。

 DROP EXTERNAL DATABASE   
此子句指出是否捨棄外部結構描述，如果存在則捨棄與外部結構描述相關聯的外部資料庫。如果外部資料庫不存在，此命令會傳回訊息，說明外部資料庫不存在。如果已捨棄多個外部資料庫，則會捨棄與指定結構描述相關聯的所有資料庫。  
如果外部資料庫包含相依物件 (例如資料表)，請併入 CASCADE 選項以同時捨棄相依物件。  
捨棄外部資料庫時，也會捨棄資料庫中與資料庫相關聯的任何其他外部結構描述。也會捨棄在使用資料庫的其他外部結構描述中所定義的資料表。  
DROP EXTERNAL DATABASE 不支援儲存在 HIVE 中繼存放區的外部資料庫。

CASCADE  
此關鍵字指出自動捨棄結構描述中的所有物件。如果指定 DROP EXTERNAL DATABASE，則也會捨棄外部資料庫中的所有物件。

RESTRICT  
此關鍵字指出，若結構描述或外部資料庫含任何物件則不捨棄。這是預設動作。

## 範例
<a name="r_DROP_SCHEMA-example"></a>

以下範例會刪除名為 S\$1SALES 的結構描述。此範例使用 RESTRICT 做為安全機制，如此一來，若結構描述包含任何物件，就不會將其刪除。在此情況下，您需要先刪除結構描述物件，再刪除結構描述。

```
drop schema s_sales restrict;
```

下列範例會刪除名為 S\$1SALES 的結構描述，以及相依於該結構描述的所有物件。

```
drop schema s_sales cascade;
```

下列範例會捨棄 S\$1SALES 結構描述 (如存在的話)，或不執行任何動作，並於結構描述不存在時傳回訊息。

```
drop schema if exists s_sales;
```

以下範例會刪除名為 S\$1SPECTRUM 的外部結構描述，並建立與其相關聯的外部資料庫。此範例使用 RESTRICT，如此一來，若結構描述和資料庫包含任何物件，就不會將其刪除。在此情況下，您會需要先刪除相依物件，再刪除結構描述和資料庫。

```
drop schema s_spectrum drop external database restrict;
```

以下範例會刪除名為多個結構描述和與其相關聯的外部資料庫，以及任何相依物件。

```
drop schema s_sales, s_profit, s_revenue drop external database cascade;
```

# DROP TABLE
<a name="r_DROP_TABLE"></a>

從資料庫移除資料表。

如果您要嘗試清空資料表中的資料列，但不移除資料表，請使用 DELETE 或 TRUNCATE 命令。

DROP TABLE 會移除目標資料表上存在的限制條件。使用單一 DROP TABLE 命令即可移除多個資料表。

您無法在交易內 (BEGIN … END) 對外部資料表執行 DROP TABLE。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

若要尋找將 DROP 權限授予群組的範例，請參閱 GRANT [範例](r_GRANT-examples.md)。

## 所需權限
<a name="r_DROP_TABLE-privileges"></a>

以下是 DROP TABLE 所需的權限：
+ 超級使用者
+ 具有 DROP TABLE 權限的使用者
+ 具有結構描述的 USAGE 權限的資料表擁有者

## 語法
<a name="r_DROP_TABLE-synopsis"></a>

```
DROP TABLE [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
```

## Parameters
<a name="r_DROP_TABLE-parameters"></a>

IF EXISTS  
此子句會指出，若指定的資料表不存在，則命令不應進行任何變更，且應傳回資料表不存在的訊息，而不是在發生錯誤的情況下終止。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 DROP TABLE 對不存在的資料表執行而失敗。

 *name*   
要捨棄的資料表名稱。

CASCADE  
此子句指出，自動捨棄取決於資料表的物件，例如檢視。  
若要建立不相依於其他資料庫物件的檢視，例如檢視和資料表，請在檢視定義中包含 WITH NO SCHEMA BINDING 子句。如需詳細資訊，請參閱[CREATE VIEW](r_CREATE_VIEW.md)。

RESTRICT   
此子句指出，若有任何物件相依於資料表，則不捨棄資料表。這是預設動作。

## 範例
<a name="r_DROP_TABLE-examples"></a>

 **丟棄無相依性的資料表** 

以下範例會建立並捨棄名為 FEEDBACK 且沒有相依性的資料表：

```
create table feedback(a int);

drop table feedback;
```

 若資料表包含的資料欄為檢視或其他資料表所參考，Amazon Redshift 會顯示以下訊息。

```
Invalid operation: cannot drop table feedback because other objects depend on it
```

 **同步丟棄兩個資料表** 

以下命令集會建立 FEEDBACK 資料表和 BUYERS 資料表，然後利用單一命令捨棄這兩個資料表：

```
create table feedback(a int);

create table buyers(a int);

drop table feedback, buyers;
```

 **丟棄具有相依性的資料表** 

以下步驟顯示如何使用 CASCADE 參數捨棄名為 FEEDBACK 的資料表。

首先，使用 CREATE TABLE 命令建立名為 FEEDBACK 的簡單資料表：

```
create table feedback(a int);
```

 接著使用 CREATE VIEW 命令建立名為 FEEDBACK\$1VIEW 的檢視，此檢視相依於 FEEDBACK 資料表：

```
create view feedback_view as select * from feedback;
```

 以下範例會捨棄 FEEDBACK 資料表，並且也會捨棄 FEEDBACK\$1VIEW 檢視，因為 FEEDBACK\$1VIEW 相依於 FEEDBACK 資料表：

```
drop table feedback cascade;
```

 **檢視資料表的相依性** 

若要傳回資料表的相依性，請使用下列範例。將 *my\$1schema* 和 *my\$1table* 取代為您自己的結構描述和資料表。

```
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;
```

若要捨棄 *my\$1table* 及其相依性，請使用以下範例。此範例也會傳回已捨棄資料表的所有相依性。

```
DROP TABLE my_table CASCADE;
         
SELECT dependent_ns.nspname as dependent_schema
, dependent_view.relname as dependent_view 
, source_ns.nspname as source_schema
, source_table.relname as source_table
, pg_attribute.attname as column_name
FROM pg_depend 
JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid 
JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid 
JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid 
JOIN pg_attribute ON pg_depend.refobjid = pg_attribute.attrelid 
    AND pg_depend.refobjsubid = pg_attribute.attnum 
JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
WHERE 
source_ns.nspname = 'my_schema'
AND source_table.relname = 'my_table'
AND pg_attribute.attnum > 0 
ORDER BY 1,2
LIMIT 10;

+------------------+----------------+---------------+--------------+-------------+
| dependent_schema | dependent_view | source_schema | source_table | column_name |
+------------------+----------------+---------------+--------------+-------------+
```

 **使用 IF EXISTS 丟棄資料表** 

下列範例會捨棄 FEEDBACK 資料表 (如存在的話)，或不執行任何動作，並於資料表不存在時傳回訊息：

```
drop table if exists feedback;
```

# DROP 範本
<a name="r_DROP_TEMPLATE"></a>

從資料庫捨棄範本。

## 所需權限
<a name="r_DROP_TEMPLATE-privileges"></a>

若要捨棄範本，您必須具有下列其中一項：
+ 超級使用者權限
+ 包含範本之結構描述上的 DROP TEMPLATE 權限和 USAGE 權限

## 語法
<a name="r_DROP_TEMPLATE-synopsis"></a>

```
DROP TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_DROP_TEMPLATE-parameters"></a>

 *database\$1name*   
（選用） 建立範本的資料庫名稱。如果未指定，則會使用目前的資料庫。

 *schema\$1name*   
（選用） 建立範本的結構描述名稱。如果未指定，則會在目前的搜尋路徑中搜尋範本。

 *template\$1name*   
要移除的範本名稱。在下列範例中，資料庫名稱為 `demo_database`，結構描述名稱為 `demo_schema`，範本名稱為 `test`。  

```
DROP TEMPLATE demo_database.demo_schema.test;
```

## 範例
<a name="r_DROP_TEMPLATE-examples"></a>

下列範例會從目前的結構描述捨棄範本 test\$1template：

```
DROP TEMPLATE test_template;
```

下列範例會從結構描述 test\$1schema 捨棄範本 test\$1template：

```
DROP TEMPLATE test_schema.test_template;
```

# DROP USER
<a name="r_DROP_USER"></a>

從資料庫捨棄使用者。使用單一 DROP USER 命令即可捨棄多個使用者。您必須是資料庫超級使用者，或具有 DROP USER 許可，才能執行此命令。

## 語法
<a name="r_DROP_USER-synopsis"></a>

```
DROP USER [ IF EXISTS ] name [, ... ]
```

## Parameters
<a name="r_DROP_USER-parameters"></a>

IF EXISTS  
此子句會指出，若指定的使用者不存在，則命令不應進行任何變更，且應傳回使用者不存在的訊息，而不是在發生錯誤的情況下終止。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 DROP USER 對不存在的使用者執行而失敗。

 *name*   
要移除的使用者名稱。您可以指定多個使用者，並以逗號分隔每個使用者名稱。

## 使用須知
<a name="r_DROP_USER-notes"></a>

您不能捨棄名為 `rdsdb` 的使用者或通常命名為 `awsuser` 或 `admin` 的資料庫管理員使用者。

若使用者擁有任何資料庫物件，像是結構描述、資料庫、資料表或檢視，或是使用者具有資料庫、資料表、資料欄或群組的任何權限，則無法捨棄使用者。如果您嘗試捨棄這類使用者，則會收到下列錯誤之一。

```
ERROR: user "username" can't be dropped because the user owns some object [SQL State=55006]

ERROR: user "username" can't be dropped because the user has a privilege on some object [SQL State=55006]
```

如需如何尋找資料庫使用者擁有之物件的詳細指示，請參閱*知識中心*內的[如何解決 Amazon Redshift 中的「使用者無法捨棄」錯誤？](https://repost.aws/knowledge-center/redshift-user-cannot-be-dropped)。

**注意**  
Amazon Redshift 在捨棄使用者之前，只會檢查目前資料庫。若使用者擁有資料庫物件，或具有其他資料庫中物件的權限，DROP USER 則不會傳回錯誤。若您捨棄的使用者擁有其他資料庫中的物件，則這些物件的擁有者會變更為「不明」。

若使用者擁有物件，請先捨棄物件或將其所有權變更為其他使用者，再捨棄原始使用者。如果使用者具有物件的權限，請先撤銷權限，再捨棄使用者。以下範例顯示在捨棄使用者前，先捨棄物件、變更所有權，以及撤銷權限。

```
drop database dwdatabase;
alter schema dw owner to dwadmin;
revoke all on table dwtable from dwuser;
drop user dwuser;
```

## 範例
<a name="r_DROP_USER-examples"></a>

以下範例會捨棄名為 paulo 的使用者：

```
drop user paulo;
```

以下範例會捨棄兩個使用者，paulo 和 martha：

```
drop user paulo, martha;
```

以下範例會捨棄使用者 paulo (如存在的話)，或不執行任何動作，並於該使用者帳戶不存在時傳回訊息：

```
drop user if exists paulo;
```

# DROP VIEW
<a name="r_DROP_VIEW"></a>

從資料庫移除檢視。使用單一 DROP VIEW 命令即可捨棄多個檢視。此命令無法還原。

## 所需權限
<a name="r_DROP_VIEW-privileges"></a>

以下是 DROP VIEW 所需的權限：
+ 超級使用者
+ 具有 DROP VIEW 權限的使用者
+ 檢視擁有者

## 語法
<a name="r_DROP_VIEW-synopsis"></a>

```
DROP VIEW [ IF EXISTS ] name [, ... ] [ CASCADE | RESTRICT ] 
```

## Parameters
<a name="r_DROP_VIEW-parameters"></a>

IF EXISTS  
此子句會指出，若指定的檢視不存在，則命令不應進行任何變更，且應傳回檢視不存在的訊息，而不是在發生錯誤的情況下終止。  
此子句在編寫指令碼時很實用，如此指令碼就不會因為 DROP VIEW 對不存在的檢視執行而失敗。

 *name*   
要移除的檢視名稱。

CASCADE  
此子句指出，自動捨棄取決於檢視的物件，例如其他檢視。  
若要建立不相依於其他資料庫物件的檢視，例如檢視和資料表，請在檢視定義中包含 WITH NO SCHEMA BINDING 子句。如需詳細資訊，請參閱[CREATE VIEW](r_CREATE_VIEW.md)。  
請注意，如果您包含 CASCADE，且捨棄的資料庫物件計數累計到十個或更多，則資料庫用戶端可能不會在摘要結果中列出所有捨棄的物件。通常是因為 SQL 用戶端工具對傳回的結果設有預設限制。

RESTRICT  
此子句指出，若有任何物件相依於檢視，則不捨棄檢視。這是預設動作。

## 範例
<a name="r_DROP_VIEW-examples"></a>

下列範例會捨棄名為 *event* 的檢視：

```
drop view event;
```

若要移除有相依性的檢視，請使用 CASCADE 選項。例如，假設我們有名為 EVENT 的資料表。然後使用 CREATE VIEW 命令建立 EVENT 資料表的 eventview 檢視，如下列範例所示：

```
create view eventview as
select dateid, eventname, catid
from event where catid = 1;
```

現在我們建立另一個檢視，名為 *myeventview*，這是根據第一個檢視 *eventview* 所建立：

```
create view myeventview as
select eventname, catid
from eventview where eventname <> ' ';
```

此時已建立兩個檢視：*eventview* 和 *myeventview*。

*myeventview* 檢視是子檢視，*eventview* 是其父檢視。

若要刪除 *eventview* 檢視，明顯可使用下列命令：

```
drop view eventview;
```

請注意，如果您在此情況下執行此命令，將會收到下列錯誤：

```
drop view eventview;
ERROR: can't drop view eventview because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too.
```

若要解決此情況，請執行下列命令 (如錯誤訊息中所建議)：

```
drop view eventview cascade;
```

*eventview* 和 *myeventview* 現在都已成功捨棄。

下列範例會捨棄 *eventview* 檢視 (如存在的話)，或不執行任何動作，並於檢視不存在時傳回訊息：

```
drop view if exists eventview;
```

# 結束
<a name="r_END"></a>

遞交目前交易。與 COMMIT 命令執行完全相同的功能。

如需詳細文件，請參閱 [COMMIT](r_COMMIT.md)。

## 語法
<a name="r_END-synopsis"></a>

```
END [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_END-parameters"></a>

WORK  
選用的關鍵字。

TRANSACTION  
選用的關鍵字；WORK 和 TRANSACTION 為同義詞。

## 範例
<a name="r_END-examples"></a>

以下範例全都會結束交易區塊並遞交交易：

```
end;
```

```
end work;
```

```
end transaction;
```

在這些命令之後，Amazon Redshift 會結束交易區塊並遞交變更。

# EXECUTE
<a name="r_EXECUTE"></a>

執行先前預備的陳述式。

## 語法
<a name="r_EXECUTE-synopsis"></a>

```
EXECUTE plan_name [ (parameter [, ...]) ]
```

## Parameters
<a name="r_EXECUTE-parameters"></a>

 *plan\$1name*   
要執行的預備陳述式名稱。

 *parameter*   
預備陳述式之參數的實際值。這個表達式所產生值的類型必須與建立預備陳述式的 PREPARE 命令中，為此參數位置所指定的資料類型相容。

## 使用須知
<a name="r_EXECUTE_usage_notes"></a>

EXECUTE 是用來執行先前的預備陳述式。由於預備陳述式僅於工作階段期間存在，因此預備陳述式必須已由在目前工作階段之前執行的 PREPARE 陳述式建立。

如果先前的 PREPARE 陳述式指定了一些參數，則必須將一組相容的參數傳遞至 EXECUTE 陳述式，否則 Amazon Redshift 會傳回錯誤。與函數不同的是，預備陳述式不會根據指定的參數類型或數目過載；預備陳述式的名稱必須在資料庫工作階段內是唯一的。

對預備陳述式發出 EXECUTE 命令時，Amazon Redshift 可能會選擇先修改查詢執行計畫 (依據指定的參數值改善效能)，再執行預備陳述式。此外，每次重頭執行預備陳述式時，Amazon Redshift 都會根據隨 EXECUTE 陳述式指定的不同參數值，再次修改查詢執行計畫。若要檢查 Amazon Redshift 為任何特定 EXECUTE 陳述式選擇的查詢執行計畫，請使用 [EXPLAIN](r_EXPLAIN.md) 命令。

如需建立及使用預備陳述式的範例和詳細資訊，請參閱 [PREPARE](r_PREPARE.md)。

## 另請參閱
<a name="r_EXECUTE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [PREPARE](r_PREPARE.md) 

# EXPLAIN
<a name="r_EXPLAIN"></a>

顯示查詢陳述式的執行計畫，但不執行查詢。如需有關查詢分析工作流程的資訊，請參閱 [查詢分析工作流程](c-query-analysis-process.md)。

## 語法
<a name="r_EXPLAIN-synopsis"></a>

```
EXPLAIN [ VERBOSE ] query
```

## Parameters
<a name="r_EXPLAIN-parameters"></a>

詳細   
顯示完整查詢計畫，不只是摘要而已。

 *query*   
要說明的查詢陳述式。查詢可以是 SELECT、INSERT、CREATE TABLE AS、UPDATE 或 DELETE 陳述式。

## 使用須知
<a name="r_EXPLAIN-usage-notes"></a>

EXPLAIN 效能有時會受到建立臨時資料表所需的時間影響。例如，使用通用子表達式最佳化的查詢需建立並分析臨時資料表，以便傳回 EXPLAIN 輸出。查詢計畫取決於臨時資料表的結構描述和統計資訊。因此，此類型查詢的 EXPLAIN 命令可能需要比預期更長的執行時間。

您只能針對下列命令使用 EXPLAIN：
+ SELECT
+ SELECT INTO
+ CREATE TABLE AS
+ INSERT
+ UPDATE
+ DELETE

若您將 EXPLAIN 命令用於其他 SQL 命令，例如資料定義語言 (DDL) 或資料庫操作，則此命令將會失敗。

Amazon Redshift 會使用 EXPLAIN 輸出的相對單位成本來選擇查詢計畫。Amazon Redshift 會比較各種資源估算值的大小來決定計畫。

## 查詢計劃和執行步驟
<a name="r_EXPLAIN-query-planning-and-execution-steps"></a>

特定 Amazon Redshift 查詢陳述式的執行計畫會將查詢的執行和計算細分成一系列分散的步驟和資料表操作，這些最後會產生查詢的最終結果集。如需查詢計劃的資訊，請參閱 [查詢處理](c-query-processing.md)。

下表摘要說明 Amazon Redshift 在開發使用者提交執行的任何查詢執行計畫時可使用的步驟。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_EXPLAIN.html)

## 針對 RLS 使用 EXPLAIN
<a name="r_EXPLAIN-RLS"></a>

如果查詢包含受資料列層級安全性 (RLS) 政策則限制的資料表，EXPLAIN 會顯示特殊的 RLS SecureScan 節點。Amazon Redshift 也會將相同的節點類型記錄到 STL\$1EXPLAIN 系統資料表中。EXPLAIN 不會展現適用於 dim\$1tbl 的 RLS 述詞。RLS SecureSCAN 節點類型可做為指示器，表示執行計畫包含目前使用者不可見的其他操作。

以下範例說明 RLS SecureScan 節點。

```
EXPLAIN
SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                               QUERY PLAN
------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   ->  *XN* *RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)*
         Filter: ((k_dim / 10) > 0)
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

為了對受 RLS 限制的查詢計畫進行全面調查，Amazon Redshift 提供了 EXPLAIN RLS 系統許可。已授予此權限的使用者可以檢查也包含 RLS 述詞的完整查詢計畫。

下列範例說明 RLS SecureScan 節點下方的其他 Seq Scan 也包含 RLS 政策述詞 (k\$1dim > 1)。

```
EXPLAIN SELECT D.cint
FROM fact_tbl F INNER JOIN dim_tbl D ON F.k_dim = D.k
WHERE F.k_dim / 10 > 0;
                                   QUERY PLAN
---------------------------------------------------------------------------------
 XN Hash Join DS_DIST_ALL_NONE  (cost=0.08..0.25 rows=1 width=4)
   Hash Cond: ("outer".k_dim = "inner"."k")
   *->  XN RLS SecureScan f  (cost=0.00..0.14 rows=2 width=4)
         Filter: ((k_dim / 10) > 0)*
         ->  *XN* *Seq Scan on fact_tbl rls_table  (cost=0.00..0.06 rows=5 width=8)
               Filter: (k_dim > 1)*
   ->  XN Hash  (cost=0.07..0.07 rows=2 width=8)
         ->  XN Seq Scan on dim_tbl d  (cost=0.00..0.07 rows=2 width=8)
               Filter: (("k" / 10) > 0)
```

雖然授予使用者 EXPLAIN RLS 許可，但 Amazon Redshift 也會在 STL\$1EXPLAIN 系統資料表中記錄包含 RLS 述詞的完整查詢計畫。若在未授予此許可的情況下執行查詢，查詢將在沒有 RLS 內部元件的情況下記錄。授予或移除 EXPLAIN RLS 許可不會改變 Amazon Redshift 針對先前查詢記錄到 STL\$1EXPLAIN 的內容。

### AWS Lake Formation-RLS 保護的 Redshift 關係
<a name="r_EXPLAIN_RLS-LF"></a>

下列範例說明 LF SecureScan 節點，您可以使用此節點來檢視 Lake Formation-RLS 關係。

```
EXPLAIN
SELECT *
FROM lf_db.public.t_share
WHERE a > 1;
QUERY PLAN
---------------------------------------------------------------
XN LF SecureScan t_share  (cost=0.00..0.02 rows=2 width=11)
(2 rows)
```

## 範例
<a name="r_EXPLAIN-examples"></a>

**注意**  
在這些範例中，範例輸出可能因 Amazon Redshift 組態而有所不同。

以下範例會針對從 EVENT 和 VENUE 資料表選取 EVENTID、EVENTNAME、VENUEID 和 VENUENAME 的查詢傳回查詢計畫：

```
explain
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(5 rows)
```

以下範例會傳回相同查詢的查詢計畫，但包含詳細輸出：

```
explain verbose
select eventid, eventname, event.venueid, venuename
from event, venue
where event.venueid = venue.venueid;
```

```
                                QUERY PLAN
--------------------------------------------------------------------------
{HASHJOIN
:startup_cost 2.52
:total_cost 58653620.93
:plan_rows 8712
:plan_width 43
:best_pathkeys <>
:dist_info DS_DIST_OUTER
:dist_info.dist_keys (
TARGETENTRY
{
VAR
:varno 2
:varattno 1
...

XN Hash Join DS_DIST_OUTER  (cost=2.52..58653620.93 rows=8712 width=43)
Hash Cond: ("outer".venueid = "inner".venueid)
->  XN Seq Scan on event  (cost=0.00..87.98 rows=8798 width=23)
->  XN Hash  (cost=2.02..2.02 rows=202 width=22)
->  XN Seq Scan on venue  (cost=0.00..2.02 rows=202 width=22)
(519 rows)
```

以下範例會傳回 CREATE TABLE AS (CTAS) 陳述式的查詢計畫：

```
explain create table venue_nonulls as
select * from venue
where venueseats is not null;

QUERY PLAN
-----------------------------------------------------------
XN Seq Scan on venue  (cost=0.00..2.02 rows=187 width=45)
Filter: (venueseats IS NOT NULL)
(2 rows)
```

# FETCH
<a name="fetch"></a>

使用資料指標擷取資料列。如需宣告資料指標的相關資訊，請參閱 [DECLARE](declare.md)。

FETCH 會根據資料指標內目前的位置擷取資料列。建立資料指標時，它會定位在第一列前面。FETCH 之後，資料指標會定位在擷取的最後一列。如果 FETCH 執行超出可用資料列的結尾，例如接在 FETCH ALL 之後，資料指標會留在最後一列後面。

FORWARD 0 會擷取目前資料列，但不移動資料指標；也就是說，它會擷取最近擷取的資料列。如果資料指標定位在第一列前面或最後一列後面，則不會傳回任何資料列。

擷取資料指標的第一列時，整個結果集會在領導節點上、記憶體中或磁碟上具體化 (如有需要)。由於在大型結果集內使用資料指標可能會對效能造成負面影響，因此建議您盡量使用替代方式。如需詳細資訊，請參閱[使用游標時的效能考量](declare.md#declare-performance)。

如需詳細資訊，請參閱 [DECLARE](declare.md)、[CLOSE](close.md)。

## 語法
<a name="fetch-synopsis"></a>

```
FETCH [ NEXT | ALL | {FORWARD [ count | ALL ] } ] FROM cursor
```

## Parameters
<a name="fetch-parameters"></a>

NEXT  
擷取下一列。這是預設值。

ALL  
擷取所有剩餘的資料列。(與 FORWARD ALL 相同。) 單一節點的叢集不支援 ALL。

FORWARD [ *count* \$1 ALL ]   
擷取下一個 *count* 資料列，或所有剩餘的資料列。`FORWARD 0` 會擷取目前資料列。若是單一節點叢集，count 的最大值為 `1000`。單一節點的叢集不支援 FORWARD ALL。

*cursor*   
新資料指標的名稱。

## FETCH 範例
<a name="fetch-example"></a>

以下範例會宣告名為 LOLLAPALOOZA 的資料指標來選取 Lollapalooza 活動的銷售資訊，然後使用資料指標從結果集擷取資料列：

```
-- Begin a transaction

begin;

-- Declare a cursor

declare lollapalooza cursor for
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Lollapalooza';

-- Fetch the first 5 rows in the cursor lollapalooza:

fetch forward 5 from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-05-01 19:00:00 |   92.00000000 |       3
 Lollapalooza | 2008-11-15 15:00:00 |  222.00000000 |       2
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       3
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       4
 Lollapalooza | 2008-04-17 15:00:00 |  239.00000000 |       1
(5 rows)

-- Fetch the next row:

fetch next from lollapalooza;

  eventname   |      starttime      | costperticket | qtysold
--------------+---------------------+---------------+---------
 Lollapalooza | 2008-10-06 14:00:00 |  114.00000000 |       2

-- Close the cursor and end the transaction:

close lollapalooza;
commit;
```

# GRANT
<a name="r_GRANT"></a>

定義使用者或角色的存取權限。

許可包括存取選項，例如能夠讀取資料表和檢視中的資料、寫入資料、建立資料表及捨棄資料表。使用此命令可提供資料表、資料庫、結構描述、函數、程序、語言或資料欄的特定許可。若要撤銷資料庫物件的許可，請使用 [REVOKE](r_REVOKE.md) 命令。

權限也包括下列資料共用生產者存取選項：
+  授予取用者命名空間和帳戶的資料共用存取權。
+  透過在資料共用中新增或移除物件，授予變更資料共用的權限。
+  透過從資料共用中新增或移除取用者命名空間，授予資料共用的權限。

資料共用取用者存取選項如下：
+ 授予使用者對從資料共用建立的資料庫，或指向此類資料庫的外部結構描述的完全存取權。
+ 授予使用者從資料共用建立之資料庫的物件層級權限，就像您對本機資料庫物件一樣。若要授予這個層級的權限，您必須在從資料共用建立資料庫時使用 WITH PERSOMES 子句。如需詳細資訊，請參閱[CREATE DATABASE](r_CREATE_DATABASE.md)。

如需資料共用權限的詳細資訊，請參閱 [您可以授予資料共用的權限](permissions-datashares.md)。

許可也包含下列 Amazon Redshift 聯合許可目錄：
+ 將資料表層級許可授予使用者和角色。
+ 授予資料表、檢視和具體化檢視的精細資料欄層級許可。
+ 將範圍許可授予使用者和角色。
+ 在 Amazon Redshift 聯合許可目錄上授予資料庫層級許可。

如需在 Amazon Redshift 聯合許可目錄上管理許可的詳細資訊，請參閱 [管理 Amazon Redshift 聯合許可目錄上的存取控制授予/撤銷](federated-permissions-managing-access.md)。如需 Amazon Redshift Federated Permissions Catalog 支援授予/撤銷語法的詳細資訊，請參閱[授予/撤銷](https://docs.aws.amazon.com/redshift/latest/dg/federated-permissions-managing-access.html#federated-permissions-managing-access-grant-revoke)。

許可也包含聯合身分使用者的 CONNECT AWS IAM Identity Center 權限。此權限可讓管理員透過啟用 Amazon Redshift 聯合許可的每個 Amazon Redshift 工作群組或叢集 (Amazon Redshift Federated Permissions) 的精細許可來控制使用者存取。Amazon Redshift 管理員可以指定哪些 AWS IAM Identity Center 聯合身分使用者或群組可以直接連線至 Amazon Redshift 工作群組 (Amazon Redshift)，對每個工作群組或叢集 AWS IAM Identity Center 的使用者存取權提供精細的控制。

您也可以授予角色來管理資料庫許可，並控制使用者可以對您的資料執行哪些動作。透過定義角色並將角色指派給使用者，您可以限制這些使用者可執行的動作，例如限制使用者只能使用 CREATE TABLE 和 INSERT 命令。如需 CREATE ROLE 命令的相關資訊，請參閱 [CREATE ROLE](r_CREATE_ROLE.md)。Amazon Redshift 具有一些系統定義的角色，您也可以使用這些角色將特定許可授予使用者。如需詳細資訊，請參閱[Amazon Redshift 系統定義角色](r_roles-default.md)。

您只能對使用 ON SCHEMA 語法的資料庫使用者和使用者群組執行外部結構描述的 GRANT 或 REVOKE USAGE 許可。搭配 ON EXTERNAL SCHEMA 使用 時 AWS Lake Formation，您只能對 AWS Identity and Access Management (IAM) 角色授予 GRANT 和 REVOKE 許可。如需許可的清單，請參閱語法。

若為預存程序，您唯一可授予的許可是 EXECUTE。

您無法在交易區塊 (BEGIN ... END) 內執行 GRANT (針對外部資源)。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

若要查看使用者被授予的資料庫許可，請使用 [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md)。若要查看使用者被授予的結構描述許可，請使用 [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md)。若要查看使用者被授予的資料表許可，請使用 [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md)。

## 語法
<a name="r_GRANT-synopsis"></a>



```
GRANT { { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
    ON DATABASE db_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON { PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...] | ALL PROCEDURES IN SCHEMA schema_name [, ...] }
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT USAGE
    ON LANGUAGE language_name [, ...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]             

GRANT { { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE [database_name.][schema_name.]template_name [,...]
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予資料表的資料欄層級權限
<a name="grant-column-level"></a>

下列語法適用於 Amazon Redshift 資料表和檢視上的資料欄層級許可。

```
GRANT { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }

     TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予 ASSUMEROLE 許可
<a name="grant-assumerole-permissions"></a>

以下語法可將 ASSUMEROLE 許可授予具有指定角色的使用者和群組。若要開始使用 ASSUMEROLE 權限，請參閱 [授予 ASSUMEROL 許可的使用須知](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

```
GRANT ASSUMEROLE
       ON { 'iam_role' [, ...] | default | ALL }
       TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
       FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL } [, ...]
```

### 授予 Redshift Spectrum 與 Lake Formation 整合的許可
<a name="grant-spectrum-integration-with-lf-syntax"></a>

以下是 Redshift Spectrum 與 Lake Formation 整合的語法。

```
GRANT { SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]

GRANT { { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    TO { { IAM_ROLE iam_role } [, ...] | PUBLIC } [ WITH GRANT OPTION ]

GRANT { { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    TO { IAM_ROLE iam_role } [, ...] [ WITH GRANT OPTION ]
```

### 授予資料共用許可
<a name="grant-datashare-syntax"></a>

**生產者端資料共用權限**  
以下是使用 GRANT 將 ALTER 或 SHARE 權限授予使用者或角色的語法。使用者可以使用 ALTER 權限變更資料共用，或者使用 SHARE 權限將使用授予取用者。ALTER 和 SHARE 是您可以授予使用者和使用者群組的唯一權限。

```
GRANT { ALTER | SHARE } ON DATASHARE datashare_name
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

以下是在 Amazon Redshift 上使用 GRANT 授予資料共用使用許可的語法 您可以使用 USAGE 許可將資料共用的存取權授予取用者。您無法將此許可授予使用者或使用者群組。此許可也不支援對 GRANT 陳述式使用 WITH GRANT OPTION。只有先前因為資料共用而被授予 SHARE 許可的使用者或使用者群組才能執行此類型的 GRANT 陳述式。

```
GRANT USAGE
    ON DATASHARE datashare_name
    TO NAMESPACE 'namespaceGUID' | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]
```

以下是如何將資料共用使用權授予 Lake Formation 帳戶的範例。

```
GRANT USAGE ON DATASHARE salesshare TO ACCOUNT '123456789012' VIA DATA CATALOG;
```

**取用者端資料共用權限**  
以下是 GRANT 資料共用使用許可的語法，用於特定資料庫或從資料共用建立的結構描述。

取用者存取從資料共用建立資料庫所需的進一步權限，取決於是否使用 WITH PERMISSIONS 子句從資料共用建立資料庫的 CREATE DATABASE 命令。如需有關 CREATE DATABASE 命令和 WITH PERMISSIONS 子句的詳細資訊，請參閱 [CREATE DATABASE](r_CREATE_DATABASE.md)。

**不使用 WITH PERMISSIONS 子句建立的資料庫**  
當您在沒有 WITH PERMISSIONS 子句之從資料共用建立的資料庫上授予 USAGE 時，您不需要對共用資料庫中的物件個別授予權限。在沒有 WITH PERMISSIONS 子句之從資料共用建立的資料庫上授予使用權的實體，會自動存取資料庫中的所有物件。

**使用 WITH PERMISSIONS 子句建立的資料庫**  
當您在資料庫上授予 USAGE 時，其中共用資料庫是使用 WITH PERMISSIONS 子句從資料共用建立的，取用者端身分仍然必須被授予共用資料庫中資料庫物件的相關權限才能存取該物件，就像您授予權限給本機資料庫物件一樣。若要將權限授予從資料共用建立之資料庫中的物件，請使用三部分語法 `database_name.schema_name.object_name`。若要將權限授予指向共用資料庫內共用結構描述的外部結構描述中的物件，請使用兩部分語法 `schema_name.object_name`。

```
GRANT USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
    TO { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予限定範圍權限
<a name="grant-scoped-syntax"></a>

限定範圍許可讓您能夠對使用者或角色授予資料庫或結構描述內某一種類型的所有物件的許可。具有限定範圍許可的使用者和角色對於資料庫或結構描述內所有目前和未來的物件擁有指定的許可。

您可以在 [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md) 中檢視資料庫層級限定範圍許可的範圍。您可以在 [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md) 中檢視結構描述層級限定範圍許可的範圍。

如需限定範圍許可的詳細資訊，請參閱 [限定範圍權限](t_scoped-permissions.md)。

以下是將限定範圍權限授予使用者或角色的語法。

```
GRANT { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT 
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name} [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name | } [, ...]

GRANT USAGE
FOR LANGUAGES IN
{DATABASE db_name}
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]  

GRANT { { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]

GRANT { { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
TO { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]
```

請注意，限定範圍許可不區分函式的許可和程序的許可。例如，下列陳述式會同時將結構描述 `Sales_schema` 中函式和程序的 `EXECUTE` 許可授予 `bob`。

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

### 授予機器學習許可
<a name="grant-model-syntax"></a>

以下是 Amazon Redshift 上的機器學習模型許可語法。

```
GRANT CREATE MODEL
    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]

GRANT { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    TO { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予角色許可
<a name="grant-roles"></a>

以下是在 Amazon Redshift 上授予角色的語法。

```
GRANT { ROLE role_name } [, ...] TO { { user_name [ WITH ADMIN OPTION ] } | ROLE role_name }[, ...]
```

以下是在 Amazon Redshift 上對角色授予系統許可的語法。請注意，您只能對角色授予許可，不能對使用者授予。

```
GRANT
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG | ACCESS SYSTEM TABLE
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE |
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL |
    IGNORE RLS | EXPLAIN RLS | 
    EXPLAIN MASKING }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
TO ROLE role_name [, ...]
```

### 授予安全政策的解釋許可
<a name="grant-row-level-security"></a>

以下語法可用來授予許可，以解釋 EXPLAIN 計畫中查詢的安全政策篩選。可能的安全政策包括資料列層級安全政策和動態資料遮罩政策。

```
GRANT EXPLAIN { RLS | MASKING } TO ROLE rolename 
```

以下是授予許可以略過查詢資料列層級安全性政策的語法。此語法不適用於動態資料遮罩政策。

```
GRANT IGNORE RLS TO ROLE rolename 
```

以下是對指定安全政策授予查詢資料表許可的語法。可能的安全政策包括資料列層級安全政策和動態資料遮罩政策。

```
GRANT SELECT ON [ TABLE ] table_name [, ...]
TO { RLS | MASKING } POLICY policy_name [, ...]
```

### 授予連線許可
<a name="grant-connection-permissions"></a>

以下是授予聯合身分使用者 （或群組） AWS IAM Identity Center 連線至工作群組/叢集許可的語法：

```
GRANT CONNECT [ON WORKGROUP]
TO [USER] <prefix>:<username> | ROLE <prefix>:<rolename> | PUBLIC;
```

## Parameters
<a name="r_GRANT-parameters"></a>

SELECT   <a name="grant-select"></a>
授予許可以使用 SELECT 陳述式從資料表或檢視選取資料。另外也需要 SELECT 許可，才能參考 UPDATE 或 DELETE 操作的現有資料欄值。

INSERT   <a name="grant-insert"></a>
授予許可以使用 INSERT 陳述式或 COPY 陳述式將資料載入資料表中。

UPDATE   <a name="grant-update"></a>
授予許可以使用 UPDATE 陳述式更新資料表資料欄。UPDATE 操作也需要 SELECT 許可，因為這些操作必須參考資料表資料欄，才能判斷要更新哪些資料列，或運算資料欄的新值。

DELETE  <a name="grant-delete"></a>
允許刪除資料表中的資料列。DELETE 操作也需要 SELECT 許可，因為這些操作必須參考資料表資料欄，才能判斷要刪除哪些資料列。

DROP  <a name="grant-drop"></a>
根據資料庫物件而定，將下列許可授予使用者或角色：  
+  對於資料表，DROP 會授予捨棄資料表或檢視的許可。如需詳細資訊，請參閱[DROP TABLE](r_DROP_TABLE.md)。
+  對於資料庫，DROP 會授予捨棄資料庫的許可。如需詳細資訊，請參閱[DROP DATABASE](r_DROP_DATABASE.md)。
+  對於結構描述，DROP 會授予捨棄結構描述的許可。如需詳細資訊，請參閱[DROP SCHEMA](r_DROP_SCHEMA.md)。

REFERENCES   <a name="grant-references"></a>
授予建立外部索引鍵限制條件的許可。您需要在被動參考資料表與主動參考資料表上授予此許可；否則，使用者就無法建立限制條件。

ALTER  <a name="grant-alter"></a>
根據資料庫物件而定，將下列許可授予使用者或使用者群組：  
+ 對於資料表，ALTER 會授予修改資料表或檢視的許可。如需詳細資訊，請參閱[ALTER TABLE](r_ALTER_TABLE.md)。
+ 對於資料庫，ALTER 會授予修改資料庫的許可。如需詳細資訊，請參閱[ALTER DATABASE](r_ALTER_DATABASE.md)。
+ 對於結構描述，ALTER 會授予修改結構描述的許可。如需詳細資訊，請參閱[ALTER SCHEMA](r_ALTER_SCHEMA.md)。
+ 對於外部資料表，ALTER 會授予許可，以允許在針對 Lake Formation 啟用的 AWS Glue Data Catalog 中修改資料表。此許可僅適用於使用 Lake Formation 時。

TRUNCATE  <a name="grant-truncate"></a>
允許截斷資料表 如果沒有此許可，只有資料表的擁有者或超級使用者可以截斷資料表。如需 TRUNCATE 命令的相關資訊，請參閱 [TRUNCATE](r_TRUNCATE.md)。

ALL [ PRIVILEGES ]   <a name="grant-all"></a>
對指定的使用者或角色一次授予所有可用的許可。PRIVILEGES 關鍵字為選用。  
GRANT ALL ON SCHEMA 不會授予外部結構描述的 CREATE 許可。  
您可以將 ALL 許可授予已啟用 Lake Formation AWS Glue Data Catalog 的 中的資料表。在這種情況下，系統會將 SELECT 和 ALTER 等個別許可記錄在 Data Catalog. 中。  
 Amazon Redshift 不支援 RULE 和 TRIGGER 許可。如需詳細資訊，請前往 [不支援的 PostgreSQL 功能](c_unsupported-postgresql-features.md)。

ASSUMEROLE  <a name="assumerole"></a>
對使用者、角色或具有指定角色的群組授予執行 COPY、UNLOAD、EXTERNAL FUNCTION 和 CREATE MODEL 命令的許可。執行指定的命令時，使用者、角色或群組會擔任該角色。若要開始使用 ASSUMEROLE 許可，請參閱 [授予 ASSUMEROL 許可的使用須知](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

ON [ TABLE ] *table\$1name*   <a name="grant-on-table"></a>
授予資料表或檢視的指定許可。TABLE 關鍵字為選用。您可在一個陳述式中列出多個資料表和檢視。

ON ALL TABLES IN SCHEMA *schema\$1name*   <a name="grant-all-tables"></a>
授予所參考結構描述中所有資料表和檢視的指定許可。

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="grant-column-level-privileges"></a>
將 Amazon Redshift 資料表或檢視中指定資料欄的指定許可授予使用者、群組或 PUBLIC。

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table-column"></a>
為所參考結構描述中 Lake Formation 資料表之指定欄上的 IAM 角色授予指定許可。

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="grant-external-table"></a>
為所參考結構描述中 Lake Formation 資料表上的 IAM 角色授予指定許可。

ON EXTERNAL SCHEMA *schema\$1name*   <a name="grant-external-schema"></a>
為所參考結構描述上的 IAM 角色授予指定許可。

ON *iam\$1role*   <a name="grant-iam_role"></a>
將指定許可授予 IAM 角色。

TO *username*   <a name="grant-to"></a>
指出接收許可的使用者。

TO IAM\$1ROLE *iam\$1role*   <a name="grant-to-iam-role"></a>
指出接收許可的 IAM 角色。

WITH GRANT OPTION   <a name="grant-with-grant"></a>
指出接收許可的使用者可以接著將相同的許可授予他人。無法將 WITH GRANT OPTION 授予群組或 PUBLIC。

ROLE *role\$1name*   <a name="grant-role"></a>
將許可授予角色。

GROUP *group\$1name*   <a name="grant-group"></a>
將許可授予使用者群組。可以使用逗號分隔清單來指定多個使用者群組。

PUBLIC   <a name="grant-public"></a>
對所有使用者授予指定的許可，包括之後建立的使用者。PUBLIC 代表永遠包含所有使用者的群組。個別使用者的許可是由授予 PUBLIC 的許可、授予使用者所屬之任何群組的許可，以及個別授予使用者的任何許可，三者加總所組成。  
將 PUBLIC 授予 Lake Formation EXTERNAL TABLE 會導致向 Lake Formation 的*每個人*群組授予許可。

將 【ON WORKGROUP】 連接至 \$1 【USER】 <prefix>：<username> \$1 ROLE <prefix>：<rolename> \$1 PUBLIC \$1  
准許將工作群組或叢集連線至 AWS IAM Identity Center 聯合身分使用者或群組。字首識別身分提供者。授予 PUBLIC AWS IAM Identity Center 時， 許可適用於所有聯合身分使用者，包括稍後建立的使用者。此許可僅適用於在工作群組或叢集上啟用 Amazon Redshift 聯合許可時。

CREATE   <a name="grant-create"></a>
根據資料庫物件而定，將下列許可授予使用者或使用者群組：  
+ 若是資料庫，CREATE 可讓使用者在資料庫內建立結構描述。
+ 若是結構描述，CREATE 可讓使用者在結構描述內建立物件。若要重新命名物件，使用者必須具有 CREATE 許可並擁有要重新命名的物件。
+ Amazon Redshift Spectrum 外部結構描述不支援 CREATE ON SCHEMA。若要授予外部結構描述中外部資料表的使用權，請將 USAGE ON SCHEMA 授予需要存取權的使用者。只有外部結構描述的擁有者或超級使用者才可在外部結構描述中建立外部資料表。若要轉移外部結構描述的所有權，請使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 來變更擁有者。

TEMPORARY \$1 TEMP   <a name="grant-temporary"></a>
授予許可以在指定的資料庫中建立臨時資料表。若要執行 Amazon Redshift Spectrum 查詢，資料庫使用者必須具有在資料庫中建立臨時資料表的許可。  
根據預設，建立臨時資料表的許可是依使用者在 PUBLIC 群組中的自動成員資格授予。若要移除任何使用者建立暫存資料表的許可，請撤銷 PUBLIC 群組的 TEMP 許可。然後將建立暫存資料表的許可明確授予特定使用者或使用者群組。

ON DATABASE *db\$1name*   <a name="grant-database"></a>
授予資料庫的指定許可。

USAGE   <a name="grant-usage"></a>
授予特定結構描述的 USAGE 許可，即可讓使用者存取該結構描述中的物件。若是本機 Amazon Redshift 結構描述，對這些物件的特定動作必須另行授予 (例如資料表的 SELECT 或 UPDATE 許可)。根據預設，所有使用者對 PUBLIC 結構描述都具有 CREATE 和 USAGE 許可。  
 當您使用 ON SCHEMA 語法將 USAGE 授予外部結構描述時，您不需要對外部結構描述中的物件個別授予動作。對應的目錄許可會控制外部結構描述物件的精細許可。

ON SCHEMA *schema\$1name*   <a name="grant-schema"></a>
授予結構描述的指定許可。  
Amazon Redshift Spectrum 外部結構描述不支援 GRANT ALL ON SCHEMA 中的 GRANT CREATE ON SCHEMA 和 CREATE 許可。若要授予外部結構描述中外部資料表的使用權，請將 USAGE ON SCHEMA 授予需要存取權的使用者。只有外部結構描述的擁有者或超級使用者才可在外部結構描述中建立外部資料表。若要轉移外部結構描述的所有權，請使用 [ALTER SCHEMA](r_ALTER_SCHEMA.md) 來變更擁有者。

EXECUTE ON ALL FUNCTIONS IN SCHEMA *schema\$1name*  <a name="grant-all-functions"></a>
授予所參考結構描述中所有函數的指定許可。  
Amazon Redshift 不支援對 pg\$1catalog 命名空間中定義的 pg\$1proc 內建項目使用 GRANT 或 REVOKE 陳述式。

EXECUTE ON PROCEDURE *procedure\$1name*   <a name="grant-procedure"></a>
授予特定預存程序的 EXECUTE 許可。由於預存程序名稱可以過載，因此您必須包含程序的引數清單。如需詳細資訊，請參閱[命名預存程序](stored-procedure-naming.md)。

EXECUTE ON ALL PROCEDURES IN SCHEMA *schema\$1name*  <a name="grant-all-procedures"></a>
授予所參考結構描述中所有預存程序的指定許可。

USAGE ON LANGUAGE *language\$1name*   
授予某種語言的 USAGE 許可。  
自 2025 年 11 月 1 日起，Amazon Redshift 不再支援建立新的 Python UDF。現有 Python UDF 將繼續正常運作至 2026 年 6 月 30 日。自 2026 年 7 月 1 日起，Amazon Redshift 將不再支援 Python UDF。我們建議您在 2025 年 11 月 1 日之前將現有的 Python UDF 移轉至 Lambda UDF。如需建立和使用 Lambda UDF 的相關資訊，請參閱 [純量 Lambda UDF](udf-creating-a-lambda-sql-udf.md)。如需將現有 Python UDF 轉換為 Lambda UDF 的相關資訊，請參閱[部落格文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。
需具有 USAGE ON LANGUAGE 許可，才能透過執行 [CREATE FUNCTION](r_CREATE_FUNCTION.md) 命令建立使用者定義的函數 (UDF)。如需詳細資訊，請參閱[UDF 安全與許可](udf-security-and-privileges.md)。  
需具有 USAGE ON LANGUAGE 許可，才能透過執行 [CREATE PROCEDURE](r_CREATE_PROCEDURE.md) 命令建立預存程序。如需詳細資訊，請參閱[預存程序的安全和權限](stored-procedure-security-and-privileges.md)。  
若是 Python UDF，請使用 `plpythonu`。若是 SQL UDF，請使用 `sql`。若為預存程序，請使用 `plpgsql`。

ON COPY JOB *job\$1name*  <a name="on-copy-job"></a>
授予複製任務的指定許可。

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]   <a name="grant-for"></a>
指定 SQL 命令的授予權限。您可以指定 ALL 來授予 COPY、UNLOAD、EXTERNAL FUNCTION 和 CREATE MODEL 陳述式的許可。此子句僅適用於授予 ASSUMEROLE 許可。

ALTER  
授予 ALTER 許可給使用者，使他們可以在資料共用中新增或移除物件，或設定屬性 PUBLICACCESSIBLE。如需詳細資訊，請參閱[ALTER DATASHARE](r_ALTER_DATASHARE.md)。

SHARE  
授予使用者和使用者群組將資料取用者新增至資料共用的許可。需要此許可才能讓特定取用者 (帳戶或命名空間) 從其叢集存取資料共用。取用者可以是相同或不同的 AWS 帳戶，具有與全域唯一識別符 (GUID) 指定的相同或不同的叢集命名空間。

ON DATASHARE *datashare\$1name*   <a name="grant-datashare"></a>
授予參考資料共用的指定許可。如需有關取用者存取控制精細度的資訊，請參閱 [Amazon Redshift 中不同層級的資料共用](datashare-overview.md#granularity)。

USAGE  
將 USAGE 授予相同帳戶內的取用者帳戶或命名空間時，帳戶內的特定取用者帳戶或命名空間可以以唯讀方式存取資料共用和資料共用的物件。

TO NAMESPACE 'clusternamespace GUID'  
表示相同帳戶中的命名空間，取用者可以在其中接收資料共用的指定許可。命名空間使用 128 位元英數字元 GUID。

TO ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
表示另一個帳戶的編號，其中的取用者可以接收資料共用的指定許可。指定 ‘VIA DATA CATALOG’ 表示您正在授予資料共用的使用權給 Lake Formation 帳戶。省略此參數表示您將使用權授予擁有叢集的帳戶。

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="grant-datashare"></a>
在指定資料共用中建立的指定資料庫上授予指定使用許可。

ON SCHEMA* shared\$1schema*   <a name="grant-datashare"></a>
在指定資料共用中建立的指定結構描述上授予指定許可。

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
指定要被授予權限的資料庫物件。IN 後面的參數定義授予權限的範圍。

建立模型  
將 CREATE MODEL 許可授予特定使用者或使用者群組。

ON MODEL *model\$1name*  
授予特定模型的 EXECUTE 許可。

ACCESS CATALOG  
授予檢視角色可存取之物件之相關中繼資料的權限。

\$1 role \$1 [, ...]  
要授予其他角色、使用者或 PUBLIC 的角色。  
PUBLIC 代表永遠包含所有使用者的群組。個別使用者的許可是由授予 PUBLIC 的許可、授予使用者所屬之任何群組的許可，以及個別授予使用者的任何許可，三者加總所組成。

TO \$1 \$1 *user\$1name* [ WITH ADMIN OPTION ] \$1 \$1 role \$1[, ...]  
將指定的角色授予具有 WITH ADMIN OPTION、其他角色或 PUBLIC 的指定使用者。  
WITH ADMIN OPTION 子句會為所有承授者提供所有授予角色的管理選項。

EXPLAIN \$1 RLS \$1 MASKING \$1 TO ROLE *rolename*  
授予角色解釋 EXPLAIN 計畫中查詢的安全政策篩選的許可。RLS 會授予許可，以解釋資料列層級安全政策篩選。MASKING 會授予許可，以解釋動態資料遮罩政策篩選。

IGNORE RLS TO ROLE *rolename*   
授予許可，以略過對角色查詢資料列層級安全性政策。

TO \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
指出接收許可的安全政策。TO RLS POLICY 表示資料列層級安全政策。TO MASKING POLICY 表示動態資料遮罩政策。

## 使用須知
<a name="r_GRANT-usage-notes-link"></a>

若要進一步了解 GRANT 使用須知，請參閱 [使用須知](r_GRANT-usage-notes.md)。

## 範例
<a name="r_GRANT-examples-link"></a>

如需使用 GRANT 的範例，請參閱 [範例](r_GRANT-examples.md)。

# 使用須知
<a name="r_GRANT-usage-notes"></a>

若要授予物件的權限，您必須符合下列條件之一：
+ 身為物件擁有者。
+ 身為超級使用者。
+ 具有該物件和權限的授予權限。

例如，以下命令可讓使用者 HR 在 employees 資料表上執行 SELECT 命令，並對其他使用者授予和撤銷相同的權限。

```
grant select on table employees to HR with grant option;
```

HR 無法授予 SELECT 以外任何操作的權限，也無法授予 employees 資料表以外任何資料表的權限。

在另一個範例中，以下命令可讓使用者 HR 在 employees 資料表上執行 ALTER 命令，並對其他使用者授予和撤銷相同的權限。

```
grant ALTER on table employees to HR with grant option;
```

HR 無法授予 ALTER 以外任何操作的權限，也無法授予 employees 資料表以外任何資料表的權限。

在檢視上授予權限並不表示具有基礎資料表的權限。同樣地，在結構描述上授予權限並不表示具有結構描述中資料表的權限。請改為明確授與基礎資料表的存取權限。

若要將權限授予 AWS Lake Formation 資料表，與資料表外部結構描述相關聯的 IAM 角色必須具有將權限授予外部資料表的許可。下列範例所建立的外部結構描述內含相關聯的 `myGrantor` IAM 角色。該 `myGrantor` IAM 角色具備將許可授予他人的許可。GRANT 命令會使用與外部結構描述相關聯的 `myGrantor` IAM 角色許可，將許可授予 `myGrantee` IAM 角色。

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
grant select
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

如果對 IAM 角色將授予所有權限 (GRANT ALL)，則啟用 Lake Formation 的相關 Data Catalog 中將授予個別權限。例如，執行下列 GRANT ALL 的結果是 Lake Formation 主控台中會顯示授予的個別權限 (SELECT、ALTER、DROP、DELETE 和 INSERT)。

```
grant all
on external table mySchema.mytable
to iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

無論是使用 GRANT 或 REVOKE 命令設定物件權限，超級使用者都能存取所有物件。

## 欄位層級存取控制的使用須知
<a name="r_GRANT-usage-notes-clp"></a>

下列使用須知適用於 Amazon Redshift 資料表和檢視上的資料欄層級權限。這些須知會描述資料表；除非我們明確提到例外，否則相同的須知會適用於檢視。
+ 對於 Amazon Redshift 資料表，您只能在資料欄層級授予 SELECT 和 UPDATE 權限。對於 Amazon Redshift 檢視，您只能在資料欄層級授予 SELECT 權限。
+ 在資料表上的資料欄層級 GRANT 內容中使用時，ALL 關鍵字是 SELECT 和 UPDATE 權限組合的同義詞。
+ 如果您沒有資料表中所有資料欄的 SELECT 權限，執行 SELECT \$1 操作只會傳回您有權存取的資料欄。使用檢視時，SELECT \$1 操作會嘗試存取檢視中的所有欄。如果您沒有存取所有欄的許可，這些查詢就會失敗，並顯示許可遭拒錯誤。
+ 在以下情況下，SELECT \$1 不會擴展到僅可存取的資料欄：
  + 您無法使用 SELECT \$1 建立僅具有可存取資料欄的一般檢視。
  + 您無法使用 SELECT \$1 建立僅具有可存取資料欄的具體化視觀表。
+ 如果您有資料表或檢視的 SELECT 或 UPDATE 權限並新增一個資料欄，則您對資料表或檢視及其所有資料欄仍具有相同的權限。
+ 只有資料表的擁有者或超級使用者可以授與資料欄層級權限。
+ 資料欄層級權限不支援 WITH GRANT OPTION 子句。
+ 您無法同時在資料表層級和資料欄層級擁有相同的權限。例如，使用者 `data_scientist` 不能同時擁有資料表 `employee` 和資料欄 `employee.department` 的 SELECT 權限。對資料表和資料表內的資料欄授與相同權限時，請考慮下列結果：
  + 如果使用者具有資料表的資料表層級權限，則在資料欄層級授與相同權限就沒有作用。
  + 如果使用者具有資料表的資料表層級權限，對資料表的一或多個資料欄撤銷相同的權限，則會傳回錯誤。請改為在資料表層級撤銷權限。
  + 如果使用者具有資料欄層級權限，在資料表層級授與相同的權限，則會傳回錯誤。
  + 如果使用者具有資料欄層級權限，在資料表層級撤銷相同的權限，則會撤銷資料表上所有資料欄的資料欄和資料表權限。
+ 您無法授與延遲繫結檢視的資料欄層級權限。
+ 若要建立具體化檢視，您必須具有基礎資料表的資料表層級 SELECT 權限。即使您擁有特定資料欄層級的權限，也無法針對這些資料欄建立具體化檢視。不過，您可以將 SELECT 權限授與具體化檢視的資料欄，與一般檢視類似。
+ 若要查閱資料欄層級權限的授與，請使用 [PG\$1ATTRIBUTE\$1INFO](r_PG_ATTRIBUTE_INFO.md) 檢視。

## 授予 ASSUMEROL 許可的使用須知
<a name="r_GRANT-usage-notes-assumerole"></a>

下列是在 Amazon Redshift 中授予 ASSUMEROLE 許可的使用須知。

您可以使用 ASSUMEROLE 許可控制資料庫使用者、角色或群組在命令上的 IAM 角色存取許可，例如 COPY、UNLOAD、EXTERNAL FUNCTION 或 CREATE MODEL 等命令。將 ASSUMEROLE 許可授予 IAM 角色的使用者、角色或群組之後，使用者、角色或群組就可以在執行命令時擔任該角色。ASSUMEROLE 許可可讓您視需要授予適當命令的存取權。

只有資料庫超級使用者可以授予或撤銷使用者、角色和群組的 ASSUMEROLE 許可。超級使用者始終保有 ASSUMEROLE 許可。

若要為使用者、角色和群組啟用 ASSUMEROLE 許可的使用權，超級使用者會執行下列兩個動作：
+ 在叢集上執行下列陳述式一次：

  ```
  revoke assumerole on all from public for all;
  ```
+ 將 ASSUMEROLE 許可授予使用者、角色和群組，以使用適當的命令。

授予 ASSUMEROLE 許可時，您可以在 ON 子句中指定角色鏈結。您可以使用逗號來分隔角色鏈中的角色，例如：`Role1,Role2,Role3`。如果在授予 ASSUMEROLE 權限時指定角色鏈結，您必須在執行 ASSUMEROLE 許可授予的操作時指定角色鏈結。執行 ASSUMEROLE 許可授予的操作時，您無法指定角色鏈中的個別角色。例如，如果使用者、角色或群組被授予角色鏈結 `Role1,Role2,Role3`，則您無法指定僅 `Role1` 執行操作。

如果使用者嘗試執行 COPY、UNLOAD、EXTERNAL FUNCTION 或 CREATE MODEL 操作，但尚未獲得 ASSUMEROLE 許可，則會出現類似下列內容的訊息。

```
ERROR:  User awsuser does not have ASSUMEROLE permission on IAM role "arn:aws:iam::123456789012:role/RoleA" for COPY 
```

若要列出已透過 ASSUMEROLE 許可授予 IAM 角色和命令存取權的使用者，請參閱。[HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md)若要列出已授予所指定使用者的 IAM 角色和命令許可，請參閱 [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md)。若要列出已授予您指定 IAM 角色存取權的使用者、角色和群組，請參閱 [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md)。

## 授予機器學習許可的使用須知
<a name="r_GRANT-usage-notes-create-model"></a>

您無法直接授予或撤銷與 ML 函數相關的許可。ML 函數屬於 ML 模型，而且許可是透過模型控制的。相反地，您可以授予 ML 模型相關的許可。下列範例會示範如何授予許可給所有使用者，以便執行與模型 `customer_churn` 相關聯的 ML 函數。

```
GRANT EXECUTE ON MODEL customer_churn TO PUBLIC;
```

您也可以對 ML 模型 `customer_churn` 的使用者授予所有許可。

```
GRANT ALL on MODEL customer_churn TO ml_user;
```

如果結構描述中有 ML 函數，則授予 ML 函數相關的 `EXECUTE` 許可將會失敗，即使該 ML 函數已經具有透過 `GRANT EXECUTE ON MODEL` 取得的 `EXECUTE` 許可也是一樣。我們建議您在使用 `CREATE MODEL` 命令時，使用個別的結構描述，將 ML 函數本身保留在不同的結構描述中。下列範例示範如何執行此動作。

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# 範例
<a name="r_GRANT-examples"></a>

 以下範例會將 SALES 資料表的 SELECT 權限授予使用者 `fred`。

```
grant select on table sales to fred;
```

以下範例會將 QA\$1TICKIT 結構描述中所有資料表的 SELECT 權限授予使用者 `fred`。

```
grant select on all tables in schema qa_tickit to fred;
```

以下範例會將 QA\$1TICKIT 結構描述中的所有結構描述權限授予使用者群組 QA\$1USERS。結構描述權限為 CREATE 和 USAGE。USAGE 會授予使用者存取結構描述中物件的權限，但不會授予物件的 INSERT 或 SELECT 這類權限。分別授與每個物件的權限。

```
create group qa_users;
grant all on schema qa_tickit to group qa_users;
```

以下範例會將 QA\$1TICKIT 結構描述中 SALES 資料表的所有權限授予群組 QA\$1USERS 中的所有使用者。

```
grant all on table qa_tickit.sales to group qa_users;
```

以下範例會將 QA\$1TICKIT 結構描述中 SALES 資料表的所有權限授予群組 QA\$1USERS 和 RO\$1USERS 中的所有使用者。

```
grant all on table qa_tickit.sales to group qa_users, group ro_users;
```

以下範例會將 QA\$1TICKIT 結構描述中 SALES 資料表的 DROP 權限授予群組 QA\$1USERS 中的所有使用者。

```
grant drop on table qa_tickit.sales to group qa_users;>
```

以下一系列命令說明，結構描述的存取權不會授予結構描述中資料表的權限。

```
create user schema_user in group qa_users password 'Abcd1234';
create schema qa_tickit;
create table qa_tickit.test (col1 int);
grant all on schema qa_tickit to schema_user;

set session authorization schema_user;
select current_user;


current_user
--------------
schema_user
(1 row)


select count(*) from qa_tickit.test;


ERROR: permission denied for relation test [SQL State=42501]


set session authorization dw_user;
grant select on table qa_tickit.test to schema_user;
set session authorization schema_user;
select count(*) from qa_tickit.test;


count
-------
0
(1 row)
```

以下一系列命令說明，檢視的存取權不代表能夠存取其基礎資料表。雖然名為 VIEW\$1USER 的使用者具有 VIEW\$1DATE 的所有權限，但這位使用者仍無法從 DATE 資料表選取。

```
create user view_user password 'Abcd1234';
create view view_date as select * from date;
grant all on view_date to view_user;
set session authorization view_user;
select current_user;


current_user
--------------
view_user
(1 row)


select count(*) from view_date;


count
-------
365
(1 row)


select count(*) from date;


ERROR:  permission denied for relation date
```

下列範例會將 `cust_profile` 資料表中 `cust_name` 和 `cust_phone` 資料欄的 SELECT 權限授予使用者 `user1`。

```
grant select(cust_name, cust_phone) on cust_profile to user1;
```

下列範例會將 `cust_name` 和 `cust_phone` 資料欄的 SELECT 權限，以及 `cust_profile` 資料表中 `cust_contact_preference` 資料欄的 UPDATE 權限授予 `sales_group` 群組。

```
grant select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile to group sales_group;
```

下列範例顯示 ALL 關鍵字的使用方式，以將資料表 `cust_profile` 中三個資料欄的 SELECT 和 UPDATE 權限授予 `sales_admin` 群組。

```
grant ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile to group sales_admin;
```

以下範例會將 `cust_profile_vw` 檢視中 `cust_name` 資料欄的 SELECT 權限授予 `user2` 使用者。

```
grant select(cust_name) on cust_profile_vw to user2;
```

## 授予資料共用存取權的範例
<a name="r_GRANT-examples-datashare"></a>

以下是顯示 GRANT 資料共用使用許可的範例，用於特定資料庫或從資料共用建立的結構描述。

在下列範例中，生產者端管理員會授予指定之命名空間的 `salesshare` 資料共用上的 USAGE 權限。

```
GRANT USAGE ON DATASHARE salesshare TO NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

在下列範例中，取用者端管理員會在 `sales_db` 至 `Bob` 上授予的 USAGE 權限。

```
GRANT USAGE ON DATABASE sales_db TO Bob;
```

在下列範例中，取用者端管理員會將 `sales_schema` 結構描述的 GRANT USAGE 權限授予 `Analyst_role` 角色。`sales_schema` 是指向 sales\$1db 的外部結構描述。

```
GRANT USAGE ON SCHEMA sales_schema TO ROLE Analyst_role;
```

此時，`Bob` 和 `Analyst_role` 可以存取 `sales_schema` 和 `sales_db` 中的所有資料庫物件。

下列範例顯示授予共用資料庫中物件的其他物件層級權限。只有當用於建立共用資料庫之 CREATE DATABASE 使用 WITH PERMISSIONS 子句，這些額外的權限才是必要的。如果 CREATE DATABASE 命令沒有使用 WITH PERMISSIONS，授予共用資料庫上的 USAGE 權限即是授予對該資料庫中所有物件的完全存取權限。

```
GRANT SELECT ON sales_db.sales_schema.tickit_sales_redshift to Bob;
```

## 授予限定範圍權限的範例
<a name="r_GRANT-examples-scoped"></a>

下列範例會將 `Sales_db` 資料庫中所有目前和未來結構描述的使用權授予 `Sales` 角色。

```
GRANT USAGE FOR SCHEMAS IN DATABASE Sales_db TO ROLE Sales;
```

下列範例會將 `Sales_db` 資料庫中所有目前和未來資料表的 SELECT 權限授予使用者 `alice`，並提供 `alice` 權限以授予 `Sales_db` 中資料表的限定範圍權限給其他使用者。

```
GRANT SELECT FOR TABLES IN DATABASE Sales_db TO alice WITH GRANT OPTION;
```

下列範例會將 `Sales_schema` 結構描述中函數的 EXECUTE 權限授予使用者 `bob`。

```
GRANT EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema TO bob;
```

下列範例會將 `ShareDb` 資料庫的 `ShareSchema` 結構描述中所有資料表的所有權限授予 `Sales` 角色。當指定結構描述時，您可以使用兩部分格式 `database.schema` 指定結構描述的資料庫。

```
GRANT ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema TO ROLE Sales;
```

以下範例與前面的範例是相同的。您可以使用 `DATABASE` 關鍵字來指定資料庫，而不是使用兩部分格式。

```
GRANT ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb TO ROLE Sales;
```

## 授予 ASSUMEROLE 權限的範例
<a name="r_GRANT-examples-assumerole"></a>

以下是授予 ASSUMEROLE 權限的範例

下列範例顯示超級使用者在叢集上執行一次的 REVOKE 陳述式，以啟用使用者和群組的 ASSUMEROLE 權限。然後，超級使用者會將 ASSUMEROLE 權限授予使用者和群組，以取得適當的命令。有關如何為使用者和群組啟用 ASSUMEROLE 權限的資訊，請參閱 [授予 ASSUMEROL 許可的使用須知](r_GRANT-usage-notes.md#r_GRANT-usage-notes-assumerole)。

```
revoke assumerole on all from public for all;
```

下列範例會將 ASSUMEROLE 權限授予使用者 `reg_user1`，讓 IAM 角色 `Redshift-S3-Read` 執行 COPY 操作。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-S3-Read'
to reg_user1 for copy;
```

下列範例會將 ASSUMEROLE 權限授予使用者 `reg_user1`，讓 IAM 角色鏈 `RoleB`、`RoleA` 執行 UNLOAD 操作。

```
grant assumerole
on 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB'
to reg_user1
for unload;
```

以下是使用 IAM 角色鏈結 `RoleA`、`RoleB` 的 UNLOAD 命令範例。

```
unload ('select * from venue limit 10')
to 's3://companyb/redshift/venue_pipe_'
iam_role 'arn:aws:iam::123456789012:role/RoleA,arn:aws:iam::210987654321:role/RoleB';
```

下列範例會將 ASSUMEROLE 權限授予使用者 `reg_user1`，讓 IAM 角色 `Redshift-Exfunc` 建立外部函數。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-Exfunc'
to reg_user1 for external function;
```

下列範例會將 ASSUMEROLE 權限授予使用者 `reg_user1`，讓 IAM 角色 `Redshift-model` 建立機器學習模型。

```
grant assumerole on 'arn:aws:iam::123456789012:role/Redshift-ML'
to reg_user1 for create model;
```

## 授予 ROLE 權限的範例
<a name="r_GRANT-examples-role"></a>

下列範例會將 sample\$1role1 授予 user1。

```
CREATE ROLE sample_role1;
GRANT ROLE sample_role1 TO user1;
```

下列範例會使用 WITH ADMIN OPTION 選項將 sample\$1role1 授予 user1、為 user1 設定目前工作階段，以及 user1 會將 sample\$1role1 授予 user2。

```
GRANT ROLE sample_role1 TO user1 WITH ADMIN OPTION;
SET SESSION AUTHORIZATION user1;
GRANT ROLE sample_role1 TO user2;
```

下列範例會將 sample\$1role1 授予 sample\$1role2。

```
GRANT ROLE sample_role1 TO ROLE sample_role2;
```

下列範例會將 sample\$1role2 授予 sample\$1role3 和 sample\$1role4。然後嘗試將 sample\$1role3 授予 sample\$1role1。

```
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2;
ERROR: cannot grant this role, a circular dependency was detected between these roles
```

下列範例會將 CREATE USER 系統權限授予 sample\$1role1。

```
GRANT CREATE USER TO ROLE sample_role1;
```

下列範例會將系統定義角色 `sys:dba` 授予 user1。

```
GRANT ROLE sys:dba TO user1;
```

下列範例會嘗試將循環相依性中的 sample\$1role3 授予 sample\$1role2。

```
CREATE ROLE sample_role3;
GRANT ROLE sample_role2 TO ROLE sample_role3;
GRANT ROLE sample_role3 TO ROLE sample_role2; -- fail
ERROR:  cannot grant this role, a circular dependency was detected between these roles
```

# INSERT
<a name="r_INSERT_30"></a>

**Topics**
+ [語法](#r_INSERT_30-synopsis)
+ [Parameters](#r_INSERT_30-parameters)
+ [使用須知](#r_INSERT_30_usage_notes)
+ [INSERT 範例](c_Examples_of_INSERT_30.md)

將新資料列插入資料表中。您可以使用 VALUES 語法插入單一資料列、使用 VALUES 語法插入多個資料列，或是一個或多個由查詢結果所定義的資料列 (INSERT INTO...SELECT)。

**注意**  
我們強烈鼓勵您使用 [COPY](r_COPY.md) 命令來載入大量資料。使用個別 INSERT 陳述式填入資料表的速度可能會相當慢。或者，如果您的資料已存在於其他 Amazon Redshift 資料庫資料表中，請使用 INSERT INTO SELECT 或 [CREATE TABLE AS](r_CREATE_TABLE_AS.md) 來改善效能。如需使用 COPY 命令載入資料表的相關資訊，請參閱 [在 Amazon Redshift 中載入資料](t_Loading_data.md)。

**注意**  
單一 SQL 陳述式的大小上限為 16 MB。

## 語法
<a name="r_INSERT_30-synopsis"></a>

```
INSERT INTO table_name [ ( column [, ...] ) ]
{DEFAULT VALUES |
VALUES ( { expression | DEFAULT } [, ...] )
[, ( { expression | DEFAULT } [, ...] )
[, ...] ] |
query }
```

## Parameters
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
暫時性或持久性資料表。只有資料表的擁有者，或具有資料表 INSERT 權限的使用者可以插入資料列。如果您使用 *query* 子句插入資料列，則必須具有查詢中所指名資料表的 SELECT 權限。  
使用 INSERT (外部資料表)，將 SELECT 查詢結果插入外部目錄上的現有資料表。如需詳細資訊，請參閱[INSERT (外部資料表)](r_INSERT_external_table.md)。

 *欄位*   
您可以將值插入資料表的一個或多個資料欄。您可以依任意順序列出目標資料欄名稱。若您未指定資料欄清單，則要插入的值必須依照 CREATE TABLE 陳述式中宣告的順序對應資料表資料欄。若要插入的值數目少於資料表中的資料欄數，則會在前 *n* 個資料欄中載入。  
任何未在 INSERT 陳述式中列出的資料欄中都會載入宣告的預設值或 null 值 (隱含或明確)。

DEFAULT VALUES   
若在建立資料表時對資料表中的資料欄指派預設值，請使用這些關鍵字插入完全由預設值組成的資料列。若有任何資料欄未包含預設值，則會將 null 插入這些資料欄。若有任何資料欄宣告 NOT NULL，則 INSERT 陳述式會傳回錯誤。

VALUES   
使用此關鍵字插入一個或多個資料列，每列包含一個或多個值。每列的 VALUES 清單必須符合資料欄清單。若要插入多個資料列，請使用逗號分隔符號分隔每份表達式清單。切勿重複 VALUES 關鍵字。多列 INSERT 陳述式的所有 VALUES 清單必須包含相同數目的值。

 *表達式*   
單一值，或判斷值為單一值的表達式。每個值都必須與其插入所在資料欄的資料類型相容。若值的資料類型與資料欄的宣告資料類型不相符，則會在可能的情況下自動轉換成相容的資料類型。例如：  
+ 小數值 `1.1` 插入 INT 資料欄時會是 `1`。
+ 小數值 `100.8976` 插入 DEC(5,2) 資料欄時會是 `100.90`。
您可以在表達式中包含類型轉換語法，藉此明確將值轉換成相容的資料類型。例如，若資料表 T1 中的資料欄 COL1 是 CHAR(3) 資料欄：  

```
insert into t1(col1) values('Incomplete'::char(3));
```
此陳述式會將值 `Inc` 插入資料欄。  
若是單一資料列 INSERT VALUES 陳述式，您可以使用純量子查詢做為表達式。子查詢的結果會插入適當的資料欄中。  
多資料列 INSERT VALUES 陳述式中不支援使用子查詢做為表達式。

DEFAULT   
使用此關鍵字可依資料表建立時所定義，插入資料欄的預設值。若資料欄沒有預設值，則會插入 null。若具有 NOT NULL 限制條件的資料欄在 CREATE TABLE 陳述式中沒有明確指定的預設值，則無法將預設值插入該資料欄。

 *query*   
藉由定義任何查詢將一個或多個資料列插入資料表。查詢產生的所有資料列都會插入資料表中。查詢必須傳回與資料表中資料欄相容的資料欄清單，但資料欄名稱不需相符。

## 使用須知
<a name="r_INSERT_30_usage_notes"></a>

**注意**  
我們強烈鼓勵您使用 [COPY](r_COPY.md) 命令來載入大量資料。使用個別 INSERT 陳述式填入資料表的速度可能會相當慢。或者，如果您的資料已存在於其他 Amazon Redshift 資料庫資料表中，請使用 INSERT INTO SELECT 或 [CREATE TABLE AS](r_CREATE_TABLE_AS.md) 來改善效能。如需使用 COPY 命令載入資料表的相關資訊，請參閱 [在 Amazon Redshift 中載入資料](t_Loading_data.md)。

所插入值的資料格式必須符合 CREATE TABLE 定義所指定的資料格式。

 將大量新資料列插入資料表之後：
+ 清空資料表以回收儲存空間和重新排序資料列。
+ 分析資料表以更新查詢規劃器的統計資訊。

若插入 DECIMAL 資料欄的值超出指定的小數位數，則載入的值會適當捨入。例如，若將值 `20.259` 插入 DECIMAL(8,2) 欄，儲存的值會是 `20.26`。

您可以插入至 GENERATED BY DEFAULT AS IDENTITY 資料欄。您可以利用您提供的值，更新定義為 GENERATED BY DEFAULT AS IDENTITY 的資料欄。如需詳細資訊，請參閱[GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause)。

# INSERT 範例
<a name="c_Examples_of_INSERT_30"></a>

TICKIT 資料庫中的 CATEGORY 資料表包含以下資料列：

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
     1 | Sports   | MLB       | Major League Baseball
     2 | Sports   | NHL       | National Hockey League
     3 | Sports   | NFL       | National Football League
     4 | Sports   | NBA       | National Basketball Association
     5 | Sports   | MLS       | Major League Soccer
     6 | Shows    | Musicals  | Musical theatre
     7 | Shows    | Plays     | All non-musical theatre
     8 | Shows    | Opera     | All opera and light opera
     9 | Concerts | Pop       | All rock and pop music concerts
    10 | Concerts | Jazz      | All jazz singers and bands
    11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

 以類似 CATEGORY 資料表的結構描述建立 CATEGORY\$1STAGE 資料表，但定義資料欄的預設值：

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

以下 INSERT 陳述式會選取 CATEGORY 資料表中的所有資料列，然後將它們插入 CATEGORY\$1STAGE 資料表。

```
insert into category_stage
(select * from category);
```

查詢前後的括號是選用的。

此命令會將新資料列插入 CATEGORY\$1STAGE 資料表，並且依序為每個資料欄指定值：

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

您也可以插入結合特定值與預設值的新資料列：

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

執行以下查詢來傳回插入的資料列：

```
select * from category_stage
where catid in(12,13) order by 1;

 catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
    12 | Concerts | Comedy  | All stand-up comedy performances
    13 | Concerts | Other   | General
(2 rows)
```

以下範例說明一些多資料列 INSERT VALUES 陳述式。第一個範例會在兩個資料列中插入特定 CATID 值，並且在兩個資料列的其他資料欄中插入預設值。

```
insert into category_stage values
(14, default, default, default),
(15, default, default, default);

select * from category_stage where catid in(14,15) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
    14 | General  | General | General
    15 | General  | General | General
(2 rows)
```

下一個範例會插入包含不同的特定與預設值組合的三個資料列：

```
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);

select * from category_stage where catid in(0,20,21) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
     0 | General  | General | General
    20 | General  | Country | General
    21 | Concerts | Rock    | General
(3 rows)
```

此範例中第一組 VALUES 產生的結果，與針對單一資料列 INSERT 陳述式指定 DEFAULT VALUES 的結果相同。

以下範例說明資料表有 IDENTITY 資料欄時的 INSERT 行為。首先，建立新的 CATEGORY 資料表版本，然後從 CATEGORY 將資料列插入其中：

```
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');


insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
```

請注意，您無法將特定整數值插入 CATID IDENTITY 資料欄。IDENTITY 資料欄的值會自動產生。

以下範例將示範，多資料列 INSERT VALUES 陳述式中無法使用子查詢做為表達式：

```
insert into category(catid) values
((select max(catid)+1 from category)),
((select max(catid)+2 from category));

ERROR: can't use subqueries in multi-row VALUES
```

下列範例會示範使用 `WITH SELECT` 子句將資料從 `venue` 資料表填入暫存資料表中的插入操作。如需 `venue` 資料表的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。

首先，建立暫存資料表 `#venuetemp`。

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

列出 `#venuetemp` 資料表中的資料列。

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756	
...
```

使用 `WITH SELECT` 子句在 `#venuetemp` 資料表中插入 10 個重複的資料列。

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

列出 `#venuetemp` 資料表中的資料列。

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756
5        Gillette Stadium           Foxborough   MA          68756
...
```

# INSERT (外部資料表)
<a name="r_INSERT_external_table"></a>

將 SELECT 查詢的結果插入外部目錄上的現有外部資料表 AWS Glue AWS Lake Formation，例如 for 或 Apache Hive 中繼存放區。使用用於 CREATE EXTERNAL SCHEMA 命令的相同 AWS Identity and Access Management (IAM) 角色，與外部目錄和 Amazon S3 互動。

對於未分割的資料表，INSERT (外部資料表) 命令會根據指定的資料表屬性和檔案格式，將資料寫入資料表中定義的 Amazon S3 位置。

針對分割的資料表，INSERT (外部資料表) 會根據資料表中指定的分割區索引鍵，將資料寫入 Amazon S3 位置。它也會在 INSERT 操作完成之後，自動在外部目錄中註冊新的分割區。

您不能在交易區塊 (BEGIN ... END) 內執行 INSERT (外部資料表)。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。

## 語法
<a name="r_INSERT_external_table-synopsis"></a>

```
INSERT INTO external_schema.table_name
{ select_statement }
```

## Parameters
<a name="r_INSERT_external_table-parameters"></a>

 *external\$1schema.table\$1name*   
現有外部資料結構描述的名稱和要插入的目標外部資料表。

 *select\$1statement*   
透過定義任何查詢，將一或多個列插入外部資料表的陳述式。所有查詢產生的列都會根據資料表定義，以文字或 Parquet 的格式被寫入 Amazon S3。查詢必須傳回與外部資料表中的欄位資料類型相容的欄位清單。不過，欄位名稱不一定要相符。

## 使用須知
<a name="r_INSERT_external_table_usage_notes"></a>

SELECT 查詢中的欄位數必須與資料欄位和分割區欄位的總和相同。每個資料欄的位置和資料類型必須與外部資料表的資料類型相符。分割區欄位的位置必須在 SELECT 查詢的結尾，與它們在 CREATE EXTERNAL TABLE 命令定義的順序相同。欄位名稱不一定要相符。

在某些情況下，您可能想要在 AWS Glue 資料目錄或 Hive 中繼存放區上執行 INSERT (外部資料表) 命令。在這種情況下 AWS Glue，用於建立外部結構描述的 IAM 角色必須同時擁有 Amazon S3 和 的讀取和寫入許可 AWS Glue。如果您使用 AWS Lake Formation 目錄，此 IAM 角色會成為新 Lake Formation 資料表的擁有者。此 IAM 角色至少必須具有下列許可：
+ 在外部資料表上的 SELECT、INSERT、UPDATE 許可
+ 外部資料表 Amazon S3 路徑上的資料位置許可

為了確保檔案名稱是唯一的，Amazon Redshift 依預設會針對每個上傳到 Amazon S3 的檔案名稱使用下列格式。

`<date>_<time>_<microseconds>_<query_id>_<slice-number>_part_<part-number>.<format>`.

例如，`20200303_004509_810669_1007_0001_part_00.parquet`。

執行 INSERT (外部資料表) 命令時，請考慮下列事項：
+ 不支援非 PARQUET 或 TEXTFILE 格式的外部資料表。
+ 此命令支援現有的資料表屬性，如 'write.parallel'、'write.maxfilesize.mb'、'compression\$1type’ 和 'serialization.null.format'。若要更新這些值，請執行 ALTER TABLE SET TABLE PROPERTIES 命令。
+ ‘numRows‘ 資料表屬性會朝向 INSERT 操作結尾自動更新。如果資料表屬性不是由 CREATE EXTERNAL TABLE AS 操作建立，則資料表屬性必須已定義或新增到資料表。
+ LIMIT 子句在外部的 SELECT 查詢中不受支援。請改用巢狀 LIMIT 子句。
+ 您可以使用此 [STL\$1UNLOAD\$1LOG](r_STL_UNLOAD_LOG.md) 資料表來追蹤每個 INSERT (外部資料表) 操作寫入 Amazon S3 的檔案。
+ Amazon Redshift 僅支援對 INSERT (外部資料表) 使用 Amazon S3 標準加密。

## INSERT (外部資料表) 範例
<a name="c_Examples_of_INSERT_external_table"></a>

下列範例會將 SELECT 陳述式的結果插入外部資料表。

```
INSERT INTO spectrum.lineitem
SELECT * FROM local_lineitem;
```

下列範例會使用靜態分割，將 SELECT 陳述式的結果插入已分割的外部資料表。分割區欄位是在 SELECT 陳述式中以硬式編碼寫成。分割區欄位必須位於查詢結尾。

```
INSERT INTO spectrum.customer
SELECT name, age, gender, 'May', 28 FROM local_customer;
```

下列範例會使用動態分割，將 SELECT 陳述式的結果插入已分割的外部資料表。分割區欄位並非硬式編碼。若已新增新的分割區，則資料會自動新增至現有的分割區資料夾或新的資料夾。

```
INSERT INTO spectrum.customer
SELECT name, age, gender, month, day FROM local_customer;
```

# LOCK
<a name="r_LOCK"></a>

限制對資料庫資料表的存取。此命令只有在交易區塊內執行時才有意義。

LOCK 命令會以 "ACCESS EXCLUSIVE" 模式取得資料表層級鎖定，必要時會等待任何衝突鎖定解除。若以此方式明確鎖定資料表，則從其他交易或工作階段嘗試時，會造成資料表的讀取和寫入等待。若某位使用者建立明確的資料表鎖定，則會暫時阻止其他使用者從該資料表選取資料或將資料載入其中。鎖定會在包含 LOCK 命令的交易完成時解除。

參考資料表的命令 (例如寫入操作) 會以隱含方式取得限制較少的資料表鎖定。例如，若使用者嘗試從資料表讀取資料時，有另一位使用者正在更新資料表，則讀取的資料會是已遞交資料的快照 (在某些情況下，若查詢違反可序列化隔離規則，則會停止)。請參閱 [管理並行寫入操作](c_Concurrent_writes.md)。

某些 DDL 操作 (例如 DROP TABLE 和 TRUNCATE) 會建立獨佔鎖定。這些操作會阻止資料讀取。

若發生鎖定衝突，Amazon Redshift 會顯示錯誤訊息，提醒進行發生衝突之交易的使用者。收到鎖定衝突的交易會停止。每次發生鎖定衝突時，Amazon Redshift 都會在 [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md) 資料表中寫入一項記錄。

## 語法
<a name="section_r_LOCK-synopsis"></a>

```
LOCK [ TABLE ] table_name [, ...]
```

## Parameters
<a name="parameters"></a>

TABLE   
選用的關鍵字。

 *table\$1name*   
要鎖定的資料表名稱。您可以使用逗號分隔的資料表名稱清單鎖定多個資料表。不過您無法鎖定檢視。

## 範例
<a name="example2"></a>

```
begin;

lock event, sales;

...
```

# MERGE
<a name="r_MERGE"></a>

有條件地將來源資料表中的資料列合併到目標資料表中。傳統上，這只能透過單獨使用多個插入、更新或刪除陳述式來實現。如需使用 MERGE 讓您合併操作的相關資訊，請參閱 [UPDATE](https://docs.aws.amazon.com/redshift/latest/dg/r_UPDATE.html)、[DELETE](https://docs.aws.amazon.com/redshift/latest/dg/r_DELETE.html) 和 [INSERT](https://docs.aws.amazon.com/redshift/latest/dg/r_INSERT_30.html)。

## 語法
<a name="r_MERGE-synopsis"></a>

```
MERGE INTO target_table 
USING source_table [ [ AS ] alias ] 
ON match_condition 
[ WHEN MATCHED THEN { UPDATE SET col_name = { expr } [,...] | DELETE }
WHEN NOT MATCHED THEN INSERT [ ( col_name [,...] ) ] VALUES ( { expr } [, ...] ) |
REMOVE DUPLICATES ]
```

## Parameters
<a name="r_MERGE-parameters"></a>

 *target\$1table*  
將與 MERGE 陳述式合併的暫存或永久資料表。

 *source\$1table*  
提供要合併到 *target\$1table* 之列的暫存或永久資料表。*source\$1table* 也可以是 Spectrum 資料表。

 *alias*  
*source\$1table* 暫時替代名稱。  
此為選用參數。以 AS 開頭的 *alias* 也是選用項目。

 *match\$1condition*  
指定來源資料表資料欄與目標資料表資料欄之間的相等述詞，這些資料欄的作用是判斷 *source\$1table* 中的資料列是否可與 *target\$1table* 中的資料列相符。如果符合條件，則 MERGE 會針對該資料列執行 *matched\$1clause*。否則，MERGE 會為該資料列執行 *not\$1matched\$1clause*。

WHEN MATCHED  
 指定當來源資料列與目標資料列之間的比對條件評估為 True 時，要執行的動作。您可以指定 UPDATE 動作或 DELETE 動作。

UPDATE  
 更新 *target\$1table* 中的相符資料列。只會更新 *col\$1name* 中您指定的值。

DELETE  
 刪除 *target\$1table* 中的相符資料列。

WHEN NOT MATCHED  
 指定當比對條件評估為 False 或未知時要執行的動作。您只能為此子句指定 INSERT 插入動作。

INSERT  
 根據 *match\$1condition*，從 *source\$1table* 將不符合 *target\$1table* 中的任何列插入 *target\$1table* 列中。您可以依任意順序列出目標 *col\$1name*。如果您不提供任何 *col\$1name* 值，則預設順序是按所有資料表資料欄的宣告順序排序。

 *col\$1name*  
您要修改的一個或多個資料欄名稱。不要在指定目標資料欄時包含資料表名稱。

 *expr*  
定義 *col\$1name* 新值的運算式。

 REMOVE DUPLICATES  
指定 MERGE 命令以簡化模式執行。簡化模式有以下要求：  
+  *target\$1table* 和 *source\$1table* 必須具有相同數目的欄、相容的欄類型，以及相同的欄順序。
+  從 MERGE 命令省略 WHEN 子句和 UPDATE 和 INSERT 子句。
+  在 MERGE 命令中使用 REMOVE DUPLICATES 子句。
在簡化模式中，MERGE 會執行下列操作：  
+  *target\$1table* 中具有 *source\$1table* 中相符項目的資料列會更新，以符合 *source\$1table* 中的值。
+  *source\$1table* 中沒有 *target\$1table* 中相符項目的資料列會插入到 *target\$1table* 中。
+  當 *target\$1table* 中的多個資料列與 *source\$1table* 中的相同資料列相符時，重複的資料列會移除。Amazon Redshift 會保留一個資料列並對其進行更新。與 *source\$1table* 中的資料列不相符的重複資料列保持不變。
使用 REMOVE DUPLICATES 可提供比使用 WHEN MATCHED 和 WHEN NOT MATCHED 更好的效能。如果 *target\$1table* 和 *source\$1table* 相容，而且您不需要在 *target\$1table* 中保留重複資料列，我們建議您使用 REMOVE DUPLICATES。

## 使用須知
<a name="r_MERGE_usage_notes"></a>
+ 若要執行 MERGE 陳述式，您必須是 *source\$1table* 和 *target\$1table* 的擁有者，或具有這些資料表的 SELECT 許可。此外，視 MERGE 陳述式中包含的操作而定，您可能必須擁有 *target\$1table* 的 UPDATE、DELETE 和 INSERT 許可。
+  *target\$1table* 不能是系統資料表、目錄資料表或外部資料表。
+  *source\$1table* 和 *target\$1table* 不能是相同資料表。
+  您無法在 MERGE 陳述式中使用 WITH 子句。
+  *target\$1table* 的資料列無法比對 *source\$1table* 中的多個資料列。

  請思考下列範例：

  ```
  CREATE TABLE target (id INT, name CHAR(10));
  CREATE TABLE source (id INT, name CHAR(10));
  
  INSERT INTO target VALUES (1, 'Bob'), (2, 'John');
  INSERT INTO source VALUES (1, 'Tony'), (1, 'Alice'), (3, 'Bill');
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  
  MERGE INTO target USING source ON target.id = source.id
  WHEN MATCHED THEN DELETE
  WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);
  ERROR: Found multiple matches to update the same tuple.
  ```

  在這兩個 MERGE 陳述式中，操作都會失敗，因為 `source` 資料表中有多個 ID 值為 `1` 的資料列。
+  *match\$1condition* 和 *expr* 不能部分參考 SUPER 類型的資料欄。例如，如果您的 SUPER 類型物件是陣列或結構，就不能將該資料欄的個別元素用於 *match\$1condition* 或 *expr*，但您可以使用整個資料欄。

  請思考下列範例：

  ```
  CREATE TABLE IF NOT EXISTS target (key INT, value SUPER);
  CREATE TABLE IF NOT EXISTS source (key INT, value SUPER);
  
  INSERT INTO target VALUES (1, JSON_PARSE('{"key": 88}'));
  INSERT INTO source VALUES (1, ARRAY(1, 'John')), (2, ARRAY(2, 'Bill'));
  
  MERGE INTO target USING source ON target.key = source.key
  WHEN matched THEN UPDATE SET value = source.value[0]
  WHEN NOT matched THEN INSERT VALUES (source.key, source.value[0]);
  ERROR: Partial reference of SUPER column is not supported in MERGE statement.
  ```

  如需 SUPER 類型的相關資訊，請參閱 [SUPER 類型](https://docs.aws.amazon.com/redshift/latest/dg/r_SUPER_type.html)。
+ 如果 *source\$1table* 很大，則將 *target\$1table* 和 *source\$1table* 中的聯接資料欄定義為分佈索引鍵可以提高性能。
+ 若要使用 REMOVE DUPLICATES 子句，您需要 *target\$1table* 的 SELECT、INSERT 和 DELETE 許可。
+  *source\$1table* 可以是檢視或子查詢。以下是 MERGE 陳述式的範例，其中 *source\$1table* 是移除重複列的子查詢。

  ```
  MERGE INTO target
  USING (SELECT id, name FROM source GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```
+ 目標不可是相同 MERGE 陳述式之任何子查詢的資料來源。例如，下列 SQL 命令會傳回如下所示的錯誤：ERROR: Source view/subquery in Merge statement cannot reference target table. (錯誤：Merge 陳述式中的來源檢視/子查詢無法參考目標資料表)，因為子查詢參考 `target` 而非 `source`。

  ```
  MERGE INTO target
  USING (SELECT id, name FROM target GROUP BY 1, 2) as my_source
  ON target.id = my_source.id
  WHEN MATCHED THEN UPDATE SET id = my_source.id, name = my_source.name
  WHEN NOT MATCHED THEN INSERT VALUES (my_source.id, my_source.name);
  ```

## 範例
<a name="sub-examples-merge"></a>

下列範例會建立兩個資料表，然後對其執行 MERGE 作業，並更新目標資料表中的相符資料列，以及插入不相符的資料列。然後將另一個值插入到來源表資料表中，並執行另一個 MERGE 操作，這次會刪除相符的資料列並從來源資料表中插入新資料列。

首先建立並填入來源和目標資料表。

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (101, 'Bob'), (102, 'John'), (103, 'Susan');
INSERT INTO source VALUES (102, 'Tony'), (103, 'Alice'), (104, 'Bill');

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | John
 103 | Susan
(3 rows)

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
(3 rows)
```

接下來，將來源資料表合併到目標資料表，使用相符的資料列更新目標資料表，並從來源資料表插入不相符的資料列。

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN UPDATE SET id = source.id, name = source.name
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 102 | Tony
 103 | Alice
 104 | Bill
(4 rows)
```

請注意，識別碼值為 102 和 103 的資料列會更新，以符合目標資料表中的名稱值。此外，ID 值為 104 且名稱值為 Bill 的新資料列會插入目標資料表中。

接下來，在來源資料表中插入新資料列。

```
INSERT INTO source VALUES (105, 'David');

SELECT * FROM source;
 id  |    name
-----+------------
 102 | Tony
 103 | Alice
 104 | Bill
 105 | David
(4 rows)
```

最後，執行合併操作，刪除目標資料表中的相符資料列，並插入不相符的資料列。

```
MERGE INTO target USING source ON target.id = source.id
WHEN MATCHED THEN DELETE
WHEN NOT MATCHED THEN INSERT VALUES (source.id, source.name);

SELECT * FROM target;
 id  |    name
-----+------------
 101 | Bob
 105 | David
(2 rows)
```

識別碼值為 102、103 和 104 的資料列會從目標資料表中刪除，而識別碼值為 105 且名稱值為 David 的新資料列會插入目標資料表中。

下列範例顯示使用 REMOVE DUPLICATES 子句的簡化 MERGE 命令語法。

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (11, 'Alice'), (23, 'Bill');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
11 | Alice
23 | David
22 | Clarence
(4 rows)
```

下列範例顯示使用 REMOVE DUPLICATES 子句的簡化 MERGE 命令語法，會在 *target\$1table* 中的列與 *source\$1table* 中的列相符時，從前者中移除重複的列。

```
CREATE TABLE target (id INT, name CHAR(10));
CREATE TABLE source (id INT, name CHAR(10));

INSERT INTO target VALUES (30, 'Tony'), (30, 'Daisy'), (11, 'Alice'), (23, 'Bill'), (23, 'Nikki');
INSERT INTO source VALUES (23, 'David'), (22, 'Clarence');

MERGE INTO target USING source ON target.id = source.id REMOVE DUPLICATES;

SELECT * FROM target;
id | name
---+------------
30 | Tony
30 | Daisy
11 | Alice
23 | David
22 | Clarence
(5 rows)
```

執行 MERGE 後， *target\$1table* 中只有一個 ID 值為 23 的資料列。由於 *source\$1table* 中沒有 ID 值為 30 的資料列，所以 ID 值為 30 的兩個重複資料列會保留在 *target\$1table* 中。

## 另請參閱
<a name="r_MERGE-see-also"></a>

 [INSERT](r_INSERT_30.md), [UPDATE](r_UPDATE.md), [DELETE](r_DELETE.md) 

# PREPARE
<a name="r_PREPARE"></a>

準備陳述式供執行。

PREPARE 會建立預備陳述式。當 PREPARE 陳述式執行時，會剖析、重寫及規劃指定的陳述式 (SELECT、INSERT、UPDATE 或 DELETE)。接著對預備陳述式發出 EXECUTE 命令時，Amazon Redshift 可能會選擇先修改查詢執行計畫 (依據指定的參數值改善效能)，再執行預備陳述式。

## 語法
<a name="r_PREPARE-synopsis"></a>

```
PREPARE plan_name [ (datatype [, ...] ) ] AS statement
```

## Parameters
<a name="r_PREPARE-parameters"></a>

 *plan\$1name*   
給予此特定預備陳述式的任意名稱。此名稱在單一工作階段內必須是唯一的，且後續會用來執行或解除配置先前的預備陳述式。

 *datatype*   
預備陳述式的參數資料類型。若要在預備陳述式本身內參考參數，請使用 \$11、\$12，以此類推，最多為 \$132767。

 *statement *   
任何 SELECT、INSERT、UPDATE 或 DELETE 陳述式。

## 使用須知
<a name="r_PREPARE_usage_notes"></a>

預備陳述式可採用參數：這些值會在陳述式執行時替換到其中。若要在預備陳述式中包含參數，請在 PREPARE 陳述式中提供資料類型清單，然後在要準備的陳述式本身內使用 \$11、\$12 等符號依位置參考參數。參數的數量上限為 32767。當執行陳述式時，在 EXECUTE 陳述式中指定這些參數的實際值。如需詳細資訊，請參閱[EXECUTE](r_EXECUTE.md)。

預備陳述式只會在目前工作階段期間內存在。當工作階段結束時，就會捨棄預備陳述式，因此必須再次建立它才能再度使用。這也表示，單一預備陳述式無法供多個同步的資料庫用戶端使用；不過，每個用戶端可建立自己要使用的預備陳述式。預備陳述式可使用 DEALLOCATE 命令手動移除。

在使用單一工作階段執行大量類似的陳述式時，預備陳述式能獲得最大效能。如前所述，每次重頭執行預備陳述式時，Amazon Redshift 都會根據指定的參數值修改查詢執行計畫以提升效能。若要檢查 Amazon Redshift 為任何特定 EXECUTE 陳述式選擇的查詢執行計畫，請使用 [EXPLAIN](r_EXPLAIN.md) 命令。

如需 Amazon Redshift 為進行查詢最佳化所收集的查詢計畫和統計資訊的相關資訊，請參閱 [ANALYZE](r_ANALYZE.md) 命令。

## 範例
<a name="sub-examples-prepare"></a>

建立臨時資料表、準備 INSERT 陳述式，然後執行它：

```
DROP TABLE IF EXISTS prep1;
CREATE TABLE prep1 (c1 int, c2 char(20));
PREPARE prep_insert_plan (int, char)
AS insert into prep1 values ($1, $2);
EXECUTE prep_insert_plan (1, 'one');
EXECUTE prep_insert_plan (2, 'two');
EXECUTE prep_insert_plan (3, 'three');
DEALLOCATE prep_insert_plan;
```

準備 SELECT 陳述式，然後執行它：

```
PREPARE prep_select_plan (int)
AS select * from prep1 where c1 = $1;
EXECUTE prep_select_plan (2);
EXECUTE prep_select_plan (3);
DEALLOCATE prep_select_plan;
```

## 另請參閱
<a name="r_PREPARE-see-also"></a>

 [DEALLOCATE](r_DEALLOCATE.md), [EXECUTE](r_EXECUTE.md) 

# REFRESH MATERIALIZED VIEW
<a name="materialized-view-refresh-sql-command"></a>

重新整理具體化檢視。

當您建立具體化視觀表時，其內容會反映當時基礎資料庫資料表或資料表的狀態。即使應用程式對基底資料表中的資料進行變更，具體化檢視中的資料仍會維持不變。

如要更新具體化視觀表中的資料，您可以隨時使用 `REFRESH MATERIALIZED VIEW` 陳述式。當您執行此陳述式時，Amazon Redshift 會識別在基底資料表或資料表中發生的變更，然後將這些變更套用到具體化視觀表。

如需具體化檢視的相關資訊，請參閱 [Amazon Redshift 中的具體化視觀表](materialized-view-overview.md)。

## 語法
<a name="mv_REFRESH_MATERIALIZED_VIEW-synopsis"></a>

```
REFRESH MATERIALIZED VIEW mv_name [ RESTRICT | CASCADE ]
```

## Parameters
<a name="mv_REFRESH_MATERIALIZED_VIEW-parameters"></a>

*mv\$1name*  
要重新整理的具體化檢視名稱。

RESTRICT  
選用的關鍵字。重新整理指定的具體化視觀表，但不會重新整理其相依的具體化視觀表。如果未指定 RESTRICT 或 CASCADE，則為預設值。

CASCADE  
選用的關鍵字。重新整理指定的具體化視觀表和所有其相依的具體化視觀表。

## 使用須知
<a name="mv_REFRESH_MARTERIALIZED_VIEW_usage"></a>

只有具體化檢視的擁有者才能對該檢視執行 `REFRESH MATERIALIZED VIEW` 操作。此外，擁有者必須對基礎資料表具有 SELECT 權限，才能成功執行 `REFRESH MATERIALIZED VIEW`。

`REFRESH MATERIALIZED VIEW` 命令會以自己所屬的交易形式執行。遵循 Amazon Redshift 交易語意，以決定 `REFRESH` 命令可以看到基礎資料表中的哪些資料，或是當 `REFRESH` 命令進行變更時，在 Amazon Redshift 中執行的其他交易是否會顯示。
+ 針對累加式具體化檢視，`REFRESH MATERIALIZED VIEW` 只會使用已遞交的基底資料表資料列。因此，如果重新整理操作在相同交易中的資料處理語言 (DML) 陳述式之後執行，則重新整理看不見該 DML 陳述式的變更。
+ 針對具體化視觀表的完全重新整理，`REFRESH MATERIALIZED VIEW` 會根據一般 Amazon Redshift 交易語意，查看重新整理交易可見的所有基底資料表資料列。
+ 根據輸入引數類型，Amazon Redshift 仍支援具有特定輸入引數類型之下列函數的具體化檢視增量重新整理：DATE (時間戳記)、DATE\$1PART (日期、時間、間隔、time-tz)、DATE\$1TRUNC (時間戳記、間隔)。
+ 基礎資料表位於資料共用中的具體化視觀表支援累加式重新整理。
+ 包含其他具體化視觀表、Spectrum 資料表、不同 Redshift 叢集或 UDFs 中定義的資料表參考的具體化視觀表不支援從遠端資料共用叢集重新整理共用具體化視觀表。這類具體化視觀表可以從本機 （生產者） 叢集重新整理。

Amazon Redshift 中的某些操作會和具體化視觀表互動。其中部份作業可能會強制 `REFRESH MATERIALIZED VIEW` 作業完全重新計算具體化檢視，即使定義具體化檢視的查詢只會使用適用於增量重新整理的 SQL 功能。例如：
+ 如果具體化檢視並未重新整理，則背景 vacuum 操作可能會遭到封鎖。在內部定義的閾值期間後，便會允許執行 vacuum 操作。發生此 vacuum 操作時，任何依存的具體化檢視都會標記為在下一次重新整理時重新進行運算 (即使這些具體化檢視為累加式也一樣)。如需 VACUUM 的詳細資訊，請參閱 [VACUUM](r_VACUUM_command.md)。如需事件和狀態變更的相關資訊，請參閱 [STL\$1MV\$1STATE](r_STL_MV_STATE.md)。
+ 有些使用者在基底資料表上啟動的操作會強制具體化檢視在下一次執行 REFRESH 操作時重新運算。這類操作的範例：手動調用的 VACUUM、傳統調整大小、ALTER DISTKEY 操作，ALTER SORTKEY 操作和 TRUNCATE 操作。在某些情況下，自動操作也可能導致在下次執行 REFRESH 操作時，完整重新運算具體化視觀表。例如，自動清空刪除操作可能會導致完整重新運算。如需事件和狀態變更的相關資訊，請參閱 [STL\$1MV\$1STATE](r_STL_MV_STATE.md)。

## 階層式重新整理
<a name="mv_REFRESH_MATERIALIZED_VIEW_cascading"></a>

CASCADE 選項會依相依性順序重新整理指定的具體化視觀表及其所有相依的具體化視觀表：基礎 MV 會在上層 MV 之前 (拓撲順序) 經過 REFRESH。這可讓您在單一命令中更新一組巢狀具體化視觀表。

RESTRICT 選項 (若未指定 RESTRICT 或 CASCADE，則為預設值) 只會重新整理指定的具體化視觀表。

使用 CASCADE 選項時適用下列規則：
+ 只有具體化視觀表的擁有者或超級使用者可以執行 `REFRESH MATERIALIZED VIEW ... CASCADE` 命令。
+ 如果階層中有任何無法重新整理的具體化視觀表，則整個階層操作將會停止。

只有在本機和串流具體化視觀表上巢狀嵌套的 MV 才支援階層式重新整理功能。階層模式中不支援如 Spectrum 或資料共用等其他來源類型的具體化視觀表。CASCADE 會在單一交易中針對所有巢狀 MV 執行重新整理。

## 資料共用中具體化視觀表的累加式重新整理
<a name="mv_REFRESH_MATERIALIZED_VIEW_datashare"></a>

 共用基礎資料表時，Amazon Redshift 支援取用者資料共用中具體化視觀表的自動和累加式重新整理。累加式重新整理是一項操作，Amazon Redshift 會藉此識別基礎資料表自上一次重新整理後發生的變更，並且僅更新具體化視觀表中對應的記錄。如需此行為的詳細資訊，請參閱 [CREATE MATERIALIZED VIEW](https://docs.aws.amazon.com/redshift/latest/dg/materialized-view-create-sql-command.html#mv_CREATE_MARTERIALIZED_VIEW_datashare)。

## 增量重新整理的限制
<a name="mv_REFRESH_MARTERIALIZED_VIEW_limitations"></a>

對於使用下列任一 SQL 元素搭配查詢定義的具體化視觀表，Amazon Redshift 目前不支援累加式重新整理：
+ OUTER JOIN (RIGHT、LEFT 或 FULL)。
+ 集合操作：UNION、INTERSECT、EXCEPT、MINUS。
+ 當發生在子查詢和彙總函數中，或查詢中存在 GROUP BY 子句，或目標具體化視觀表包含排序索引鍵時，則 UNION ALL。
+ 彙整函數：MEDIAN、PERCENTILE\$1CONT、LISTAGG、STDDEV\$1SAMP、STDDEV\$1POP、APPROXIMATE COUNT、APPROXIMATE PERCENTILE 及位元彙整函數。
**注意**  
支援 COUNT、SUM、MIN、MAX 和 AVG 彙總函數。
+ DISTINCT 彙整函數，例如 DISTINCT COUNT、DISTINCT SUM 等。
+ 視窗函數。
+ 使用暫存資料表進行查詢最佳化的查詢，例如最佳化通用子運算式。
+ 子查詢
+ 在定義具體化視觀表的查詢中，參照下列查詢中的格式的外部資料表。
  +  Delta Lake 
  +  Hudi 

  對於使用上述以外格式定義的具體化視觀表，支援累加式重新整理。如需詳細資訊，請參閱[Amazon Redshift Spectrum 中外部資料湖資料表的具體化視觀表外部資料湖資料表的具體化視觀表](materialized-view-external-table.md)。
+ 可變函數，例如日期時間函數，RANDOM 和非穩定的使用者定義函數。
+ 若要了解有關零 ETL 整合的累加式重新整理的限制，請參閱[將零 ETL 整合與 Amazon Redshift 搭配使用的考量](https://docs.aws.amazon.com/redshift/latest/mgmt/zero-etl.reqs-lims.html)。
+ 從多個資料庫存取資料表。

如需有關具體化視觀表的相關資訊，包括具體化視觀表重新整理操作上的背景作業影響，例如 VACUUM，請參閱 [使用須知](#mv_REFRESH_MARTERIALIZED_VIEW_usage)。

## 範例
<a name="mv_REFRESH_MARTERIALIZED_VIEW_examples"></a>

以下範例會重新整理 `tickets_mv` 具體化檢視。

```
REFRESH MATERIALIZED VIEW tickets_mv;
```

下列範例會重新整理 `products_mv` 具體化視觀表和所有其相依的具體化視觀表：

```
REFRESH MATERIALIZED VIEW products_mv CASCADE; 
```

# RESET
<a name="r_RESET"></a>

將組態參數的值還原為其預設值。

您可以重設單一指定參數，或一次還原所有參數。若要將參數設定為特定值，請使用 [SET](r_SET.md) 命令。若要顯示參數的目前值，請使用 [SHOW](r_SHOW.md) 命令。

## 語法
<a name="r_RESET-synopsis"></a>

```
RESET { parameter_name | ALL }
```

以下陳述式會將工作階段內容變數的值設定為 NULL。

```
RESET { variable_name | ALL }
```

## Parameters
<a name="r_RESET-parameters"></a>

 *parameter\$1name*   
要重設的參數名稱。如需更多有關參數的文件，請參閱 [修改伺服器組態](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings)。

ALL   
重設所有執行期參數，包括所有工作階段內容變數。

*variable*   
要重設的變數名稱 如果要執行 RESET 的值是工作階段內容變數，Amazon Redshift 會將其設定為 NULL。

## 範例
<a name="r_RESET-examples"></a>

以下範例會將 `query_group` 參數重設為其預設值：

```
reset query_group;
```

以下範例會將所有執行時間參數重設為其預設值。

```
reset all;
```

下列範例會重設內容變數。

```
RESET app_context.user_id;
```

# REVOKE
<a name="r_REVOKE"></a>

從使用者或角色移除存取許可，例如建立、捨棄或更新資料表的許可。

您只能對使用 ON SCHEMA 語法的資料庫使用者和角色執行外部結構描述的 GRANT 或 REVOKE USAGE 許可。搭配 ON EXTERNAL SCHEMA 使用 時 AWS Lake Formation，您只能對 AWS Identity and Access Management (IAM) 角色授予 GRANT 和 REVOKE 許可。如需許可的清單，請參閱語法。

若為預存程序，系統依預設會將 USAGE ON LANGUAGE `plpgsql` 許可授予 PUBLIC。在預設情況下，EXECUTE ON PROCEDURE 許可只會授予擁有者和超級使用者。

在 REVOKE 命令中指定要移除的許可。若要授予許可，請使用 [GRANT](r_GRANT.md) 命令。

## 語法
<a name="r_REVOKE-synopsis"></a>

```
REVOKE [ GRANT OPTION FOR ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | REFERENCES | ALTER | TRUNCATE } [,...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] }
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | TEMPORARY | TEMP | ALTER } [,...] | ALL [ PRIVILEGES ] }
ON DATABASE db_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
EXECUTE
    ON FUNCTION function_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
{ { EXECUTE } [,...] | ALL [ PRIVILEGES ] }
    ON PROCEDURE procedure_name ( [ [ argname ] argtype [, ...] ] ) [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
USAGE
    ON LANGUAGE language_name [, ...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
[ RESTRICT ]

REVOKE [GRANT OPTION FOR] 
{ { ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
    ON COPY JOB job_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]    

REVOKE [GRANT OPTION FOR]
{ { ALTER | DROP | USAGE } [,...] | ALL [ PRIVILEGES ] }
    ON TEMPLATE template_name [,...]
    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 授予資料表的資料欄層級許可
<a name="revoke-column-level"></a>

下列語法適用於 Amazon Redshift 資料表和檢視上的資料欄層級許可。

```
REVOKE { { SELECT | UPDATE } ( column_name [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column_name [,...] ) }
     ON { [ TABLE ] table_name [, ...] }
     FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
     [ RESTRICT ]
```

### 撤銷 ASSUMEROLE 許可
<a name="revoke-assumerole-permissions"></a>

以下語法可將 ASSUMEROLE 許可從具有指定角色的使用者和群組中撤銷。

```
REVOKE ASSUMEROLE
    ON { 'iam_role' [, ...]  | default | ALL }
    FROM { user_name | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    FOR { ALL | COPY | UNLOAD | EXTERNAL FUNCTION | CREATE MODEL }
```

### 撤銷 Redshift Spectrum 使用 Lake Formation 的許可
<a name="revoke-spectrum-integration-with-lf-permissions"></a>

以下是 Redshift Spectrum 與 Lake Formation 整合的語法。

```
REVOKE [ GRANT OPTION FOR ]
{ SELECT | ALL [ PRIVILEGES ] } ( column_list )
    ON EXTERNAL TABLE schema_name.table_name
    FROM { IAM_ROLE iam_role } [, ...]

REVOKE [ GRANT OPTION FOR ]
{ { SELECT | ALTER | DROP | DELETE | INSERT }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL TABLE schema_name.table_name [, ...]
    FROM { { IAM_ROLE iam_role } [, ...] | PUBLIC }

REVOKE [ GRANT OPTION FOR ]
{ { CREATE | ALTER | DROP }  [, ...] | ALL [ PRIVILEGES ] }
    ON EXTERNAL SCHEMA schema_name [, ...]
    FROM { IAM_ROLE iam_role } [, ...]
```

### 撤銷資料共用許可
<a name="revoke-datashare-permissions"></a>

**生產者端資料共用權限**  
以下是使用 REVOKE 移除使用者或角色的 ALTER 或 SHARE 權限的語法。權限已被撤銷的使用者無法再變更資料共用，或將使用權授予取用者。

```
REVOKE { ALTER | SHARE } ON DATASHARE datashare_name
 FROM { username [ WITH GRANT OPTION ] | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

以下是使用 REVOKE 移除取用者對資料共用的存取的語法。

```
REVOKE USAGE
 ON DATASHARE datashare_name
 FROM NAMESPACE 'namespaceGUID' [, ...] | ACCOUNT 'accountnumber' [ VIA DATA CATALOG ] [, ...]
```

以下是將資料共用使用權從 Lake Formation 帳戶撤銷的範例。

```
REVOKE USAGE ON DATASHARE salesshare FROM ACCOUNT '123456789012' VIA DATA CATALOG;
```

**取用者端資料共用權限**  
以下是資料共用使用許可的 REVOKE 語法，用於特定資料庫或從資料共用建立的結構描述。從用 WITH PERMISSIONS 子句建立的資料庫撤銷使用權限，不會撤銷您授予使用者或角色的其他任何權限，包括授予基礎物件的物件層級權限。如果您重新授予該使用者或角色的使用權限，他們會保留他們在您撤銷使用權之前擁有的其他所有權限。

```
REVOKE USAGE ON { DATABASE shared_database_name [, ...] | SCHEMA shared_schema}
 FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
```

### 撤銷限定範圍權限
<a name="revoke-scoped-permissions"></a>

限定範圍許可讓您能夠對使用者或角色授予資料庫或結構描述內某一種類型的所有物件的許可。具有限定範圍許可的使用者和角色對於資料庫或結構描述內所有目前和未來的物件擁有指定的許可。

您可以在 [SVV\$1DATABASE\$1PRIVILEGES](r_SVV_DATABASE_PRIVILEGES.md) 中檢視資料庫層級限定範圍許可的範圍。您可以在 [SVV\$1SCHEMA\$1PRIVILEGES](r_SVV_SCHEMA_PRIVILEGES.md) 中檢視結構描述層級限定範圍許可的範圍。

如需限定範圍許可的詳細資訊，請參閱 [限定範圍權限](t_scoped-permissions.md)。

以下是撤銷使用者和角色之限定範圍權限的語法。

```
REVOKE [ GRANT OPTION ] 
{ CREATE | USAGE | ALTER | DROP } [,...] | ALL [ PRIVILEGES ] }
FOR SCHEMAS IN
DATABASE db_name 
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ]
{ { SELECT | INSERT | UPDATE | DELETE | DROP | ALTER | TRUNCATE | REFERENCES } [, ...] } | ALL [PRIVILEGES] } }
FOR TABLES IN
{ SCHEMA schema_name [ DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR FUNCTIONS IN 
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] { EXECUTE | ALL [ PRIVILEGES ] }
FOR PROCEDURES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]

REVOKE [ GRANT OPTION ] USAGE
FOR LANGUAGES IN
DATABASE db_name
FROM { username | ROLE role_name } [, ...]  

REVOKE [GRANT_OPTION] 
{ { CREATE | ALTER | DROP} [,...] | ALL [ PRIVILEGES ] }
FOR COPY JOBS 
IN DATABASE db_name
FROM { username [ WITH GRANT OPTION ] | ROLE role_name } [, ...]      

REVOKE [ GRANT OPTION ]
{ {ALTER | DROP  | USAGE } [,...] | ALL [ PRIVILEGES ] }
FOR TEMPLATES IN
{ SCHEMA schema_name [DATABASE db_name ] | DATABASE db_name }
FROM { username | ROLE role_name } [, ...]
```

請注意，限定範圍許可不區分函式的許可和程序的許可。例如，下列陳述式會同時撤銷 `bob` 在結構描述 `Sales_schema` 中的函式和程序的 `EXECUTE` 許可。

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

### 撤銷機器學習許可
<a name="revoke-model-permissions"></a>

以下是 Amazon Redshift 上的機器學習模型許可語法。

```
REVOKE [ GRANT OPTION FOR ]
    CREATE MODEL FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]

REVOKE [ GRANT OPTION FOR ]
    { EXECUTE | ALL [ PRIVILEGES ] }
    ON MODEL model_name [, ...]

    FROM { username | ROLE role_name | GROUP group_name | PUBLIC } [, ...]
    [ RESTRICT ]
```

### 撤銷角色許可
<a name="revoke-roles"></a>

以下是在 Amazon Redshift 上使用撤銷角色許可的語法。

```
REVOKE [ ADMIN OPTION FOR ] { ROLE role_name } [, ...] FROM { user_name } [, ...]
```

```
REVOKE { ROLE role_name } [, ...] FROM { ROLE role_name } [, ...]
```

以下是在 Amazon Redshift 上對角色撤銷系統許可的語法。

```
REVOKE
  {
    { CREATE USER | DROP USER | ALTER USER |
    CREATE SCHEMA | DROP SCHEMA |
    ALTER DEFAULT PRIVILEGES |
    ACCESS CATALOG |
    CREATE TABLE | DROP TABLE | ALTER TABLE |
    CREATE OR REPLACE FUNCTION | CREATE OR REPLACE EXTERNAL FUNCTION |
    DROP FUNCTION |
    CREATE OR REPLACE PROCEDURE | DROP PROCEDURE |
    CREATE OR REPLACE VIEW | DROP VIEW |
    CREATE MODEL | DROP MODEL |
    CREATE DATASHARE | ALTER DATASHARE | DROP DATASHARE |
    CREATE LIBRARY | DROP LIBRARY |
    CREATE ROLE | DROP ROLE
    TRUNCATE TABLE
    VACUUM | ANALYZE | CANCEL }[, ...]
  }
  | { ALL [ PRIVILEGES ] }
FROM { ROLE role_name } [, ...]
```

### 撤銷安全政策的許可
<a name="revoke-role-level"></a>

以下語法可用來撤銷許可，以解釋 EXPLAIN 計畫中查詢的安全政策篩選。可能的安全政策包括資料列層級安全政策和動態資料遮罩政策。

```
REVOKE EXPLAIN { RLS | MASKING } FROM ROLE rolename 
```

以下是撤銷許可的語法，會略過查詢資料列層級安全政策。

```
REVOKE IGNORE RLS FROM ROLE rolename 
```

以下是從指定的安全政策撤銷 SELECT 許可的語法。可能的安全政策包括資料列層級安全政策和動態資料遮罩政策。

```
REVOKE SELECT ON [ TABLE ] table_name [, ...]
            FROM { RLS | MASKING } POLICY policy_name [, ...]
```

## Parameters
<a name="r_REVOKE-parameters"></a>

GRANT OPTION FOR   
只會撤銷對其他使用者授予指定許可的選項，而不會撤銷許可本身。您無法撤銷群組或 PUBLIC 的 GRANT OPTION。

SELECT   
撤銷使用 SELECT 陳述式從資料表或檢視選取資料的許可。

INSERT   
撤銷使用 INSERT 陳述式或 COPY 陳述式將資料載入資料表中的許可。

UPDATE   
撤銷使用 UPDATE 陳述式更新資料表資料欄的許可。

DELETE   
撤銷從資料表中刪除資料列的許可。

REFERENCES   
撤銷建立外部索引鍵限制條件的許可。您應在被動參考資料表與主動參考資料表上撤銷此許可。

TRUNCATE  
撤銷截斷資料表的許可。如果沒有此許可，只有資料表的擁有者或超級使用者可以截斷資料表。如需 TRUNCATE 命令的相關資訊，請參閱 [TRUNCATE](r_TRUNCATE.md)。

ALL [ PRIVILEGES ]   
從指定的使用者或群組一次撤銷所有可用許可。PRIVILEGES 關鍵字為選用。  
 Amazon Redshift 不支援 RULE 和 TRIGGER 許可。如需詳細資訊，請前往 [不支援的 PostgreSQL 功能](c_unsupported-postgresql-features.md)。

ALTER  
根據資料庫物件而定，將下列許可從使用者或使用者群組中撤銷：  
+ 對於資料表，ALTER 會撤銷修改資料表或檢視的許可。如需詳細資訊，請參閱[ALTER TABLE](r_ALTER_TABLE.md)。
+ 對於資料庫，ALTER 會撤銷修改資料庫的許可。如需詳細資訊，請參閱[ALTER DATABASE](r_ALTER_DATABASE.md)。
+ 對於結構描述，ALTER 會授予修改結構描述的撤銷權。如需詳細資訊，請參閱[ALTER SCHEMA](r_ALTER_SCHEMA.md)。
+ 對於外部資料表，ALTER 會撤銷在針對 Lake Formation 啟用的 AWS Glue Data Catalog 中修改資料表的許可。此許可僅適用於使用 Lake Formation 時。

DROP  
根據資料庫物件而定，撤銷使用者或角色的下列許可：  
+  對於資料表，DROP 會撤銷捨棄資料表或檢視的許可。如需詳細資訊，請參閱[DROP TABLE](r_DROP_TABLE.md)。
+  對於資料庫，DROP 會撤銷捨棄資料庫的許可。如需詳細資訊，請參閱[DROP DATABASE](r_DROP_DATABASE.md)。
+  對於結構描述，DROP 會撤銷捨棄結構描述的許可。如需詳細資訊，請參閱[DROP SCHEMA](r_DROP_SCHEMA.md)。

ASSUMEROLE  <a name="assumerole"></a>
從使用者、角色或具有指定角色的群組中撤銷執行 COPY、UNLOAD、EXTERNAL FUNCTION 或 CREATE MODEL 命令的許可。

ON [ TABLE ] *table\$1name*   
撤銷資料表或檢視的指定許可。TABLE 關鍵字為選用。

ON ALL TABLES IN SCHEMA *schema\$1name*   
撤銷所參考結構描述中所有資料表的指定許可。

( *column\$1name* [,...] ) ON TABLE *table\$1name*   <a name="revoke-column-level-privileges"></a>
將 Amazon Redshift 資料表或檢視中指定資料欄的指定許可從使用者、群組或 PUBLIC 中撤銷。

( *column\$1list* ) ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table-column"></a>
從所參考結構描述中 Lake Formation 資料表之指定欄上的 IAM 角色中撤銷指定許可。

ON EXTERNAL TABLE *schema\$1name.table\$1name*   <a name="revoke-external-table"></a>
從所參考結構描述中 Lake Formation 資料表上的 IAM 角色中撤銷指定許可。

ON EXTERNAL SCHEMA *schema\$1name*   <a name="revoke-external-schema"></a>
從所參考結構描述上的 IAM 角色撤銷指定許可。

FROM IAM\$1ROLE *iam\$1role*   <a name="revoke-from-iam-role"></a>
指出失去許可的 IAM 角色。

ROLE *role\$1name*   
從指定的角色中撤銷許可。

GROUP *group\$1name*   
從指定的使用者群組中撤銷許可。

PUBLIC   
從所有使用者中撤銷指定許可。PUBLIC 代表永遠包含所有使用者的群組。個別使用者的許可是由授予 PUBLIC 的許可、授予使用者所屬之任何群組的許可，以及個別授予使用者的任何許可，三者加總所組成。  
從 Lake Formation 外部資料表撤銷 PUBLIC 會從 Lake Formation *everyone* 群組撤銷該許可。

CREATE   
根據資料庫物件而定，將下列許可從使用者或群組中撤銷：  
+ 若是資料庫，使用 CREATE 子句執行 REVOKE，可阻止使用者在資料庫內建立結構描述。
+ 若是結構描述，使用 CREATE 子句執行 REVOKE，可阻止使用者在結構描述內建立物件。若要重新命名物件，使用者必須具有 CREATE 許可並擁有要重新命名的物件。
根據預設，所有使用者對 PUBLIC 結構描述都具有 CREATE 和 USAGE 許可。

TEMPORARY \$1 TEMP   
撤銷在指定資料庫中建立臨時資料表的許可。  
根據預設，建立臨時資料表的許可是依使用者在 PUBLIC 群組中的自動成員資格授予。若要移除任何使用者建立臨時資料表的許可，請撤銷 PUBLIC 群組的 TEMP 權限，然後明確將建立臨時資料表的權限授予特定使用者或使用者群組。

ON DATABASE *db\$1name*   
撤銷指定資料庫的許可。

USAGE   
撤銷特定結構描述內物件的 USAGE 許可，讓使用者無法存取這些物件。對這些物件的特定動作必須另行撤銷 (例如函數的 EXECUTE 許可)。  
根據預設，所有使用者對 PUBLIC 結構描述都具有 CREATE 和 USAGE 許可。

ON SCHEMA *schema\$1name*   
撤銷指定結構描述的許可。您可以使用結構描述許可控制資料表的建立；資料庫的 CREATE 許可只能控制結構描述的建立。

RESTRICT   
僅撤銷使用者直接授予的許可。這是預設行為。

EXECUTE ON PROCEDURE *procedure\$1name*   
撤銷特定預存程序的 EXECUTE 許可。由於預存程序名稱可以過載，因此您必須包含程序的引數清單。如需詳細資訊，請參閱[命名預存程序](stored-procedure-naming.md)。

EXECUTE ON ALL PROCEDURES IN SCHEMA *procedure\$1name*   
撤銷所參考結構描述中所有程序的指定許可。

USAGE ON LANGUAGE *language\$1name*   
撤銷某種語言的 USAGE 許可。若為 Python 使用者定義函數 (UDF)，請使用 `plpythonu`。若是 SQL UDF，請使用 `sql`。若為預存程序，請使用 `plpgsql`。  
若要建立 UDF，您必須具有 SQL 或 `plpythonu` (Python) 的語言使用權許可。根據預設，USAGE ON LANGUAGE SQL 會授予 PUBLIC。不過，您必須將 USAGE ON LANGUAGE PLPYTHONU 明確授予特定使用者或群組。  
若要撤銷 SQL 的使用權，請先從 PUBLIC 撤銷使用權。然後僅將 SQL 使用權授予獲得許可建立 SQL UDF 的特定使用者或群組。下列範例會撤銷 PUBLIC 的 SQL 使用權，然後將使用權授予使用者群組 `udf_devs`。  

```
revoke usage on language sql from PUBLIC;
grant usage on language sql to group udf_devs;
```
如需詳細資訊，請參閱[UDF 安全與許可](udf-security-and-privileges.md)。  
若要撤銷預存程序的使用權，請先從 PUBLIC 撤銷使用權。然後僅將 `plpgsql` 使用權授予獲得許可建立預存程序的特定使用者或群組。如需詳細資訊，請參閱[預存程序的安全和權限](stored-procedure-security-and-privileges.md)。

ON COPY JOB *job\$1name*  <a name="on-copy-job-revoke"></a>
撤銷複製任務的指定許可。

FOR \$1 ALL \$1 COPY \$1 UNLOAD \$1 EXTERNAL FUNCTION \$1 CREATE MODEL \$1 [, ...]  <a name="revoke-for"></a>
指定要撤銷其權限的 SQL 命令。您可以指定 ALL 來撤銷 COPY、UNLOAD、EXTERNAL FUNCTION 和 CREATE MODEL 陳述式的許可。此子句僅適用於撤銷 ASSUMEROLE 許可。

ALTER  
撤銷使用者或使用者群組的 ALTER 權限，該權限可讓未擁有資料共用的使用者或使用者群組修改資料共用。需要此許可才能在資料共用中新增或移除物件，或設定屬性 PUBLICACCESSIBLE。如需詳細資訊，請參閱[ALTER DATASHARE](r_ALTER_DATASHARE.md)。

SHARE  
撤銷使用者和使用者群組將取用者新增至資料共用的許可。撤銷此許可需要阻止特定取用者從其叢集存取資料共用。

ON DATASHARE *datashare\$1name *  
授予參考資料共用的指定許可。

FROM 使用者名稱  
指出失去許可的使用者。

FROM GROUP *group\$1name*  
指出失去許可的使用者群組。

WITH GRANT OPTION  
指出失去許可的使用者可以接著撤銷其他人的相同許可。您無法撤銷群組或 PUBLIC 的 WITH GRANT OPTION。

USAGE  
對相同帳戶內的取用者帳戶或命名空間撤銷 USAGE 時，帳戶內的特定取用者帳戶或命名空間不可以以唯讀方式存取資料共用和資料共用的物件。  
撤銷 USAGE 許可會撤銷取用者對資料共用的存取權。

FROM NAMESPACE 'clusternamespace GUID'  
指出其中取用者失去資料共用許可的相同帳戶中的命名空間。命名空間會使用 128 位元英數字元的全域唯一識別碼 (GUID)。

FROM ACCOUNT 'accountnumber' [ VIA DATA CATALOG ]  
指出其中取用者失去資料共用許可的其他帳戶中的帳戶編號。指定 ‘VIA DATA CATALOG’ 表示您正在從 Lake Formation 帳戶中撤銷資料共用使用權。省略帳號代表您要從擁有叢集的帳戶撤銷。

ON DATABASE *shared\$1database\$1name> [, ...]*   <a name="revoke-datashare"></a>
在指定資料共用中建立的指定資料庫上撤銷指定使用許可。

ON SCHEMA* shared\$1schema*   <a name="revoke-datashare"></a>
在指定資料共用中建立的指定結構描述上撤銷指定許可。

FOR \$1 SCHEMAS \$1 TABLES \$1 FUNCTIONS \$1 PROCEDURES \$1 LANGUAGES \$1 COPY JOBS\$1 IN   
指定要撤銷權限的資料庫物件。IN 後面的參數定義撤銷權限的範圍。

CREATE MODEL  
撤銷 CREATE MODEL 權限，以便在指定的資料庫中建立機器學習模型。

ON MODEL *model\$1name*  
撤銷特定模型的 EXECUTE 許可。

ACCESS CATALOG  
撤銷權限，以檢視角色可存取之物件的相關中繼資料。

[ ADMIN OPTION FOR ] \$1 role \$1 [, ...]  
您從具有 WITH ADMIN OPTION 的指定使用者撤銷的角色。

FROM \$1 role \$1 [, ...]  
您從中撤銷指定角色的角色。

EXPLAIN \$1 RLS \$1 MASKING \$1 FROM ROLE *rolename*  
撤銷角色解釋 EXPLAIN 計畫中查詢的安全政策篩選的許可。RLS 會撤銷解釋資料列層級安全政策篩選的許可。MASKING 會撤銷解釋動態資料遮罩政策篩選的許可。

IGNORE RLS FROM ROLE *rolename*   
撤銷角色略過查詢的資料列層級安全政策的許可。

FROM \$1 RLS \$1 MASKING \$1 POLICY *policy\$1name*  
指出失去許可的安全政策。TO RLS POLICY 表示資料列層級安全政策。TO MASKING POLICY 表示動態資料遮罩政策。

## 使用須知
<a name="r_REVOKE-usage-notes-link"></a>

若要進一步了解 REVOKE 使用須知，請參閱 [使用須知](r_REVOKE-usage-notes.md)。

## 範例
<a name="r_REVOKE-examples-link"></a>

如需如何使用 REVOKE 的範例，請參閱 [範例](r_REVOKE-examples.md)。

# 使用須知
<a name="r_REVOKE-usage-notes"></a>

若要撤銷物件的權限，您必須符合下列條件之一：
+ 身為物件擁有者。
+ 身為超級使用者。
+ 具有該物件和權限的授予權限。

  例如，以下命令可讓使用者 HR 在 employees 資料表上執行 SELECT 命令，並對其他使用者授予和撤銷相同的權限。

  ```
  grant select on table employees to HR with grant option;
  ```

  HR 無法撤銷 SELECT 以外任何操作的權限，也無法撤銷 employees 資料表以外任何資料表的權限。

無論是使用 GRANT 或 REVOKE 命令設定物件權限，超級使用者都能存取所有物件。

PUBLIC 代表永遠包含所有使用者的群組。根據預設，PUBLIC 的所有成員對 PUBLIC 結構描述都具有 CREATE 和 USAGE 權限。若要限制 PUBLIC 結構描述上任何使用者的許可，您必須先撤銷 PUBLIC 結構描述上 PUBLIC 的所有許可，然後將權限授予特定使用者或群組。下列範例會控制 PUBLIC 結構描述中的資料表建立權限。

```
revoke create on schema public from public;
```

若要撤銷 Lake Formation 資料表的權限，則與該資料表外部結構描述相關聯的 IAM 角色就需具備撤銷外部資料表權限的許可。下列範例所建立的外部結構描述內含相關聯的 `myGrantor` IAM 角色。該 `myGrantor` IAM 角色具備撤銷他人許可的許可。REVOKE 命令會使用與外部結構描述相關聯的 `myGrantor` IAM 角色許可，撤銷 `myGrantee` IAM 角色的許可。

```
create external schema mySchema
from data catalog
database 'spectrum_db'
iam_role 'arn:aws:iam::123456789012:role/myGrantor'
create external database if not exists;
```

```
revoke select
on external table mySchema.mytable
from iam_role 'arn:aws:iam::123456789012:role/myGrantee';
```

**注意**  
如果 IAM 角色在 AWS Glue Data Catalog 已啟用 Lake Formation 的 中也有 `ALL` 許可，則不會撤銷該`ALL`許可。只有 `SELECT` 許可會遭撤銷。您可以在 Lake Formation 控制台中檢視 Lake Formation 許可。

## 撤銷 ASSUMEROL 許可的使用須知
<a name="r_REVOKE-usage-notes-assumerole"></a>

下列是在 Amazon Redshift 中撤銷 ASSUMEROLE 權限的使用須知。

只有資料庫超級使用者才能撤銷使用者和群組的 ASSUMEROLE 權限。超級使用者始終保有 ASSUMEROLE 權限。

若要啟用使用者和群組的 ASSUMEROLE 權限，超級使用者要在叢集上執行一次下列陳述式。對使用者和群組授予 ASSUMEROLE 權限之前，超級使用者必須在叢集上執行一次下列陳述式。

```
revoke assumerole on all from public for all;
```

## 撤銷機器學習許可的使用須知
<a name="r_REVOKE-usage-notes-create-model"></a>

您無法直接授予或撤銷與 ML 函數相關的許可。ML 函數屬於 ML 模型，而且許可是透過模型控制的。相反地，您可以撤銷 ML 模型相關的許可。下列範例會示範如何從與模型 `customer_churn` 相關聯的所有使用者中撤銷執行許可。

```
REVOKE EXECUTE ON MODEL customer_churn FROM PUBLIC;
```

您也可以從 ML 模型 `customer_churn` 的使用者中撤銷所有許可。

```
REVOKE ALL on MODEL customer_churn FROM ml_user;
```

如果結構描述中有 ML 函數，則授予或撤銷 ML 函數相關的 `EXECUTE` 許可將會失敗，即使該 ML 函數已經具有透過 `GRANT EXECUTE ON MODEL` 取得的 `EXECUTE` 許可也是一樣。我們建議您在使用 `CREATE MODEL` 命令時，使用個別的結構描述，將 ML 函數本身保留在不同的結構描述中。下列範例示範如何執行此動作。

```
CREATE MODEL ml_schema.customer_churn
FROM customer_data
TARGET churn
FUNCTION ml_schema.customer_churn_prediction
IAM_ROLE default
SETTINGS (
 S3_BUCKET 'amzn-s3-demo-bucket'
);
```

# 範例
<a name="r_REVOKE-examples"></a>

以下範例會將 GUESTS 使用者群組在 SALES 資料表上的 INSERT 權限撤銷。此命令會使 GUESTS 的成員無法使用 INSERT 命令將資料載入 SALES 資料表。

```
revoke insert on table sales from group guests;
```

以下範例會將使用者 `fred` 對 QA\$1TICKIT 結構描述中所有資料表的 SELECT 權限撤銷。

```
revoke select on all tables in schema qa_tickit from fred;
```

下列範例會撤銷使用者 `bobr` 從檢視選取的權限。

```
revoke select on table eventview from bobr;
```

以下範例會將所有使用者在 TICKIT 資料庫中建立暫存資料表的權限撤銷。

```
revoke temporary on database tickit from public;
```

下列範例會撤銷使用者 `user1` 對 `cust_profile` 資料表中 `cust_name` 和 `cust_phone` 資料欄的 SELECT 權限。

```
revoke select(cust_name, cust_phone) on cust_profile from user1;
```

下列範例會撤銷 `sales_group` 群組對 `cust_name` 和 `cust_phone` 資料欄的 SELECT 權限，以及對 `cust_profile` 資料表中 `cust_contact_preference` 資料欄的 UPDATE 權限。

```
revoke select(cust_name, cust_phone), update(cust_contact_preference) on cust_profile from group sales_group;
```

下列範例顯示 ALL 關鍵字的使用方式，以撤銷 `sales_admin` 群組對資料表 `cust_profile` 中三個資料欄的 SELECT 和 UPDATE 權限。

```
revoke ALL(cust_name, cust_phone,cust_contact_preference) on cust_profile from group sales_admin;
```

以下範例會撤銷 `user2` 使用者對 `cust_profile_vw` 檢視中 `cust_name` 資料欄的 SELECT 權限。

```
revoke select(cust_name) on cust_profile_vw from user2;
```

## 從資料共用建立的資料庫撤銷 USAGE 權限的範例
<a name="r_REVOKE-examples-datashare"></a>

下列範例會從 `13b8833d-17c6-4f16-8fe4-1a018f5ed00d` 命名空間撤銷對 `salesshare` 資料共用的存取權。

```
REVOKE USAGE ON DATASHARE salesshare FROM NAMESPACE '13b8833d-17c6-4f16-8fe4-1a018f5ed00d';
```

下列範例會撤銷 `sales_db` 上來自 `Bob` 的 USAGE 權限。

```
REVOKE USAGE ON DATABASE sales_db FROM Bob;
```

下列範例會撤銷 `sales_schema` 上來自 `Analyst_role` 的 USAGE 權限。

```
REVOKE USAGE ON SCHEMA sales_schema FROM ROLE Analyst_role;
```

## 撤銷限定範圍權限的範例
<a name="r_REVOKE-examples-scoped"></a>

下列範例會將 `Sales_db` 資料庫中所有目前和未來結構描述的使用權從 `Sales` 角色撤銷。

```
REVOKE USAGE FOR SCHEMAS IN DATABASE Sales_db FROM ROLE Sales;
```

以下範例撤銷向使用者 `alice` 授予對 `Sales_db` 資料庫中所有目前和未來資料表的 SELECT 權限的能力。`alice` 保留對 `Sales_db` 中所有資料表的存取權。

```
REVOKE GRANT OPTION SELECT FOR TABLES IN DATABASE Sales_db FROM alice;
```

下列範例會將 `Sales_schema` 結構描述中函數的 EXECUTE 權限從 `bob` 角色撤銷。

```
REVOKE EXECUTE FOR FUNCTIONS IN SCHEMA Sales_schema FROM bob;
```

下列範例會從 `Sales` 角色撤銷 `ShareDb` 資料庫之 `ShareSchema` 結構描述中所有資料表的所有權限。當指定結構描述時，您也可以使用兩部分格式 `database.schema` 指定結構描述的資料庫。

```
REVOKE ALL FOR TABLES IN SCHEMA ShareDb.ShareSchema FROM ROLE Sales;
```

以下範例與前面的範例是相同的。您可以使用 `DATABASE` 關鍵字來指定結構描述資料庫，而不是使用兩部分格式。

```
REVOKE ALL FOR TABLES IN SCHEMA ShareSchema DATABASE ShareDb FROM ROLE Sales;
```

## 撤銷 ASSUMEROLE 權限的範例
<a name="r_REVOKE-examples-assumerole"></a>

以下是撤銷 ASSUMEROLE 權限的範例 

超級使用者必須在叢集上執行一次下列陳述式，以啟用使用者和群組的 ASSUMEROLE 權限。

```
revoke assumerole on all from public for all;
```

下列陳述式會在所有操作的所有角色上撤銷使用者 reg\$1user1 的 ASSUMEROLE 權限。

```
revoke assumerole on all from reg_user1 for all;
```

## 撤銷 ROLE 權限的範例
<a name="r_REVOKE-examples-role"></a>

下列範例會對 sample\$1role2 撤銷 sample\$1role1。

```
CREATE ROLE sample_role2;
GRANT ROLE sample_role1 TO ROLE sample_role2;
REVOKE ROLE sample_role1 FROM ROLE sample_role2;
```

下列範例會撤銷 user1 的系統權限。

```
GRANT ROLE sys:DBA TO user1;
REVOKE ROLE sys:DBA FROM user1;
```

下列範例會從 user1 撤銷 sample\$1role1 和 sample\$1role2。

```
CREATE ROLE sample_role1;
CREATE ROLE sample_role2;
GRANT ROLE sample_role1, ROLE sample_role2 TO user1;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM user1;
```

下列範例會從 user1 撤銷具有 ADMIN OPTION 的 sample\$1role2。

```
GRANT ROLE sample_role2 TO user1 WITH ADMIN OPTION;
REVOKE ADMIN OPTION FOR ROLE sample_role2 FROM user1;
REVOKE ROLE sample_role2 FROM user1;
```

下列範例會從 sample\$1role5 撤銷 sample\$1role1 和 sample\$1role2。

```
CREATE ROLE sample_role5;
GRANT ROLE sample_role1, ROLE sample_role2 TO ROLE sample_role5;
REVOKE ROLE sample_role1, ROLE sample_role2 FROM ROLE sample_role5;
```

下列範例會撤銷 Sample\$1role1 的 CREATE SCHEMA 和 DROP SCHEMA 系統權限。

```
GRANT CREATE SCHEMA, DROP SCHEMA TO ROLE sample_role1;
REVOKE CREATE SCHEMA, DROP SCHEMA FROM ROLE sample_role1;
```

# ROLLBACK
<a name="r_ROLLBACK"></a>

停止目前交易，並捨棄該交易所做的所有更新。

此命令會執行與 [ABORT](r_ABORT.md) 命令相同的功能。

## 語法
<a name="r_ROLLBACK-synopsis"></a>

```
ROLLBACK [ WORK | TRANSACTION ]
```

## Parameters
<a name="r_ROLLBACK-parameters"></a>

WORK  
選用的關鍵字。預存程序內不支援使用此關鍵字。

TRANSACTION  
選用的關鍵字。WORK 和 TRANSACTION 為同義詞，預存程序內不支援使用這兩個關鍵字。

如需在預存程序內使用 ROLLBACK 的相關資訊，請參閱[管理交易](stored-procedure-transaction-management.md)。

## 範例
<a name="r_ROLLBACK-example"></a>

下列範例會建立資料表，然後開始交易，將資料插入資料表中。接著 ROLLBACK 命令就會轉返資料插入操作，而使資料表變成空白。

以下命令會建立名為 MOVIE\$1GROSS 的範例資料表：

```
create table movie_gross( name varchar(30), gross bigint );
```

下一個命令集會開始交易，將兩個資料列插入資料表中：

```
begin;

insert into movie_gross values ( 'Raiders of the Lost Ark', 23400000);

insert into movie_gross values ( 'Star Wars', 10000000 );
```

接著，以下命令會從資料表中選取資料，表示該資料已成功插入：

```
select * from movie_gross;
```

命令輸出會顯示這兩個資料列都已成功插入：

```
name           |  gross
-------------------------+----------
Raiders of the Lost Ark | 23400000
Star Wars               | 10000000
(2 rows)
```

現在這個命令會將資料變更轉返為交易開始時的狀態：

```
rollback;
```

從資料表選取資料現在會顯示空白資料表：

```
select * from movie_gross;

name | gross
------+-------
(0 rows)
```

# SELECT
<a name="r_SELECT_synopsis"></a>

從資料表、檢視及使用者定義的函數中刪除資料列。

**注意**  
單一 SQL 陳述式的大小上限為 16 MB。

## 語法
<a name="r_SELECT_synopsis-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

**Topics**
+ [語法](#r_SELECT_synopsis-synopsis)
+ [WITH 子句](r_WITH_clause.md)
+ [SELECT 清單](r_SELECT_list.md)
+ [EXCLUDE column\$1list](r_EXCLUDE_list.md)
+ [FROM 子句](r_FROM_clause30.md)
+ [WHERE 子句](r_WHERE_clause.md)
+ [GROUP BY 子句](r_GROUP_BY_clause.md)
+ [HAVING 子句](r_HAVING_clause.md)
+ [QUALIFY 子句](r_QUALIFY_clause.md)
+ [UNION、INTERSECT 和 EXCEPT](r_UNION.md)
+ [ORDER BY 子句](r_ORDER_BY_clause.md)
+ [CONNECT BY 子句](r_CONNECT_BY_clause.md)
+ [子查詢範例](r_Subquery_examples.md)
+ [相互關聯子查詢](r_correlated_subqueries.md)

# WITH 子句
<a name="r_WITH_clause"></a>

WITH 子句是選用的子句，位於查詢中的 SELECT 前面。WITH 子句會定義一個或多個 *common\$1table\$1expressions*。每個通用資料表運算式 (CTE) 都會定義一個暫存資料表，與檢視定義類似。您可以在 FROM 子句中參考這些暫存資料表。這些資料表僅會在其所屬的查詢執行時使用。WITH 子句中的每個 CTE 都會指定資料表名稱、選用的資料欄名稱清單，以及判斷值為資料表的查詢表達式 (SELECT 陳述式)。當您在定義暫存資料表的相同查詢運算式的 FROM 子句中參考暫存資料表名稱時，CTE 是遞迴的。

WITH 子句子查詢是定義資料表時較有效率的方式，可在執行單一查詢的過程中使用。在所有任何情況下，於 SELECT 陳述式的本體中使用子查詢都可產生相同的結果，但 WITH 子句子查詢對於寫入和讀取來說可能較為簡單。參考多次的 WITH 子句子查詢會盡可能最佳化為通用子表達式；也就是說，或許可以評估 WITH 子查詢一次並重複使用其結果 (請注意，通用子表達式不限於 WITH 子句中所定義者)。

## 語法
<a name="r_WITH_clause-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
```

其中 *common\$1table\$1expression* 可以是非遞迴或遞迴的。以下是非遞迴形式：

```
CTE_table_name [ ( column_name [, ...] ) ] AS ( query )
```

以下是 *common\$1table\$1expression* 的遞迴形式：

```
CTE_table_name (column_name [, ...] ) AS ( recursive_query )
```

## Parameters
<a name="r_WITH_clause-parameters"></a>

 RECURSIVE   
將查詢識別為遞迴 CTE 的關鍵字。如果 WITH 子句中定義的 *common\$1table\$1expression* 是遞迴的，則需要此關鍵字。即使 WITH 子句包含多個遞迴 CTE，您也只能指定一次 RECURSIVE 關鍵字 (緊接在 WITH 關鍵字之後)。一般而言，遞迴 CTE 是具有兩個部分的 UNION ALL 子查詢。

 *common\$1table\$1expression*   
定義可在 [FROM 子句](r_FROM_clause30.md) 中參照的暫存資料表，且僅在執行該資料表所屬的查詢期間使用此暫存資料表。

 *CTE\$1table\$1name*   
此臨時資料表的唯一名稱會定義 WITH 子句子查詢的結果。您無法在單一 WITH 子句內使用重複的名稱。每個子查詢都必須有可在 [FROM 子句](r_FROM_clause30.md) 中參考的資料表名稱。

 *column\$1name*   
 WITH 子句子查詢的輸出資料欄名稱清單，以逗號分隔。指定的資料欄名稱數目必須等於或少於子查詢所定義的資料欄數目。對於非遞迴的 CTE 而言，*column\$1name* 子句是選擇性的。對於遞迴 CTE，*column\$1name* 清單是必要的。

 *query*   
 Amazon Redshift 支援的任何 SELECT 查詢。請參閱 [SELECT](r_SELECT_synopsis.md)。

 *recursive\$1query*   
由兩個 SELECT 子查詢組成的 UNION ALL 查詢：  
+ 第一個 SELECT 子查詢沒有對相同 *CTE\$1table\$1name* 的遞迴參考。這會傳回一個結果集，也就是遞迴的初始種子。此部分稱為初始成員或種子成員。
+ 第二個 SELECT 子查詢會在其 FROM 子句中參考相同的 *CTE\$1table\$1name*。這就是所謂的遞迴成員。*recursive\$1query* 包含一個 WHERE 條件來結束 *recursive\$1query*。

## 使用須知
<a name="r_WITH_clause-usage-notes"></a>

您可以在下列 SQL 陳述式中使用 WITH 子句：
+ SELECT 
+ SELECT INTO
+ CREATE TABLE AS
+ CREATE VIEW
+ DECLARE
+ EXPLAIN
+ INSERT INTO...SELECT 
+ PREPARE
+ 更UPDATE (在 WHERE 子句子查詢中。您無法在子查詢中定義遞迴 CTE。遞迴 CTE 必須位於 UPDATE 子句之前。)
+ DELETE

如果查詢的 FROM 子句包含 WITH 子句，但未參考 WITH 子句定義的任何資料表，則會忽略 WITH 子句，而查詢會照常執行。

WITH 子句子查詢定義的資料表只能在 WITH 子句開始的 SELECT 查詢範圍內參考。例如，您可以在 SELECT 清單、WHERE 子句或 HAVING 子句中，子查詢的 FROM 子句內參考這類資料表。您無法在子查詢中使用 WITH 子句，並於主查詢或其他子查詢的 FROM 子句內參考其資料表。此查詢模式會針對 WITH 子句資料表產生 `relation table_name doesn't exist` 形式的錯誤訊息。

您無法在 WITH 子句子查詢內指定另一個 WITH 子句。

您無法對 WITH 子句子查詢定義的資料表進行向前參考。例如，以下查詢會傳回錯誤訊息，因為資料表 W1 的定義中有對資料表 W2 的向前參考：

```
with w1 as (select * from w2), w2 as (select * from w1)
select * from sales;
ERROR:  relation "w2" does not exist
```

WITH 子句子查詢不一定包含 SELECT INTO 陳述式；不過您可以在 SELECT INTO 陳述式中使用 WITH 子句。

## 遞迴一般資料表表達式
<a name="r_WITH_clause-recursive-cte"></a>

遞迴 *common table expression (CTE)* 是參考其本身的 CTE。遞迴 CTE 在查詢階層式資料時非常有用，例如顯示員工與管理者之間責任關係的組織圖。請參閱 [範例：遞迴 CTE](#r_WITH_clause-recursive-cte-example)。

另一個常見的用途是多層級材料表，像是產品由許多元件組成，而每個元件本身也包含其他元件或次要組件時。

請務必在遞迴查詢的第二個 SELECT 子查詢中加入 WHERE 子句，以限制遞迴的深度。如需範例，請參閱 [範例：遞迴 CTE](#r_WITH_clause-recursive-cte-example)。否則，會發生類似以下內容的錯誤：
+ `Recursive CTE out of working buffers.`
+ `Exceeded recursive CTE max rows limit, please add correct CTE termination predicates or change the max_recursion_rows parameter.`

**注意**  
`max_recursion_rows` 是一個參數，可設定遞迴 CTE 可傳回的最大資料列數，以防止無限遞迴迴圈。我們建議您不要將此值變更為大於預設值的值。這樣可以防止查詢中的無限遞迴佔用叢集中過多空間的問題。

 您可以指定遞迴 CTE 結果的排序順序和限制。您可以在遞迴 CTE 的最終結果中包含群組依據和相異選項。

您無法在子查詢內指定 WITH RECURSIVE 子句。*recursive\$1query* 成員不能包含排序依據或限制子句。

## 範例
<a name="r_WITH_clause-examples"></a>

下列範例顯示包含 WITH 子句的最簡單查詢案例。名為 VENUECOPY 的 WITH 查詢會從 VENUE 資料表選取所有資料列。主查詢會接著從 VENUECOPY 選取所有資料列。VENUECOPY 資料表僅在此查詢期間存在。

```
with venuecopy as (select * from venue)
select * from venuecopy order by 1 limit 10;
```

```
 venueid |         venuename          |    venuecity    | venuestate | venueseats
---------+----------------------------+-----------------+------------+------------
1 | Toyota Park                | Bridgeview      | IL         |          0
2 | Columbus Crew Stadium      | Columbus        | OH         |          0
3 | RFK Stadium                | Washington      | DC         |          0
4 | CommunityAmerica Ballpark  | Kansas City     | KS         |          0
5 | Gillette Stadium           | Foxborough      | MA         |      68756
6 | New York Giants Stadium    | East Rutherford | NJ         |      80242
7 | BMO Field                  | Toronto         | ON         |          0
8 | The Home Depot Center      | Carson          | CA         |          0
9 | Dick's Sporting Goods Park | Commerce City   | CO         |          0
v     10 | Pizza Hut Park             | Frisco          | TX         |          0
(10 rows)
```

下列範例顯示 WITH 子句，它會產生兩個資料表，分別名為 VENUE\$1SALES 和 TOP\$1VENUES。第二個 WITH 查詢資料表會從第一個資料表選取。接著主查詢區塊的 WHERE 子句會包含限制 TOP\$1VENUES 資料表的子查詢。

```
with venue_sales as
(select venuename, venuecity, sum(pricepaid) as venuename_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
group by venuename, venuecity),

top_venues as
(select venuename
from venue_sales
where venuename_sales > 800000)

select venuename, venuecity, venuestate,
sum(qtysold) as venue_qty,
sum(pricepaid) as venue_sales
from sales, venue, event
where venue.venueid=event.venueid and event.eventid=sales.eventid
and venuename in(select venuename from top_venues)
group by venuename, venuecity, venuestate
order by venuename;
```

```
        venuename       |   venuecity   | venuestate | venue_qty | venue_sales
------------------------+---------------+------------+-----------+-------------
August Wilson Theatre   | New York City | NY         |      3187 |  1032156.00
Biltmore Theatre        | New York City | NY         |      2629 |   828981.00
Charles Playhouse       | Boston        | MA         |      2502 |   857031.00
Ethel Barrymore Theatre | New York City | NY         |      2828 |   891172.00
Eugene O'Neill Theatre  | New York City | NY         |      2488 |   828950.00
Greek Theatre           | Los Angeles   | CA         |      2445 |   838918.00
Helen Hayes Theatre     | New York City | NY         |      2948 |   978765.00
Hilton Theatre          | New York City | NY         |      2999 |   885686.00
Imperial Theatre        | New York City | NY         |      2702 |   877993.00
Lunt-Fontanne Theatre   | New York City | NY         |      3326 |  1115182.00
Majestic Theatre        | New York City | NY         |      2549 |   894275.00
Nederlander Theatre     | New York City | NY         |      2934 |   936312.00
Pasadena Playhouse      | Pasadena      | CA         |      2739 |   820435.00
Winter Garden Theatre   | New York City | NY         |      2838 |   939257.00
(14 rows)
```

以下兩個範例將示範根據 WITH 子句子查詢的資料表參考範圍規則。第一個查詢會執行，但第二個會失敗，並產生預期的錯誤。第一個查詢會在主查詢的 SELECT 清單內包含 WITH 子句子查詢。WITH 子句定義的資料表 (HOLIDAYS) 會在 SELECT 清單中子查詢的 FROM 子句中參考：

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join date on sales.dateid=date.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

caldate   | daysales | dec25sales
-----------+----------+------------
2008-12-25 | 70402.00 |   70402.00
2008-12-31 | 12678.00 |   70402.00
(2 rows)
```

第二個查詢會失敗，因為它會嘗試參考主查詢以及 SELECT 清單子查詢中的 HOLIDAYS 資料表。而主查詢參考超出範圍。

```
select caldate, sum(pricepaid) as daysales,
(with holidays as (select * from date where holiday ='t')
select sum(pricepaid)
from sales join holidays on sales.dateid=holidays.dateid
where caldate='2008-12-25') as dec25sales
from sales join holidays on sales.dateid=holidays.dateid
where caldate in('2008-12-25','2008-12-31')
group by caldate
order by caldate;

ERROR:  relation "holidays" does not exist
```

## 範例：遞迴 CTE
<a name="r_WITH_clause-recursive-cte-example"></a>

以下是遞迴 CTE 的範例，此範例會傳回直接或間接向 John 報告的員工。遞迴查詢包含 WHERE 子句，可將遞迴深度限制為少於 4 個層級。

```
--create and populate the sample table
  create table employee (
  id int,
  name varchar (20),
  manager_id int
  );
  
  insert into employee(id, name, manager_id)  values
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
  
--run the recursive query
  with recursive john_org(id, name, manager_id, level) as
( select id, name, manager_id, 1 as level
  from employee
  where name = 'John'
  union all
  select e.id, e.name, e.manager_id, level + 1 as next_level
  from employee e, john_org j
  where e.manager_id = j.id and level < 4
  )
 select distinct id, name, manager_id from john_org order by manager_id;
```

以下為查詢結果。

```
    id        name      manager_id
  ------+-----------+--------------
   101    John           100
   102    Jorge          101
   103    Kwaku          101
   110    Liu            101
   201    Sofía          102
   106    Mateo          102
   110    Nikki          103
   104    Paulo          103
   105    Richard        103
   120    Saanvi         104
   200    Shirley        104
   205    Zhang          104
```

以下是 John 的部門組織結構圖。

![\[John 的部門組織結構圖。\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/images/org-chart.png)


# SELECT 清單
<a name="r_SELECT_list"></a>

**Topics**
+ [語法](#r_SELECT_list-synopsis)
+ [Parameters](#r_SELECT_list-parameters)
+ [使用須知](#r_SELECT_list_usage_notes)
+ [範例](#r_SELECT_list-examples)

SELECT 清單會指出您要查詢傳回的資料欄、函數及表達式的名稱。清單查詢的輸出。

如需 SQL 函數的相關資訊，請參閱 [SQL 函數參考](c_SQL_functions.md)。如需運算式的相關資訊，請參閱[條件式運算式](c_conditional_expressions.md)。

## 語法
<a name="r_SELECT_list-synopsis"></a>

```
SELECT
[ TOP number ]
[ ALL | DISTINCT ] * | expression [ AS column_alias ] [, ...]
```

## Parameters
<a name="r_SELECT_list-parameters"></a>

TOP *number*   
TOP 會採用正整數做為其引數，此引數定義傳回至用戶端的資料列數。TOP 子句的行為與 LIMIT 子句的行為相同。傳回的資料列數是固定的，但資料列集卻不是。若要傳回一致的資料列集，請搭配 ORDER BY 子句使用 TOP 或 LIMIT。

ALL   
您未指定 DISTINCT 時，用來定義預設行為的備援關鍵字。`SELECT ALL *` 的意義與 `SELECT *` 相同 (選取所有資料欄的所有資料列並保留重複項目)。

DISTINCT   
此選項會根據一個或多個資料欄中相符的值，從結果集中消除重複的資料列。  
如果您的應用程式允許無效的外部索引鍵或主索引鍵，則可能造成查詢傳回不正確的結果。例如，如果主索引鍵欄並非包含全部是唯一的值，則 SELECT DISTINCT 查詢可能傳回重複的列。如需詳細資訊，請參閱[定義資料表限制條件](https://docs.aws.amazon.com/redshift/latest/dg/t_Defining_constraints.html)。

\$1 (星號)   
傳回資料表的整個內容 (所有資料欄和所有資料列)。

 *表達式*   
表達式是由查詢所參考資料表中的一個或多個資料欄構成。表達式可包含 SQL 函數。例如：  

```
avg(datediff(day, listtime, saletime))
```

AS *column\$1alias*   
資料欄的暫時名稱，會在最終結果集中使用。AS 關鍵字為選用。例如：  

```
avg(datediff(day, listtime, saletime)) as avgwait
```
若您沒有為表達式指定非簡單資料欄名稱的別名，結果集將會套用預設名稱至該資料欄。  
別名在目標清單中定義之後立即直接辨識。您可以在相同目標清單中後續定義的其他表達式後面使用別名。下列的範例示範了這一點。  

```
select clicks / impressions as probability, round(100 * probability, 1) as percentage from raw_data;
```
側邊別名參考的好處在於，您在相同目標清單中建構更複雜的表達式時，不需要重複有別名的表達式。當 Amazon Redshift 剖析此類型參考時，會直接內嵌先前定義的別名。若 `FROM` 子句中定義了與先前具有別名之表達式同名的資料欄，則 `FROM` 子句中的資料欄優先順序較高。例如，在上方查詢中，若 raw\$1data 資料表中有名為 'probability' 的資料欄，目標清單中第二個表達式內的 'probability' 會參考該資料欄，而不是 'probability' 這個別名。

## 使用須知
<a name="r_SELECT_list_usage_notes"></a>

TOP 是 SQL 延伸模組；它提供了 LIMIT 行為的替代方式。您無法在相同查詢中同時使用 TOP 和 LIMIT。

## 範例
<a name="r_SELECT_list-examples"></a>

下列範例會從 SALES 資料表中傳回 10 個資料列。雖然查詢使用 TOP 子句，但仍然會傳回無法預測的資料列集，因為沒有指定 ORDER BY 子句。

```
select top 10 *
from sales;
```

下列查詢具同等功能，但使用 LIMIT 子句而非 TOP 子句：

```
select *
from sales
limit 10;
```

下列範例會使用 TOP 子句從 SALES 資料表傳回前 10 列，並依 QTYSOLD 資料欄遞減排序。

```
select top 10 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
8 |      574
8 |      718
8 |      868
8 |     2663
8 |     3396
8 |     3726
8 |     5250
8 |     6216
(10 rows)
```

下列範例會從 SALES 資料表傳回前兩個 QTYSOLD 和 SELLERID 值，並依 QTYSOLD 資料欄排序：

```
select top 2 qtysold, sellerid
from sales
order by qtysold desc, sellerid;

qtysold | sellerid
--------+----------
8 |      518
8 |      520
(2 rows)
```

下列範例顯示 CATEGORY 資料表中不同類別群組的清單：

```
select distinct catgroup from category
order by 1;

catgroup
----------
Concerts
Shows
Sports
(3 rows)

--the same query, run without distinct
select catgroup from category
order by 1;

catgroup
----------
Concerts
Concerts
Concerts
Shows
Shows
Shows
Sports
Sports
Sports
Sports
Sports
(11 rows)
```

下列範例會傳回 2008 年 12 月的不同週數組。如果沒有 DISTINCT 子句，陳述式會傳回 31 個資料列，或是針對每月的每一天傳回 1 列。

```
select distinct week, month, year
from date
where month='DEC' and year=2008
order by 1, 2, 3;

week | month | year
-----+-------+------
49 | DEC   | 2008
50 | DEC   | 2008
51 | DEC   | 2008
52 | DEC   | 2008
53 | DEC   | 2008
(5 rows)
```



# EXCLUDE column\$1list
<a name="r_EXCLUDE_list"></a>

EXCLUDE column\$1list 會為從查詢結果中排除的欄命名。在只需從*很寬* (也就是包含許多欄的資料表) 的資料表中排除一小部分欄時，使用 EXCLUDE 選項會很有幫助。

**Topics**
+ [語法](#r_EXCLUDE_list-synopsis)
+ [Parameters](#r_EXCLUDE_list-parameters)
+ [範例](#r_EXCLUDE_list-examples)

## 語法
<a name="r_EXCLUDE_list-synopsis"></a>

```
EXCLUDE column_list
```

## Parameters
<a name="r_EXCLUDE_list-parameters"></a>

 *column\$1list*   
逗號分隔的一或多個欄名稱清單，在資料表中供查詢參考。*column\$1list* 可以選擇性地在前後加上括號。在排除欄名稱清單中僅支援欄名稱，不支援表達式 (例如 `upper(col1)`) 或星號 (\$1)。  

```
column-name, ... | ( column-name, ... )
```
例如：  

```
SELECT * EXCLUDE col1, col2 FROM tablea;
```

```
SELECT * EXCLUDE (col1, col2) FROM tablea;
```

## 範例
<a name="r_EXCLUDE_list-examples"></a>

下列範例使用的 SALES 資料表包含以下各欄：salesid、listid、sellerid、buyerid、eventid、dateid、qtysold、pricepaid、commission 和 saletime。如需 SALES 資料表的詳細資訊，請參閱 [範本資料庫](c_sampledb.md)。

下列範例會從 SALES 資料表中傳回列，但會排除 SALETIME 欄。

```
SELECT * EXCLUDE saletime FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

下列範例會從 SALES 資料表中傳回列，但會排除 QTYSOLD 和 SALETIME 欄。

```
SELECT * EXCLUDE (qtysold, saletime) FROM sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 482        |  72.3	
...
```

下列範例會建立一個檢視，以從 SALES 資料表中傳回列，但會排除 SALETIME 欄。

```
CREATE VIEW sales_view AS SELECT * EXCLUDE saletime FROM sales;
SELECT * FROM sales_view;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

下列範例只會選取未排除的欄並放入暫存資料表中。

```
SELECT * EXCLUDE saletime INTO TEMP temp_sales FROM sales;
SELECT * FROM temp_sales;

salesid | listid  | sellerid | buyerid | eventid | dateid  | qtysold  | pricepaid  | commission
--------+---------+----------+---------+---------+---------+----------+------------+-----------
150314  | 173969  | 48680    | 816     | 8762    | 1827    | 2        | 688        | 103.2	
8325    | 8942    | 23600    | 1078    | 2557    | 1828    | 5        | 525        |  78.75	
46807   | 52711   | 34388    | 1047    | 2046    | 1828    | 2        | 482        |  72.3	
...
```

# FROM 子句
<a name="r_FROM_clause30"></a>

查詢中的 FROM 子句列出資料表參考 (資料表、檢視和子查詢)，此為選取資料的來源位置。若列出多個資料表參考，則必須在 FROM 子句或 WHERE 子句中使用適當的語法聯結資料表。若未指定聯結條件，則系統會將查詢當做交叉聯結 (笛卡兒乘積) 處理。

**Topics**
+ [語法](#r_FROM_clause30-synopsis)
+ [Parameters](#r_FROM_clause30-parameters)
+ [使用須知](#r_FROM_clause_usage_notes)
+ [PIVOT 和 UNPIVOT 範例](r_FROM_clause-pivot-unpivot-examples.md)
+ [JOIN 範例](r_Join_examples.md)
+ [UNNEST 範例](r_FROM_clause-unnest-examples.md)

## 語法
<a name="r_FROM_clause30-synopsis"></a>

```
FROM table_reference [, ...]
```

其中 *table\$1reference* 是下列其中一項：

```
with_subquery_table_name [ table_alias ]
table_name [ * ] [ table_alias ]
( subquery ) [ table_alias ]
table_reference [ NATURAL ] join_type table_reference
   [ ON join_condition | USING ( join_column [, ...] ) ]
table_reference  join_type super_expression 
   [ ON join_condition ]
table_reference PIVOT ( 
   aggregate(expr) [ [ AS ] aggregate_alias ]
   FOR column_name IN ( expression [ AS ] in_alias [, ...] )
) [ table_alias ]
table_reference UNPIVOT [ INCLUDE NULLS | EXCLUDE NULLS ] ( 
   value_column_name 
   FOR name_column_name IN ( column_reference [ [ AS ]
   in_alias ] [, ...] )
) [ table_alias ]
UNPIVOT expression AS value_alias [ AT attribute_alias ]
( super_expression.attribute_name ) AS value_alias [ AT index_alias ]
UNNEST ( column_reference )
  [AS] table_alias ( unnested_column_name )
UNNEST ( column_reference ) WITH OFFSET
  [AS] table_alias ( unnested_column_name, [offset_column_name] )
```

選用的 *table\$1alias* 可用來為資料表和複雜資料表參考提供暫時的名稱，如有需要，也可以提供其欄的名稱，如下所示：

```
[ AS ] alias [ ( column_alias [, ...] ) ]
```

## Parameters
<a name="r_FROM_clause30-parameters"></a>

 *with\$1subquery\$1table\$1name*   
[WITH 子句](r_WITH_clause.md) 中子查詢所定義的資料表。

 *table\$1name*   
資料表或檢視的名稱。

 *alias*   
資料表或檢視的暫時替代名稱。必須為衍生自子查詢的資料表提供別名。在其他資料表參考中，別名是選用的。AS 關鍵字一律為選用。資料表別名提供了方便在查詢的其他部分中識別資料表的捷徑，例如 WHERE 子句。例如：  

```
select * from sales s, listing l
where s.listid=l.listid
```

 *column\$1alias*   
資料表或檢視中資料欄的暫時替代名稱。

 *subquery*   
判斷值為資料表的查詢表達式。資料表只會在查詢期間存在，通常會為其命名或提供*別名*。不過，不需要別名。您也可以為衍生自子查詢的資料表定義資料欄名稱。當您想要將子查詢的結果與其他資料表聯結時，以及您想要在查詢中的其他位置選取或限制這些資料欄時，為資料欄指定別名就很重要。  
子查詢可包含 ORDER BY 子句，但是，若未指定 LIMIT 或 OFFSET 子句，則此子句不一定有作用。

NATURAL   
定義聯結，此聯結會自動使用兩個資料表中所有同名資料欄的配對做為聯結資料欄。不需要明確的聯結條件。例如，若 CATEGORY 和 EVENT 資料表都有名為 CATID 的資料欄，則這兩個資料表的 natural 聯結會是透過其 CATID 資料欄的聯結。  
若已指定 NATURAL 聯結，但是要聯結的資料表中並沒有同名的資料欄配對，則查詢會預設為交叉聯結。

 *join\$1type*   
指定下列其中一種聯結類型：  
+ [INNER] JOIN 
+ LEFT [OUTER] JOIN 
+ RIGHT [OUTER] JOIN 
+ FULL [OUTER] JOIN 
+ CROSS JOIN 
交叉聯結是沒有限定的聯結，會傳回兩個資料表的笛卡兒乘積。  
內部和外部聯結為限定聯結。它們會以隱含方式 (在 natural 聯結中)、在 FROM 子句中使用 ON 或 USING 語法，或使用 WHERE 子句條件限定。  
內部聯結只會根據聯結條件或聯結資料欄清單傳回相符的資料列。外部聯結會傳回對等內部聯結傳回的所有資料列，加上「左側」資料表和/或「右側」資料表的不相符資料列。左側資料表是最先列出的資料表，右側資料表是其次列出的資料表。不相符的資料列包含要填入輸出資料欄中空處的 NULL 值。

ON *join\$1condition*   
聯結規格的類型，其中聯結資料欄會做為條件陳述，後面接著 ON 關鍵字。例如：  

```
sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
```

USING ( *join\$1column* [, ...] )   
聯結規格的類型，其中聯結資料欄會在括號內列出。若指定了多個聯結資料欄，則會以逗號分隔。USING 關鍵字必須放在清單前面。例如：  

```
sales join listing
using (listid,eventid)
```

PIVOT  
將輸出從資料列旋轉為資料欄，以便以易於閱讀的格式表示資料表資料。輸出會橫跨多個資料欄表示。PIVOT 類似於具使用彙總的 GROUP BY 查詢，並且會使用彙總運算式來指定輸出格式。但是，與 GROUP BY 相反，其結果會以資料欄傳回，而不是資料列。  
如需示範如何使用 PIVOT 和 UNPIVOT 進行查詢的範例，請參閱 [PIVOT 和 UNPIVOT 範例](r_FROM_clause-pivot-unpivot-examples.md)。

UNPIVOT  
*使用 UNPIVOT 將欄輪換到列中* - 運算子會將輸入資料表或查詢結果的結果欄轉換為列，讓輸出內容更容易閱讀。UNPIVOT 會將其輸入資料欄的資料合併為兩個結果資料欄：名稱資料欄和值資料欄。名稱資料欄包含來自輸入中做為資料列項目的資料欄名稱。值資料欄包含來自輸入資料欄的值，例如彙總的結果。例如，各種類別中的項目計數。  
*使用 UNPIVOT (SUPER) 取消樞紐的物件* - 您可以執行物件取消樞紐，其中 *expression* 是參考另一個 FROM 子句項目的 SUPER 表達式。如需詳細資訊，請參閱[物件取消樞紐](query-super.md#unpivoting)。另外也有範例示範如何查詢半結構化資料，例如 JSON 格式的資料。

*super\$1expression*  
有效的 SUPER 表達式。Amazon Redshift 會針對指定的屬性中的每個值傳回一列。如需 SUPER 資料類型的詳細資訊，請參閱 [SUPER 類型](r_SUPER_type.md)。如需非巢狀 SUPER 值的詳細資訊，請參閱 [解除巢狀化查詢](query-super.md#unnest)。

*屬性\$1名稱*  
SUPER 表達式中屬性的名稱。

*index\$1alias*  
索引的別名，表示 SUPER 表達式中值的位置。

UNNEST  
展開巢狀結構 (通常是 SUPER 陣列) 成為包含非巢狀元素的欄。如需解除巢狀化 SUPER 資料的詳細資訊，請參閱 [查詢半結構化資料](query-super.md)。如需範例，請參閱 [UNNEST 範例](r_FROM_clause-unnest-examples.md)。

*unnested\$1column\$1name*  
包含非巢狀元素的欄名稱。

UNNEST ... WITH OFFSET  
將位移欄新增至非巢狀輸出，其位移代表陣列中每個元素從零開始的索引。當您想要查看陣列內元素的位置時，此變體會很有用。如需解除巢狀化 SUPER 資料的詳細資訊，請參閱 [查詢半結構化資料](query-super.md)。如需範例，請參閱 [UNNEST 範例](r_FROM_clause-unnest-examples.md)。

*offset\$1column\$1name*  
位移欄的自訂名稱，可讓您明確定義索引欄在輸出中的顯示方式。此為選用參數。根據預設，位移欄名稱為 `offset_col`。

## 使用須知
<a name="r_FROM_clause_usage_notes"></a>

聯結資料欄必須採用可比較的資料類型。

NATURAL 或 USING 聯結只會針對中繼結果集內每個聯結資料欄配對保留一個。

使用 ON 語法的聯結則會保留其中繼結果集內的兩個聯結資料欄。

另請參閱[WITH 子句](r_WITH_clause.md)。

# PIVOT 和 UNPIVOT 範例
<a name="r_FROM_clause-pivot-unpivot-examples"></a>

PIVOT 和 UNPIVOT 是 FROM 子句中的參數，這兩個參數會分別將查詢輸出從資料列旋轉為資料欄，以及將資料欄旋轉為資料列。這會以易於閱讀的格式呈現資料表式查詢結果。下列範例會使用測試資料和查詢來顯示如何使用這些參數。

如需這些參數與其他參數的相關資訊，請參閱 [FROM 子句](https://docs.aws.amazon.com/redshift/latest/dg/r_FROM_clause30.html)。

## PIVOT 範例
<a name="r_FROM_clause-pivot-examples"></a>

設定範例資料表和資料，並用其來執行後續的範例查詢。

```
CREATE TABLE part (
    partname varchar,
    manufacturer varchar,
    quality int,
    price decimal(12, 2)
);

INSERT INTO part VALUES ('prop', 'local parts co', 2, 10.00);
INSERT INTO part VALUES ('prop', 'big parts co', NULL, 9.00);
INSERT INTO part VALUES ('prop', 'small parts co', 1, 12.00);

INSERT INTO part VALUES ('rudder', 'local parts co', 1, 2.50);
INSERT INTO part VALUES ('rudder', 'big parts co', 2, 3.75);
INSERT INTO part VALUES ('rudder', 'small parts co', NULL, 1.90);

INSERT INTO part VALUES ('wing', 'local parts co', NULL, 7.50);
INSERT INTO part VALUES ('wing', 'big parts co', 1, 15.20);
INSERT INTO part VALUES ('wing', 'small parts co', NULL, 11.80);
```

`partname` 上的 PIVOT 搭配 `price` 上的 `AVG` 彙總。

```
SELECT *
FROM (SELECT partname, price FROM part) PIVOT (
    AVG(price) FOR partname IN ('prop', 'rudder', 'wing')
);
```

此查詢結果為下列輸出。

```
  prop   |  rudder  |  wing
---------+----------+---------
 10.33   | 2.71     | 11.50
```

在上一個範例中，結果會轉換為資料欄。下列範例會顯示以資料列 (不是資料欄) 傳回平均價格的 `GROUP BY` 查詢。

```
SELECT partname, avg(price)
FROM (SELECT partname, price FROM part)
WHERE partname IN ('prop', 'rudder', 'wing')
GROUP BY partname;
```

此查詢結果為下列輸出。

```
 partname |  avg
----------+-------
 prop     | 10.33
 rudder   |  2.71
 wing     | 11.50
```

以 `manufacturer` 作為隱含資料欄的 `PIVOT` 範例。

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) FOR quality IN (1, 2, NULL)
);
```

此查詢結果為下列輸出。

```
 manufacturer      | 1  | 2  | null
-------------------+----+----+------
 local parts co    | 1  | 1  |  1
 big parts co      | 1  | 1  |  1
 small parts co    | 1  | 0  |  2
```

 未在 `PIVOT` 定義中參考的輸入資料表資料欄會隱含地新增至結果資料表。上一個範例中的 `manufacturer` 資料欄就是這種情況。此範例也會顯示 `NULL` 是 `IN` 運算子的有效值。

`PIVOT` 在上述範例中會傳回類似下列查詢的資訊，其中包括 `GROUP BY`。不同之處在於 `PIVOT` 傳回資料欄 `2` 的值 `0` 和製造商 `small parts co`。`GROUP BY` 查詢不包含對應的資料列。在大多數情況下，如果資料列沒有給定資料欄的輸入資料，`PIVOT` 會插入 `NULL`。但是，計數彙總不會傳回 `NULL`，`0` 是預設值。

```
SELECT manufacturer, quality, count(*)
FROM (SELECT quality, manufacturer FROM part)
WHERE quality IN (1, 2) OR quality IS NULL
GROUP BY manufacturer, quality
ORDER BY manufacturer;
```

此查詢結果為下列輸出。

```
 manufacturer        | quality | count
---------------------+---------+-------
 big parts co        |         |     1
 big parts co        |       2 |     1
 big parts co        |       1 |     1
 local parts co      |       2 |     1
 local parts co      |       1 |     1
 local parts co      |         |     1
 small parts co      |       1 |     1
 small parts co      |         |     2
```

 PIVOT 運算子會接受彙總運算式上及 `IN` 運算子每個值上的選用別名。使用別名來自訂資料欄名稱。如果沒有彙總別名，則只會使用 `IN` 清單別名。否則，彙總別名會附加至資料欄名稱，並加上底線來分隔名稱。

```
SELECT *
FROM (SELECT quality, manufacturer FROM part) PIVOT (
    count(*) AS count FOR quality IN (1 AS high, 2 AS low, NULL AS na)
);
```

此查詢結果為下列輸出。

```
 manufacturer      | high_count  | low_count | na_count
-------------------+-------------+-----------+----------
 local parts co    |           1 |         1 |        1
 big parts co      |           1 |         1 |        1
 small parts co    |           1 |         0 |        2
```

設定下列範例資料表和資料，並用其來執行後續的範例查詢。資料表示飯店集合的預訂日期。

```
CREATE TABLE bookings (
    booking_id int,
    hotel_code char(8),
    booking_date date,
    price decimal(12, 2)
);

INSERT INTO bookings VALUES (1, 'FOREST_L', '02/01/2023', 75.12);
INSERT INTO bookings VALUES (2, 'FOREST_L', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (3, 'FOREST_L', '02/04/2023', 85.54);

INSERT INTO bookings VALUES (4, 'FOREST_L', '02/08/2023', 75.00);
INSERT INTO bookings VALUES (5, 'FOREST_L', '02/11/2023', 75.00);
INSERT INTO bookings VALUES (6, 'FOREST_L', '02/14/2023', 90.00);

INSERT INTO bookings VALUES (7, 'FOREST_L', '02/21/2023', 60.00);
INSERT INTO bookings VALUES (8, 'FOREST_L', '02/22/2023', 85.00);
INSERT INTO bookings VALUES (9, 'FOREST_L', '02/27/2023', 90.00);

INSERT INTO bookings VALUES (10, 'DESERT_S', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (11, 'DESERT_S', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (12, 'DESERT_S', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (13, 'DESERT_S', '02/05/2023', 75.00);
INSERT INTO bookings VALUES (14, 'DESERT_S', '02/06/2023', 34.00);
INSERT INTO bookings VALUES (15, 'DESERT_S', '02/09/2023', 85.00);

INSERT INTO bookings VALUES (16, 'DESERT_S', '02/12/2023', 23.00);
INSERT INTO bookings VALUES (17, 'DESERT_S', '02/13/2023', 76.00);
INSERT INTO bookings VALUES (18, 'DESERT_S', '02/14/2023', 85.00);

INSERT INTO bookings VALUES (19, 'OCEAN_WV', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (20, 'OCEAN_WV', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (21, 'OCEAN_WV', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (22, 'OCEAN_WV', '02/06/2023', 75.00);
INSERT INTO bookings VALUES (23, 'OCEAN_WV', '02/09/2023', 34.00);
INSERT INTO bookings VALUES (24, 'OCEAN_WV', '02/12/2023', 85.00);

INSERT INTO bookings VALUES (25, 'OCEAN_WV', '02/13/2023', 23.00);
INSERT INTO bookings VALUES (26, 'OCEAN_WV', '02/14/2023', 76.00);
INSERT INTO bookings VALUES (27, 'OCEAN_WV', '02/16/2023', 85.00);

INSERT INTO bookings VALUES (28, 'CITY_BLD', '02/01/2023', 98.00);
INSERT INTO bookings VALUES (29, 'CITY_BLD', '02/02/2023', 75.00);
INSERT INTO bookings VALUES (30, 'CITY_BLD', '02/04/2023', 85.00);

INSERT INTO bookings VALUES (31, 'CITY_BLD', '02/12/2023', 75.00);
INSERT INTO bookings VALUES (32, 'CITY_BLD', '02/13/2023', 34.00);
INSERT INTO bookings VALUES (33, 'CITY_BLD', '02/17/2023', 85.00);

INSERT INTO bookings VALUES (34, 'CITY_BLD', '02/22/2023', 23.00);
INSERT INTO bookings VALUES (35, 'CITY_BLD', '02/23/2023', 76.00);
INSERT INTO bookings VALUES (36, 'CITY_BLD', '02/24/2023', 85.00);
```

 在此查詢範例中，預訂記錄會計算為每週的總數。每週的結束日期會變成資料欄名稱。

```
SELECT * FROM
    (SELECT
       booking_id,
       (date_trunc('week', booking_date::date) + '5 days'::interval)::date as enddate,
       hotel_code AS "hotel code"
FROM bookings
) PIVOT (
    count(booking_id) FOR enddate IN ('2023-02-04','2023-02-11','2023-02-18') 
);
```

此查詢結果為下列輸出。

```
 hotel code | 2023-02-04  | 2023-02-11 | 2023-02-18
------------+-------------+------------+----------
 FOREST_L   |           3 |          2 |        1
 DESERT_S   |           4 |          3 |        2
 OCEAN_WV   |           3 |          3 |        3
 CITY_BLD   |           3 |          1 |        2
```

 Amazon Redshift 不支援使用 CROSSTAB 在多個資料欄上轉移。但是，您可以使用類似於 PIVOT 的彙總方式將資料列資料變更為資料欄，並使用類似於以下內容的查詢。這會使用與前一個範例相同的預訂範例資料。

```
SELECT 
  booking_date,
  MAX(CASE WHEN hotel_code = 'FOREST_L' THEN 'forest is booked' ELSE '' END) AS FOREST_L,
  MAX(CASE WHEN hotel_code = 'DESERT_S' THEN 'desert is booked' ELSE '' END) AS DESERT_S,
  MAX(CASE WHEN hotel_code = 'OCEAN_WV' THEN 'ocean is booked' ELSE '' END)  AS OCEAN_WV
FROM bookings
GROUP BY booking_date
ORDER BY booking_date asc;
```

範例查詢結果會顯示預訂日期，並列在指出已預訂飯店的短語旁邊。

```
 booking_date  | forest_l         | desert_s         | ocean_wv
---------------+------------------+------------------+--------------------
 2023-02-01    | forest is booked | desert is booked |  ocean is booked
 2023-02-02    | forest is booked | desert is booked |  ocean is booked
 2023-02-04    | forest is booked | desert is booked |  ocean is booked
 2023-02-05    |                  | desert is booked |        
 2023-02-06    |                  | desert is booked |
```

以下是 `PIVOT` 的使用須知：
+ `PIVOT` 可套用至資料表、子查詢和通用資料表運算式 (CTE)。`PIVOT` 無法套用至任何 `JOIN` 運算式、遞迴 CTE、`PIVOT` 或 `UNPIVOT` 運算式。`SUPER` 非巢狀運算式和 Redshift Spectrum 巢狀資料表也不支援。
+  `PIVOT` 支援 `COUNT`、`SUM`、`MIN`、`MAX` 和 `AVG` 彙總函數。
+ `PIVOT` 彙總運算式必須是受支援彙總函式的呼叫。不支援彙總頂端的複雜運算式。彙總引數不能包含對 `PIVOT` 輸入資料表以外資料表的參考。也不支援父查詢的相關參考。彙總參數可以包含子查詢。這些可以在內部或 `PIVOT` 輸入資料表上相互關聯。
+  `PIVOT IN` 清單值不能是資料欄參考或子查詢。每個值必須是與 `FOR` 資料欄參考相容的類型。
+  如果 `IN` 清單值沒有別名，則 `PIVOT` 會產生預設資料欄名稱。對於常數 `IN` 值，如 'abc' 或 5，預設資料欄名稱是常值本身。對於任何複雜的運算式，資料欄名稱都是標準的 Amazon Redshift 預設名稱，例如 `?column?`.

## UNPIVOT 範例
<a name="r_FROM_clause-unpivot-examples"></a>

設定範例資料，並用其來執行後續的範例。

```
CREATE TABLE count_by_color (quality varchar, red int, green int, blue int);

INSERT INTO count_by_color VALUES ('high', 15, 20, 7);
INSERT INTO count_by_color VALUES ('normal', 35, NULL, 40);
INSERT INTO count_by_color VALUES ('low', 10, 23, NULL);
```

`UNPIVOT` 在輸入欄紅色、綠色和藍色上。

```
SELECT *
FROM (SELECT red, green, blue FROM count_by_color) UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

此查詢結果為下列輸出。

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |  23
 blue  |   7
 blue  |  40
```

依預設，輸入資料欄中的 `NULL` 值會略過，且不會產生結果資料列。

下列範例會顯示包括 `INCLUDE NULLS` 的 `UNPIVOT`。

```
SELECT *
FROM (
    SELECT red, green, blue
    FROM count_by_color
) UNPIVOT INCLUDE NULLS (
    cnt FOR color IN (red, green, blue)
);
```

以下為其輸出。

```
 color | cnt
-------+-----
 red   |  15
 red   |  35
 red   |  10
 green |  20
 green |
 green |  23
 blue  |   7
 blue  |  40
 blue  |
```

如果設定 `INCLUDING NULLS` 參數，`NULL` 輸入值會產生結果列。

以 `quality` 作為隱含資料欄的 `The following query shows UNPIVOT`。

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red, green, blue)
);
```

此查詢結果為下列輸出。

```
 quality | color | cnt
---------+-------+-----
 high    | red   |  15
 normal  | red   |  35
 low     | red   |  10
 high    | green |  20
 low     | green |  23
 high    | blue  |   7
 normal  | blue  |  40
```

未在 `UNPIVOT` 定義中參考的輸入資料表資料欄會隱含地新增至結果資料表。在範例中，`quality` 資料欄就是這種情況。

下列範例顯示 `IN` 清單中具有值別名的 `UNPIVOT`。

```
SELECT *
FROM count_by_color UNPIVOT (
    cnt FOR color IN (red AS r, green AS g, blue AS b)
);
```

上述查詢結果為下列輸出。

```
 quality | color | cnt
---------+-------+-----
 high    | r     |  15
 normal  | r     |  35
 low     | r     |  10
 high    | g     |  20
 low     | g     |  23
 high    | b     |   7
 normal  | b     |  40
```

`UNPIVOT` 運算仔會接受每個 `IN` 清單值上的選用別名。每個別名都會提供每個 `value` 資料欄中的資料定義。

以下是 `UNPIVOT` 的使用須知。
+ `UNPIVOT` 可套用至資料表、子查詢和通用資料表運算式 (CTE)。`UNPIVOT` 無法套用至任何 `JOIN` 運算式、遞迴 CTE、`PIVOT` 或 `UNPIVOT` 運算式。`SUPER` 非巢狀運算式和 Redshift Spectrum 巢狀資料表也不支援。
+ `UNPIVOT IN` 清單必須只包含輸入資料表資料欄參考。`IN` 清單欄必須具有與之相容的通用類型。`UNPIVOT` 值資料欄具有這種通用類型。`UNPIVOT` 名稱資料欄的類型為 `VARCHAR`。
+ 如果 `IN` 清單值沒有別名，`UNPIVOT` 會使用資料欄名稱做為預設值。

# JOIN 範例
<a name="r_Join_examples"></a>

SQL JOIN 子句用於根據通用欄位，結合兩個或多個資料表中的資料。結果可能會或可能不會改變，具體取決於指定的聯結方法。如需 JOIN 子句語法的相關資訊，請參閱 [Parameters](r_FROM_clause30.md#r_FROM_clause30-parameters)。

下列範例會使用 `TICKIT` 範例資料中的資料。如需資料庫結構描述的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。若要了解如何載入範例資料，請參閱《Amazon Redshift 入門指南》**中的[載入資料](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)。

下列查詢是 LISTING 資料表和 SALES 資料表之間的內部聯結 (沒有 JOIN 關鍵字)，其中 LISTING 資料表中的 LISTID 是介於 1 和 5 之間。此查詢會比對 LISTING 資料表 (左側資料表) 和 SALES 資料表 (右側資料表) 中 LISTID 資料欄的值。結果顯示 LISTID 1、4 和 5 符合條件。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing, sales
where listing.listid = sales.listid
and listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

下列查詢是左側外部聯結。未在另一個資料表中找到相符項目時，左和右外部聯結會保留來自其中一個聯結資料表的值。左側和右側資料表分別是語法中最先和其次列出的資料表。NULL 值會用來填入結果集中的「空處」。此查詢會比對 LISTING 資料表 (左側資料表) 和 SALES 資料表 (右側資料表) 中 LISTID 資料欄的值。結果顯示，LISTID 2 和 3 並未產生任何銷售。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing left outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

下列查詢是右側外部聯結。此查詢會比對 LISTING 資料表 (左側資料表) 和 SALES 資料表 (右側資料表) 中 LISTID 資料欄的值。結果顯示 LISTID 1、4 和 5 符合條件。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing right outer join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

下列查詢是完全聯結。未在另一個資料表中找到相符項目時，完全聯結會保留來自聯結資料表的值。左側和右側資料表分別是語法中最先和其次列出的資料表。NULL 值會用來填入結果集中的「空處」。此查詢會比對 LISTING 資料表 (左側資料表) 和 SALES 資料表 (右側資料表) 中 LISTID 資料欄的值。結果顯示，LISTID 2 和 3 並未產生任何銷售。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     2 | NULL   | NULL
     3 | NULL   | NULL
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

下列查詢是完全聯結。此查詢會比對 LISTING 資料表 (左側資料表) 和 SALES 資料表 (右側資料表) 中 LISTID 資料欄的值。只有不會產生任何銷售 (ListID 2 和 3) 的資料列才會顯示在結果中。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from listing full join sales on sales.listid = listing.listid
where listing.listid between 1 and 5
and (listing.listid IS NULL or sales.listid IS NULL)
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     2 | NULL   | NULL
     3 | NULL   | NULL
```

下列範例是一個內部聯結搭配 ON 子句。在此情況下，不會傳回 NULL 資料列。

```
select listing.listid, sum(pricepaid) as price, sum(commission) as comm
from sales join listing
on sales.listid=listing.listid and sales.eventid=listing.eventid
where listing.listid between 1 and 5
group by 1
order by 1;

listid | price  |  comm
-------+--------+--------
     1 | 728.00 | 109.20
     4 |  76.00 |  11.40
     5 | 525.00 |  78.75
```

下列查詢是 LISTING 資料表和 SALES 資料表的交叉聯結或笛卡爾聯結，並且使用述詞來限制結果。此查詢會在 SALES 資料表和 LISTING 資料表中比對 LISTID 資料欄值，以找出兩個資料表中的 LISTID 1、2、3、4 和 5。結果顯示 20 個符合條件的資料列。

```
select sales.listid as sales_listid, listing.listid as listing_listid
from sales cross join listing
where sales.listid between 1 and 5
and listing.listid between 1 and 5
order by 1,2;

sales_listid | listing_listid
-------------+---------------
1            | 1
1            | 2
1            | 3
1            | 4
1            | 5
4            | 1
4            | 2
4            | 3
4            | 4
4            | 5
5            | 1
5            | 1
5            | 2
5            | 2
5            | 3
5            | 3
5            | 4
5            | 4
5            | 5
5            | 5
```

下列範例是兩個資料表之間的自然聯結。在這種情況下，兩個資料表中的 listid、sellerid、eventid 和 dateid 資料欄會具有相同的名稱和資料類型，因此會被用來作為聯結資料欄。結果限制為 5 個資料列。

```
select listid, sellerid, eventid, dateid, numtickets
from listing natural join sales
order by 1
limit 5;

listid | sellerid  | eventid | dateid | numtickets
-------+-----------+---------+--------+-----------
113    | 29704     | 4699    | 2075   | 22
115    | 39115     | 3513    | 2062   | 14
116    | 43314     | 8675    | 1910   | 28
118    | 6079      | 1611    | 1862   | 9
163    | 24880     | 8253    | 1888   | 14
```

下列範例是兩個資料表之間的聯結和 USING 子句。在這種情況下，資料欄 listid 和 eventid 會被用來作為聯結資料欄。結果限制為 5 個資料列。

```
select listid, listing.sellerid, eventid, listing.dateid, numtickets
from listing join sales
using (listid, eventid)
order by 1
limit 5;

listid | sellerid | eventid | dateid | numtickets
-------+----------+---------+--------+-----------
1      | 36861    | 7872    | 1850   | 10
4      | 8117     | 4337    | 1970   | 8
5      | 1616     | 8647    | 1963   | 4
5      | 1616     | 8647    | 1963   | 4
6      | 47402    | 8240    | 2053   | 18
```

以下查詢為 FROM 子句中兩個子查詢的內部聯結。查詢會尋找不同類別活動 (演奏會和表演) 的已售出和未售出票券數目。FROM 子句子查詢是*資料表*子查詢，可傳回多個資料欄和資料列。

```
select catgroup1, sold, unsold
from
(select catgroup, sum(qtysold) as sold
from category c, event e, sales s
where c.catid = e.catid and e.eventid = s.eventid
group by catgroup) as a(catgroup1, sold)
join
(select catgroup, sum(numtickets)-sum(qtysold) as unsold
from category c, event e, sales s, listing l
where c.catid = e.catid and e.eventid = s.eventid
and s.listid = l.listid
group by catgroup) as b(catgroup2, unsold)

on a.catgroup1 = b.catgroup2
order by 1;

catgroup1 |  sold  | unsold
----------+--------+--------
Concerts  | 195444 |1067199
Shows     | 149905 | 817736
```

# UNNEST 範例
<a name="r_FROM_clause-unnest-examples"></a>

UNNEST 是 FROM 子句中的參數，可將巢狀資料展開，成為包含資料的非巢狀元素的欄。如需解除巢狀化資料的相關資訊，請參閱 [查詢半結構化資料](query-super.md)。

下列陳述式會建立並填入 `orders` 資料表，其中包含的 `products` 欄內含產品 ID 的陣列。本節中的範例使用此資料表中的範例資料。

```
CREATE TABLE orders (
    order_id INT,
    products SUPER
);

-- Populate table
INSERT INTO orders VALUES
(1001, JSON_PARSE('[
        {
            "product_id": "P456",
            "name": "Monitor",
            "price": 299.99,
            "quantity": 1,
            "specs": {
                "size": "27 inch",
                "resolution": "4K"
            }
        }
    ]
')),
(1002, JSON_PARSE('
    [
        {
            "product_id": "P567",
            "name": "USB Cable",
            "price": 9.99,
            "quantity": 3
        },
        {
            "product_id": "P678",
            "name": "Headphones",
            "price": 159.99,
            "quantity": 1,
            "specs": {
                "type": "Wireless",
                "battery_life": "20 hours"
            }
        }
    ]
'));
```

以下範例說明如何使用 PartiQL 語法將包含範例資料的查詢解除巢狀化。

## 將沒有 OFFSET 欄的陣列解除巢狀化
<a name="r_FROM_clause-unnest-examples-no-offset"></a>

下列查詢會將產品欄中的 SUPER 陣列解除巢狀化，其中每一列代表 `order_id` 中訂單的某一個項目。

```
SELECT o.order_id, unnested_products.product
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(3 rows)
```

下列查詢會尋找每個訂單中最昂貴的產品。

```
SELECT o.order_id, MAX(unnested_products.product)
FROM orders o, UNNEST(o.products) AS unnested_products(product);

 order_id |                                                           product                                                           
----------+-----------------------------------------------------------------------------------------------------------------------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}}
(2 rows)
```

## 將具有隱含 OFFSET 欄的陣列解除巢狀化
<a name="r_FROM_clause-unnest-examples-implicit-offset"></a>

下列查詢使用 `UNNEST ... WITH OFFSET` 參數來顯示其訂單陣列內每個產品從零開始的位置。

```
SELECT o.order_id, up.product, up.offset_col
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product);

 order_id |                                                           product                                                           | offset_col 
----------+-----------------------------------------------------------------------------------------------------------------------------+------------
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |          0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |          0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |          1
(3 rows)
```

由於陳述式未指定位移欄的別名，因此 Amazon Redshift 預設會將其命名為 `offset_col`。

## 將具有明確 OFFSET 欄的陣列解除巢狀化
<a name="r_FROM_clause-unnest-examples-explicit-offset"></a>

下列查詢同樣使用 `UNNEST ... WITH OFFSET` 參數來顯示其訂單陣列內的產品。相較於先前範例中的查詢，此查詢的差異在於其使用別名 `idx` 明確命名位移欄。

```
SELECT o.order_id, up.product, up.idx
FROM orders o, UNNEST(o.products) WITH OFFSET AS up(product, idx);

 order_id |                                                           product                                                           | idx 
----------+-----------------------------------------------------------------------------------------------------------------------------+-----
     1001 | {"product_id":"P456","name":"Monitor","price":299.99,"quantity":1,"specs":{"size":"27 inch","resolution":"4K"}}             |   0
     1002 | {"product_id":"P567","name":"USB Cable","price":9.99,"quantity":3}                                                          |   0
     1002 | {"product_id":"P678","name":"Headphones","price":159.99,"quantity":1,"specs":{"type":"Wireless","battery_life":"20 hours"}} |   1
(3 rows)
```

# WHERE 子句
<a name="r_WHERE_clause"></a>

WHERE 子句包含聯結資料表或套用述詞至資料表中資料欄的條件。資料表可以藉由在 WHERE 子句或 FROM 子句中使用適當的語法進行內部聯結。外部連結條件必須在 FROM 子句中指定。

## 語法
<a name="r_WHERE_clause-synopsis"></a>

```
[ WHERE condition ]
```

## *條件*
<a name="r_WHERE_clause-synopsis-condition"></a>

任何產生布林值結果的搜尋條件，例如，資料表資料欄的聯結條件或述詞。以下範例為有效的聯結條件：

```
sales.listid=listing.listid
sales.listid<>listing.listid
```

以下範例對於資料表中的資料欄是有效的條件：

```
catgroup like 'S%'
venueseats between 20000 and 50000
eventname in('Jersey Boys','Spamalot')
year=2008
length(catdesc)>25
date_part(month, caldate)=6
```

條件可分成簡單和複雜；若是複雜條件，您可以使用括號來隔離邏輯單位。在下列範例中，聯結條件會以括號包圍。

```
where (category.catid=event.catid) and category.catid in(6,7,8)
```

## 使用須知
<a name="r_WHERE_clause_usage_notes"></a>

您無法在 WHERE 子句中使用別名來參考選取清單表達式。

您無法限制 WHERE 子句中彙整函數的結果；請使用 HAVING 子句達成此目的。

WHERE 子句中限制的資料欄必須衍生自 FROM 子句中的資料表參考。

## 範例
<a name="r_SELECT_synopsis-example"></a>

以下查詢使用不同 WHERE 子句限制的組合，包括 SALES 和 EVENT 資料表的聯結條件、EVENTNAME 資料欄上的述詞，以及 STARTTIME 資料欄上的兩個述詞。

```
select eventname, starttime, pricepaid/qtysold as costperticket, qtysold
from sales, event
where sales.eventid = event.eventid
and eventname='Hannah Montana'
and date_part(quarter, starttime) in(1,2)
and date_part(year, starttime) = 2008
order by 3 desc, 4, 2, 1 limit 10;

eventname    |      starttime      |   costperticket   | qtysold
----------------+---------------------+-------------------+---------
Hannah Montana | 2008-06-07 14:00:00 |     1706.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |     1658.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1479.00000000 |       3
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       1
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       2
Hannah Montana | 2008-06-07 14:00:00 |     1163.00000000 |       4
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       1
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       2
Hannah Montana | 2008-05-01 19:00:00 |      497.00000000 |       4
(10 rows)
```

# WHERE 子句中 Oracle 樣式的外部聯結
<a name="r_WHERE_oracle_outer"></a>

為了提供 Oracle 相容性，Amazon Redshift 在 WHERE 子句聯結條件中支援 Oracle 外部聯結運算子 (\$1)。此運算子主要僅用於定義外部聯結條件；請勿嘗試在其他內容中使用它。大多數情況下，此運算子的其他用途都會加以忽略，且不會顯示任何訊息。

外部聯結會傳回對等內部聯結傳回的所有資料列，加上其中一個資料表或兩個資料表的不相符資料列。在 FROM 子句中，您可以指定左、右和完整外部聯結。在 WHERE 子句中，您只能指定左和右外部聯結。

若要對 TABLE1 和 TABLE2 進行外部聯結並從 TABLE1 傳回不相符的資料列 (左外部聯結)，請在 FROM 子句中指定 `TABLE1 LEFT OUTER JOIN TABLE2`，或在 WHERE 子句中對來自 TABLE2 的所有聯結資料欄套用 (\$1) 運算子。對於 TABLE1 中在 TABLE2 中沒有相符資料列的所有資料列，查詢的結果會對包含 TABLE2 中資料欄的任何選取清單表達式包含 null。

若要對 TABLE2 中在 TABLE1 中沒有相符資料列的所有資料列產生相同的行為，請在 FROM 子句中指定 `TABLE1 RIGHT OUTER JOIN TABLE2`，或在 WHERE 子句中對來自 TABLE1 的所有聯結資料欄套用 (\$1) 運算子。

## 基本語法
<a name="r_WHERE_oracle_outer-basic-syntax"></a>

```
[ WHERE {
[ table1.column1 = table2.column1(+) ]
[ table1.column1(+) = table2.column1 ]
}
```

第一個條件相當於：

```
from table1 left outer join table2
on table1.column1=table2.column1
```

第二個條件相當於：

```
from table1 right outer join table2
on table1.column1=table2.column1
```

**注意**  
這裡顯示的語法採用一個聯結資料欄配對說明簡單的 equijoin 案例。不過，其他類型的比較條件和多個聯結資料欄配對同樣有效。

例如，下列 WHERE 子句會定義兩個資料欄配對之間的外部聯結。(\$1) 運算子在這兩個條件中必須連接至相同資料表：

```
where table1.col1 > table2.col1(+)
and table1.col2 = table2.col2(+)
```

## 使用須知
<a name="r_WHERE_oracle_outer_usage_notes"></a>

盡可能使用標準 FROM 子句 OUTER JOIN 語法，而不要在 WHERE 子句中使用 (\$1) 運算子。包含 (\$1) 運算子的查詢受到下列規則限制：
+ 您只能在 WHERE 子句中使用 (\$1) 運算子，而且只能參考資料表或檢視的資料欄。
+ 您無法將 (\$1) 運算子套用至表達式。不過，表達式可包含使用 (\$1) 運算子的資料欄。例如，下列聯結條件會傳回語法錯誤：

  ```
  event.eventid*10(+)=category.catid
  ```

  不過，下列聯結條件有效：

  ```
  event.eventid(+)*10=category.catid
  ```
+ 您無法在同時包含 FROM 子句聯結語法的查詢區塊中使用 (\$1) 運算子。
+ 若兩個資料表是透過多個聯結條件聯結，您必須在所有條件中使用 (\$1) 運算子，或完全不使用。採用混合語法樣式的聯結會做為內部聯結執行，但不會產生警告。
+ 若您將外部查詢中的資料表與產生自內部查詢的資料表聯結，則 (\$1) 運算子不會產生外部聯結。
+ 若要使用 (\$1) 運算子將資料表與其本身進行外部聯結，您必須在 FROM 子句中定義資料表別名，並且在聯結條件中參考這些別名：

  ```
  select count(*)
  from event a, event b
  where a.eventid(+)=b.catid;
  
  count
  -------
  8798
  (1 row)
  ```
+ 您無法將包含 (\$1) 運算子的聯結條件與 OR 條件或 IN 條件結合。例如：

  ```
  select count(*) from sales, listing
  where sales.listid(+)=listing.listid or sales.salesid=0;
  ERROR:  Outer join operator (+) not allowed in operand of OR or IN.
  ```
+  在與兩個以上資料表進行外部聯結的 WHERE 子句中，(\$1) 運算子只能對特定資料表套用一次。在以下範例中，SALES 資料表無法在兩個連續聯結中使用 (\$1) 運算子參考。

  ```
  select count(*) from sales, listing, event
  where sales.listid(+)=listing.listid and sales.dateid(+)=date.dateid;
  ERROR:  A table may be outer joined to at most one other table.
  ```
+  若 WHERE 子句的外部聯結條件會將 TABLE2 的資料欄與常數進行比較，則將 (\$1) 運算子套用至資料欄。若您未包含運算子，就會消除 TABLE1 中的外部聯結資料列 (當中限制的資料欄會包含 null)。請參閱下方範例一節。

## 範例
<a name="r_WHERE_oracle_outer-examples"></a>

以下聯結查詢會在 LISTID 資料欄上指定 SALES 和 LISTING 資料表的左外部聯結：

```
select count(*)
from sales, listing
where sales.listid = listing.listid(+);

count
--------
172456
(1 row)
```

下列對等查詢會產生相同的結果，但使用 FROM 子句聯結語法：

```
select count(*)
from sales left outer join listing on sales.listid = listing.listid;

count
--------
172456
(1 row)
```

SALES 資料表未包含 LISTING 資料表中所有清單的記錄，因為並非所有清單都產生銷售。以下查詢會將 SALES 和 LISTING 進行外部聯結，並從 LISTING 傳回資料列，即使 SALES 資料表回報特定清單 ID 沒有銷售。PRICE 和 COMM 資料欄衍生自 SALES 資料表，其結果集中的不相符資料列會包含 null。

```
select listing.listid, sum(pricepaid) as price,
sum(commission) as comm
from listing, sales
where sales.listid(+) = listing.listid and listing.listid between 1 and 5
group by 1 order by 1;

listid | price  |  comm
--------+--------+--------
1 | 728.00 | 109.20
2 |        |
3 |        |
4 |  76.00 |  11.40
5 | 525.00 |  78.75
(5 rows)
```

請注意，使用 WHERE 子句聯結運算子時，資料表在 FROM 子句中的順序並不重要。

WHERE 子句中較複雜的外部聯結條件範例，就是條件由兩個資料表資料欄之間的比較，*以及*與常數的比較所構成：

```
where category.catid=event.catid(+) and eventid(+)=796;
```

請注意，(\$1) 運算子會在兩處使用：一處是資料表之間的對等比較中，另一處是 EVENTID 資料欄的比較條件中。此語法的結果是在評估 EVENTID 的限制時，保留外部聯結資料列。若您從 EVENTID 限制中移除 (\$1) 運算子，則查詢會將此限制視為篩選條件，而非外部聯結條件的一部分。接著就會從結果集中消除 EVENTID 包含 null 的外部聯結資料列。

以下是說明此行為的完整查詢：

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid(+)=796;

catname | catgroup | eventid
-----------+----------+---------
Classical | Concerts |
Jazz | Concerts |
MLB | Sports   |
MLS | Sports   |
Musicals | Shows    | 796
NBA | Sports   |
NFL | Sports   |
NHL | Sports   |
Opera | Shows    |
Plays | Shows    |
Pop | Concerts |
(11 rows)
```

使用 FROM 子句語法的對等查詢如下所示：

```
select catname, catgroup, eventid
from category left join event
on category.catid=event.catid and eventid=796;
```

若您從此查詢的 WHERE 子句版本中移除第二個 (\$1) 運算子，則只會傳回 1 個資料列 (`eventid=796` 的資料列)。

```
select catname, catgroup, eventid
from category, event
where category.catid=event.catid(+) and eventid=796;

catname | catgroup | eventid
-----------+----------+---------
Musicals | Shows    | 796
(1 row)
```

# GROUP BY 子句
<a name="r_GROUP_BY_clause"></a>

GROUP BY 子句會識別查詢的分組資料欄。它用於將資料表中所有列出的欄中具有相同值的列分組在一起。列出欄的順序並不重要。結果是將具有共同值的每一組列合併成一個群組列，代表群組中的所有列。使用 GROUP BY 消除輸出中的重複項目，並計算套用至群組的彙總。分組資料欄必須在查詢使用標準函數運算彙整時宣告，像是 SUM、AVG 和 COUNT。如需詳細資訊，請參閱[彙總函數](c_Aggregate_Functions.md)。

## 語法
<a name="r_GROUP_BY_clause-syntax"></a>

```
[ GROUP BY  expression [, ...] | ALL | aggregation_extension  ]
```

其中 *aggregation\$1extension* 為下列其中之一：

```
GROUPING SETS ( () | aggregation_extension [, ...] ) |
ROLLUP ( expr [, ...] ) |
CUBE ( expr [, ...] )
```

## Parameters
<a name="r_GROUP_BY_clause-parameters"></a>

 *表達式*  
在查詢的選取清單中，資料欄或表達式的清單必須符合非彙整表達式的清單。例如，請考量以下簡單查詢。  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by listid, eventid
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```
在此查詢中，選取清單是由兩個彙整表達式所構成。第一個使用 SUM 函數，第二個使用 COUNT 函數。其餘兩個資料欄 LISTID 和 EVENTID 必須宣告為分組資料欄。  
GROUP BY 子句中的表達式也可以使用序數來參考選取清單。例如，前一個範例可縮減如下。  

```
select listid, eventid, sum(pricepaid) as revenue,
count(qtysold) as numtix
from sales
group by 1,2
order by 3, 4, 2, 1
limit 5;

listid | eventid | revenue | numtix
-------+---------+---------+--------
89397  |      47 |   20.00 |      1
106590 |      76 |   20.00 |      1
124683 |     393 |   20.00 |      1
103037 |     403 |   20.00 |      1
147685 |     429 |   20.00 |      1
(5 rows)
```

ALL  
ALL 表示依 SELECT 清單中指定的所有欄分組，但彙總的欄除外。例如，請考慮下列查詢，其依據 `col1` 和 `col2` 分組，因此不需要在 GROUP BY 子句中個別指定。欄 `col3` 是 `SUM` 函式的引數，因此不會分組。  

```
SELECT col1, col2 sum(col3) FROM testtable GROUP BY ALL
```
如果您在 SELECT 清單中排除 (EXCLUDE) 某一欄，則 GROUP BY ALL 子句不會將依據該特定欄的結果分組。  

```
SELECT * EXCLUDE col3 FROM testtable GROUP BY ALL
```

 * *aggregation\$1extension* *   
您可以使用彙總延伸項目 GROUPING SETS、ROLLUP 和 CUBE，在單一陳述式中執行多個 GROUP BY 操作的工作。如需彙總延伸項目及相關函數的相關資訊，請參閱 [彙總延伸項目](r_GROUP_BY_aggregation-extensions.md)。

## 範例
<a name="r_GROUP_BY_clause-examples"></a>

下列範例使用的 SALES 資料表包含以下各欄：salesid、listid、sellerid、buyerid、eventid、dateid、qtysold、pricepaid、commission 和 saletime。如需 SALES 資料表的詳細資訊，請參閱 [範本資料庫](c_sampledb.md)。

下列查詢依據 `salesid` 和 `listid` 分組，因此不需要在 GROUP BY 子句中個別指定。欄 `qtysold` 是 `SUM` 函式的引數，因此不會分組。

```
SELECT salesid, listid, sum(qtysold) FROM sales GROUP BY ALL;

salesid | listid  | sum
--------+---------+------
33095   | 36572   | 2	
88268   | 100813  | 4	
110917  | 127048  | 1	
...
```

下列範例查詢會在 SELECT 清單中排除數個欄，因此 GROUP BY ALL 只會將 salesid 和 listid 分組。

```
SELECT * EXCLUDE sellerid, buyerid, eventid, dateid, qtysold, pricepaid, commission, saletime 
FROM sales GROUP BY ALL;

salesid | listid 
--------+---------
33095   | 36572   	
88268   | 100813 	
110917  | 127048 	
...
```

# 彙總延伸項目
<a name="r_GROUP_BY_aggregation-extensions"></a>

Amazon Redshift 支援彙總延伸項目，可在單一陳述式中執行多個 GROUP BY 操作的工作。

 彙總延伸項目的範例會使用 `orders` 資料表，該資料表會保留電子公司的銷售資料。您可以執行下列操作來建立 `orders`：

```
CREATE TABLE ORDERS (
    ID INT,
    PRODUCT CHAR(20),
    CATEGORY CHAR(20),
    PRE_OWNED CHAR(1),
    COST DECIMAL
);

INSERT INTO ORDERS VALUES
    (0, 'laptop',       'computers',    'T', 1000),
    (1, 'smartphone',   'cellphones',   'T', 800),
    (2, 'smartphone',   'cellphones',   'T', 810),
    (3, 'laptop',       'computers',    'F', 1050),
    (4, 'mouse',        'computers',    'F', 50);
```

## *GROUPING SETS*
<a name="r_GROUP_BY_aggregation-extensions-grouping-sets"></a>

 在單一陳述式中計算一或多個群組集。群組集是單一 GROUP BY 子句的集合，也就是一組 0 個或多個資料行，您可以以此將查詢的結果集分組。GROUP BY GROUPING SETS 等同於在由不同資料欄分組的一個結果集上執行 UNION ALL 查詢。例如，GROUP BY GROUPING SETS((a), (b)) 等同於 GROUP BY a UNION ALL GROUP BY b。

 下列範例會傳回訂單資料表的產品根據產品類別和銷售產品種類進行分組的成本。

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(category, product);

       category       |       product        | total
----------------------+----------------------+-------
 computers            |                      |  2100
 cellphones           |                      |  1610
                      | laptop               |  2050
                      | smartphone           |  1610
                      | mouse                |    50

(5 rows)
```

## *ROLLUP*
<a name="r_GROUP_BY_aggregation-extensions-rollup"></a>

 假設有一個階層，其中之前的資料欄被視為後續資料欄的父項。ROLLUP 會依提供的資料欄將資料分組，並傳回額外的小計資料列 (代表所有分組資料欄層級的總計)，以及已分組的資料列。例如，您可以使用 GROUP BY ROLLUP((a), (b)) 傳回一個先按 a 分組，然後按 b 分組的結果集 (假設 b 是 a 的子區段)。ROLLUP 也會傳回包含整個結果集的資料列，而不會將資料欄分組。

GROUP BY ROLLUP((a), (b)) 等於 GROUP BY GROUPING SETS((a,b), (a), ())。

下列範例會傳回訂單資料表產品先依類別分組，然後依產品分組的成本，其中以產品做為類別的細項。

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY ROLLUP(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      |                      |  3710
(6 rows)
```

## *CUBE*
<a name="r_GROUP_BY_aggregation-extensions-cube"></a>

 依提供的資料欄將資料分組，並傳回額外的小計資料列 (代表所有分組資料欄層級的總計)，以及已分組的資料列。CUBE 會傳回與 ROLLUP 相同的資料列，同時針對 ROLUP 未涵蓋的每個分組資料欄組合新增額外的小計資料列。例如，您可以使用 GROUP BY CUBE ((a), (b)) 傳回一個先按 a 分組，然後按 b 分組的結果集 (假設 b 是 a 的子區段)，然後再獨自按 b 分組。CUBE 也會傳回包含整個結果集的資料列，而不會將資料欄分組。

GROUP BY CUBE((a), (b)) 等於 GROUP BY GROUPING SETS((a, b), (a), (b), ())。

下列範例會傳回訂單資料表產品先依類別分組，然後依產品分組的成本，其中以產品做為類別的細項。與前面的 ROLLUP 範例不同，陳述式會傳回每個分組資料欄組合的結果。

```
SELECT category, product, sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 1,2;

       category       |       product        | total
----------------------+----------------------+-------
 cellphones           | smartphone           |  1610
 cellphones           |                      |  1610
 computers            | laptop               |  2050
 computers            | mouse                |    50
 computers            |                      |  2100
                      | laptop               |  2050
                      | mouse                |    50
                      | smartphone           |  1610
                      |                      |  3710
(9 rows)
```

## *GROUPING/GROUPING\$1ID 函數*
<a name="r_GROUP_BY_aggregation-extentions-grouping"></a>

 ROLLUP 和 CUBE 會將 NULL 值新增至結果集，以指出小計資料列。例如，GROUP BY ROLLUP((a), (b)) 會傳回 b 分組資料欄中值為 NULL 的一或多個資料列，以指出這些資料列是分組資料欄中欄位的小計。這些 NULL 值僅用於滿足傳回元組的格式。

 當您在儲存 NULL 值本身的關係上使用 ROLLUP 和 CUBE 執行 GROUP BY 操作時，這可能會產生資料列看起來具有相同分組資料欄的結果集。返回上一個範例，如果 b 分組資料欄包含一個儲存的 NULL 值，GROUP BY ROLLUP((a), (b)) 會在 b 分組資料欄中 (不是小計) 傳回值為 NULL 的資料列。

 若要區分 ROLLUP 和 CUBE 建立的 NULL 值，以及儲存在資料表本身的 NULL 值，您可以使用 GROUPING 函數或其別名 GROUPING\$1ID。GROBING 採用單個分組集作為其引數，並且對於結果集中的每一個資料列傳回對應於該位置中分組資料欄的 0 或 1 位元值，然後將該值轉換為整數。如果該位置中的值是由彙總延伸項目建立的 NULL 值，則 GROUPING 會傳回 1。對於所有其他值，包括儲存的 NULL 值，則傳回 0。

 例如，GROUPING(category, product) 可以針對指定的資料列傳回下列值，視該資料列的分組資料欄值而定。就此範例而言，資料表中的所有 NULL 值都是彙總延伸項目所建立的 NULL 值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_GROUP_BY_aggregation-extensions.html)

GROUPING 函數會以下列格式顯示在查詢的 SELECT 清單部分中。

```
SELECT ... [GROUPING( expr )...] ...
  GROUP BY ... {CUBE | ROLLUP| GROUPING SETS} ( expr ) ...
```

下列範例與前面的 CUBE 範例相同，但為其分組集增加了 GROUPING 函數。

```
SELECT category, product,
       GROUPING(category) as grouping0,
       GROUPING(product) as grouping1,
       GROUPING(category, product) as grouping2,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product) ORDER BY 3,1,2;

       category       |       product        | grouping0 | grouping1 | grouping2 | total
----------------------+----------------------+-----------+-----------+-----------+-------
 cellphones           | smartphone           |         0 |         0 |         0 |  1610
 cellphones           |                      |         0 |         1 |         1 |  1610
 computers            | laptop               |         0 |         0 |         0 |  2050
 computers            | mouse                |         0 |         0 |         0 |    50
 computers            |                      |         0 |         1 |         1 |  2100
                      | laptop               |         1 |         0 |         2 |  2050
                      | mouse                |         1 |         0 |         2 |    50
                      | smartphone           |         1 |         0 |         2 |  1610
                      |                      |         1 |         1 |         3 |  3710
(9 rows)
```

## *部份 ROLLUP 與 CUBE*
<a name="r_GROUP_BY_aggregation-extentions-partial"></a>

 您只能使用小計的一部分來執行 ROLLUP 和 CUBE 操作。

 部分 ROLLUP 和 CUBE 操作的語法如下。

```
GROUP BY expr1, { ROLLUP | CUBE }(expr2, [, ...])
```

在這裡，GROUP BY 子句僅在表達式 *expr2* 和以後的層級上建立小計資料列。

下列範例會顯示訂單資料表上的部份 ROLLUP 和 CUBE 操作，並先依產品是否為二手產品分組，然後在類別與產品資料欄上執行 ROLLUP 和 CUBE。

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, ROLLUP(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(9 rows)

SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY pre_owned, CUBE(category, product) ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
(13 rows)
```

由於二手資料欄不包含在 ROLLUP 和 CUBE 作業中，因此沒有包含所有其他資料列的總計資料列。

## *串連分組*
<a name="r_GROUP_BY_aggregation-extentions-concat"></a>

 您可以串連多個 GROUPING SETS/ROLLUP/CUBE 子句，以計算不同層次的小計。串連分組會傳回所提供分組集的笛卡爾乘積。

 串連 GROUPING SETS/ROLLUP/CUBE 子句的語法如下。

```
GROUP BY {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...]),
         {ROLLUP|CUBE|GROUPING SETS}(expr1[, ...])[, ...]
```

請考慮下列範例，看看小型串連分組如何產生大型的最終結果集。

```
SELECT pre_owned, category, product,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY CUBE(category, product), GROUPING SETS(pre_owned, ())
ORDER BY 4,1,2,3;

 pre_owned |       category       |       product        | group_id | total
-----------+----------------------+----------------------+----------+-------
 F         | computers            | laptop               |        0 |  1050
 F         | computers            | mouse                |        0 |    50
 T         | cellphones           | smartphone           |        0 |  1610
 T         | computers            | laptop               |        0 |  1000
           | cellphones           | smartphone           |        1 |  1610
           | computers            | laptop               |        1 |  2050
           | computers            | mouse                |        1 |    50
 F         | computers            |                      |        2 |  1100
 T         | cellphones           |                      |        2 |  1610
 T         | computers            |                      |        2 |  1000
           | cellphones           |                      |        3 |  1610
           | computers            |                      |        3 |  2100
 F         |                      | laptop               |        4 |  1050
 F         |                      | mouse                |        4 |    50
 T         |                      | laptop               |        4 |  1000
 T         |                      | smartphone           |        4 |  1610
           |                      | laptop               |        5 |  2050
           |                      | mouse                |        5 |    50
           |                      | smartphone           |        5 |  1610
 F         |                      |                      |        6 |  1100
 T         |                      |                      |        6 |  2610
           |                      |                      |        7 |  3710
(22 rows)
```

## *巢狀分組*
<a name="r_GROUP_BY_aggregation-extentions-nested"></a>

 您可以使用 GROUPING SETS/ROLLUP/CUBE 操作作為您的 GROUPING SETS *expr*，形成一個巢狀分組。巢狀 GROUPING SETS 中的子分組會被扁平化。

 巢狀分組的語法如下。

```
GROUP BY GROUPING SETS({ROLLUP|CUBE|GROUPING SETS}(expr[, ...])[, ...])
```

請考量下列範例。

```
SELECT category, product, pre_owned,
       GROUPING(category, product, pre_owned) as group_id,
       sum(cost) as total
FROM orders
GROUP BY GROUPING SETS(ROLLUP(category), CUBE(product, pre_owned))
ORDER BY 4,1,2,3;

       category       |       product        | pre_owned | group_id | total
----------------------+----------------------+-----------+----------+-------
 cellphones           |                      |           |        3 |  1610
 computers            |                      |           |        3 |  2100
                      | laptop               | F         |        4 |  1050
                      | laptop               | T         |        4 |  1000
                      | mouse                | F         |        4 |    50
                      | smartphone           | T         |        4 |  1610
                      | laptop               |           |        5 |  2050
                      | mouse                |           |        5 |    50
                      | smartphone           |           |        5 |  1610
                      |                      | F         |        6 |  1100
                      |                      | T         |        6 |  2610
                      |                      |           |        7 |  3710
                      |                      |           |        7 |  3710
(13 rows)
```

請注意，由於 ROLLUP(category) 和 CUBE(product, pre\$1owned) 都包含分組集 ()，因此代表總計的資料列將重複。

## *使用須知*
<a name="r_GROUP_BY_aggregation-extensions-usage-notes"></a>
+ GROUP BY 子句最多支援 64 個分組集。如果是 ROLLUP 和 CUBE，或是 GROUPING SETS、ROLLUP 和 CUBE 的某些組合，則此限制會套用至隱含的分組集數目。例如，GROUP BY CUBE((a), (b)) 計為 4 個分組集，而不是 2 個。
+ 使用彙總延伸項目時，您無法使用常數作為分組資料欄。
+ 您無法建立包含重複資料欄的分組集。

# HAVING 子句
<a name="r_HAVING_clause"></a>

HAVING 子句會將條件套用至查詢傳回的中繼分組結果集。

## 語法
<a name="r_HAVING_clause-synopsis"></a>

```
[ HAVING condition ]
```

例如，您可以限制 SUM 函數的結果：

```
having sum(pricepaid) >10000
```

HAVING 會在套用所有 WHERE 子句條件且完成 GROUP BY 操作之後套用。

條件本身會採用與任何 WHERE 子句條件相同的形式。

## 使用須知
<a name="r_HAVING_clause_usage_notes"></a>
+ HAVING 子句條件中參考的任何資料欄必須是分組資料欄，或是參考彙整函數結果的資料欄。
+ 在 HAVING 子句中，您無法指定：
  + 參考選取清單項目的序數。只有 GROUP BY 和 ORDER BY 子句接受序數。

## 範例
<a name="r_HAVING_clause-examples"></a>

以下查詢會依名稱計算售票總金額，然後消除總金額低於 800,000 USD 的活動。HAVING 條件會套用至選取清單中彙整函數的結果：`sum(pricepaid)`。

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(pricepaid) > 800000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

以下查詢會計算類似的結果集。不過，在此情況下，HAVING 條件會套用至選取清單中未指定的彙整：`sum(qtysold)`。未銷售超過 2,000 張票的活動將從最終結果中消除。

```
select eventname, sum(pricepaid)
from sales join event on sales.eventid = event.eventid
group by 1
having sum(qtysold) >2000
order by 2 desc, 1;

eventname        |    sum
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
Chicago          |  790993.00
Spamalot         |  714307.00
```

以下查詢會依名稱計算售票總金額，然後消除總金額低於 800,000 USD 的活動。HAVING 條件會套用至使用別名 `pp` 代表 `sum(pricepaid)` 的選取清單中彙總函數的結果。

```
select eventname, sum(pricepaid) as pp
from sales join event on sales.eventid = event.eventid
group by 1
having pp > 800000
order by 2 desc, 1;

eventname        |    pp
-----------------+-----------
Mamma Mia!       | 1135454.00
Spring Awakening |  972855.00
The Country Girl |  910563.00
Macbeth          |  862580.00
Jersey Boys      |  811877.00
Legally Blonde   |  804583.00
```

# QUALIFY 子句
<a name="r_QUALIFY_clause"></a>

QUALIFY 子句會根據使用者指定的搜尋條件，篩選先前計算的視窗函數結果。您可以使用子句將篩選條件套用至視窗函數的結果，而不需要使用子查詢。

其類似於 [HAVING 子句](https://docs.aws.amazon.com/redshift/latest/dg/r_HAVING_clause.html)，該子句適用於從 WHERE 子句進一步篩選列的條件。QUALIFY 和 HAVING 之間的區別在於，從 QUALIFY 子句篩選的結果可以基於在資料上執行窗口函數的結果。您可以在一個查詢中同時使用 QUALIFY 和 HAVING 子句。

## 語法
<a name="r_QUALIFY-synopsis"></a>

```
QUALIFY condition
```

**注意**  
如果您直接在 FROM 子句之後使用 QUALIFY 子句，則 FROM 關係名稱必須在 QUALIFY 子句之前指定別名。

## 範例
<a name="r_QUALIFY-examples"></a>

本節中的範例使用以下範例資料。

```
create table store_sales (ss_sold_date date, ss_sold_time time, 
               ss_item text, ss_sales_price float);
insert into store_sales values ('2022-01-01', '09:00:00', 'Product 1', 100.0),
                               ('2022-01-01', '11:00:00', 'Product 2', 500.0),
                               ('2022-01-01', '15:00:00', 'Product 3', 20.0),
                               ('2022-01-01', '17:00:00', 'Product 4', 1000.0),
                               ('2022-01-01', '18:00:00', 'Product 5', 30.0),
                               ('2022-01-02', '10:00:00', 'Product 6', 5000.0),
                               ('2022-01-02', '16:00:00', 'Product 7', 5.0);
```

下列範例示範如何找到每天 12:00 之後售出的兩個最昂貴的物品。

```
SELECT *
FROM store_sales ss
WHERE ss_sold_time > time '12:00:00'
QUALIFY row_number()
OVER (PARTITION BY ss_sold_date ORDER BY ss_sales_price DESC) <= 2
               

 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 17:00:00     | Product 4 |           1000
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

然後，您可以找到每天售出的最後一件物品。

```
SELECT *
FROM store_sales ss
QUALIFY last_value(ss_item)
OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) = ss_item;
               
ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price 
--------------+--------------+-----------+----------------
 2022-01-01   | 18:00:00     | Product 5 |             30
 2022-01-02   | 16:00:00     | Product 7 |              5
```

下列範例會傳回與前一個查詢相同的記錄，也就是每天售出的最後一件物品，但其不使用 QUALIFY 子句。

```
SELECT * FROM (
  SELECT *,
  last_value(ss_item)
  OVER (PARTITION BY ss_sold_date ORDER BY ss_sold_time ASC
        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) ss_last_item
  FROM store_sales ss
)
WHERE ss_last_item = ss_item;
               
 ss_sold_date | ss_sold_time |  ss_item  | ss_sales_price | ss_last_item 
--------------+--------------+-----------+----------------+--------------
 2022-01-02   | 16:00:00     | Product 7 |              5 | Product 7
 2022-01-01   | 18:00:00     | Product 5 |             30 | Product 5
```

# UNION、INTERSECT 和 EXCEPT
<a name="r_UNION"></a>

**Topics**
+ [語法](#r_UNION-synopsis)
+ [Parameters](#r_UNION-parameters)
+ [集合運算子的評估順序](#r_UNION-order-of-evaluation-for-set-operators)
+ [使用須知](#r_UNION-usage-notes)
+ [範例 UNION 查詢](c_example_union_query.md)
+ [範例 UNION ALL 查詢](c_example_unionall_query.md)
+ [範例 INTERSECT 查詢](c_example_intersect_query.md)
+ [範例 EXCEPT 查詢](c_Example_MINUS_query.md)

UNION、INTERSECT 和 EXCEPT *集合運算子*可用來比較和合併兩種不同查詢表達式的結果。例如，如果您想知道哪些網站使用者同時是買方和賣家，但其使用者名稱儲存在不同的資料欄或資料表中，您可以找出這兩種類型使用者的*交集*。如果您想知道哪些網站使用者是買方，但不是賣家，您可以使用 EXCEPT 運算子找出兩份使用者清單之間的*差異*。如果您想要建構所有使用者的清單，但不考慮角色，您可以使用 UNION 運算子。

## 語法
<a name="r_UNION-synopsis"></a>

```
query
{ UNION [ ALL ] | INTERSECT | EXCEPT | MINUS }
query
```

## Parameters
<a name="r_UNION-parameters"></a>

 *query*   
此查詢表達式會以其選取清單形式，對應至接在 UNION、INTERSECT 或 EXCEPT 運算子後面的另一個查詢表達式。兩個表達式必須包含採用相容資料類型的相同輸出資料欄數，否則就無法比較和合併這兩個結果集。集合操作不允許在不同類別的資料類型之間進行隱含轉換；如需詳細資訊，請參閱 [類型相容性與轉換](c_Supported_data_types.md#r_Type_conversion)。  
您可以建構包含無限查詢表達式數目的查詢，並將它們與 UNION、INTERSECT 和 EXCEPT 運算子的任意組合連結。例如，假設資料表 T1、T2 和 T3 包含相容的資料欄集，則以下查詢結構有效：  

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

UNION   
此集合操作會從兩個查詢表達式傳回資料列，無論資料列衍生自其中一個或兩個表達式。

INTERSECT   
此集合操作會傳回衍生自兩個查詢表達式的資料列。未由兩個表達式傳回的資料列則會遭到捨棄。

EXCEPT \$1 MINUS   
此集合操作會傳回衍生自兩個查詢表達式之一的資料列。若要限定結果，資料列必須存在第一個結果資料表中，但不能存在第二個資料表中。MINUS 和 EXCEPT 是一模一樣的同義詞。

ALL   
ALL 關鍵字會保留 UNION 所產生的任何重複資料列。未使用 ALL 關鍵字時的預設行為是捨棄這些重複項目。不支援 INTERSECT ALL、EXCEPT ALL 和 MINUS ALL。

## 集合運算子的評估順序
<a name="r_UNION-order-of-evaluation-for-set-operators"></a>

UNION 和 EXCEPT 集合運算子為左關聯。若未指定括號來影響優先順序，則會從左到右評估這些集合運算子的組合。例如，在下列查詢中，T1 和 T2 的 UNION 會先評估，然後在 UNION 結果上執行 EXCEPT 操作：

```
select * from t1
union
select * from t2
except
select * from t3
order by c1;
```

在相同查詢中使用運算子組合時，INTERSECT 運算子的優先順序高於 UNION 和 EXCEPT 運算子。例如，下列查詢會先評估 T2 和 T3 的交集，再將結果與 T1 進行聯集：

```
select * from t1
union
select * from t2
intersect
select * from t3
order by c1;
```

加入括號就可以強制執行不同的評估順序。在下列案例中，T1 和 T2 的聯集結果會與 T3 交集，而查詢可能會產生不同的結果。

```
(select * from t1
union
select * from t2)
intersect
(select * from t3)
order by c1;
```

## 使用須知
<a name="r_UNION-usage-notes"></a>
+ 集合操作查詢的結果中傳回的資料欄名稱，是來自第一個查詢表達式的資料表中的資料欄名稱 (或別名)。這些資料欄名稱可能會造成誤導，因為資料欄中的值是從任一邊集合運算子的資料表衍生，所以建議您為結果集提供有意義的別名。
+ 先於集合運算子的查詢表達式不應包含 ORDER BY 子句。只有在包含集合運算子的查詢結尾使用 ORDER BY 子句時，該子句才會產生有意義的排序結果。在此情況下，ORDER BY 子句會套用至所有集合操作的最終結果。最外層的查詢也可包含標準 LIMIT 和 OFFSET 子句。
+ 當集合運算子查詢傳回小數結果時，對應的結果資料欄就會提升，以傳回相同的精確度和小數位數。例如，在以下查詢中，T1.REVENUE 是 DECIMAL(10,2) 資料欄，而 T2.REVENUE 是 DECIMAL(8,4) 資料欄，小數結果會提升為 DECIMAL(12,4)：

  ```
  select t1.revenue union select t2.revenue;
  ```

  小數位數為 `4`，因為這是兩個資料欄的小數位數上限。精確度為 `12`，因為 T1.REVENUE 要求小數點左邊有 8 位數 (12 - 4 = 8)。此類型提升可確保 UNION 兩邊的所有值都能納入結果中。若是 64 位元值，最高結果精確度為 19，而結果小數位數上限為 18。若是 128 位元值，最高結果精確度為 38，而結果小數位數上限為 37。

  若產生的資料類型超過 Amazon Redshift 精確度和小數位數限制，查詢就會傳回錯誤。
+ 在集合操作中，若每個對應資料欄配對的這兩個資料值為*等於*或*兩者皆為 NULL*，則這兩個資料列會視為相同。例如，若資料表 T1 和 T2 都包含一個資料欄和一個資料列，而該資料列在兩個資料表中都是 NULL，則對這些資料表執行 INTERSECT 操作就會傳回該資料列。

# 範例 UNION 查詢
<a name="c_example_union_query"></a>

在下列 UNION 查詢中，SALES 資料表中的資料列會與 LISTING 資料表中的資料列合併。會從每個資料表選取三個相容的資料欄；在此情況下，對應的資料欄會有相同的名稱和資料類型。

最終結果集是依 LISTING 資料表中的第一欄排序，且限於擁有最高 LISTID 值的 5 個資料列。

```
select listid, sellerid, eventid from listing
union select listid, sellerid, eventid from sales
order by listid, sellerid, eventid desc limit 5;

listid | sellerid | eventid
--------+----------+---------
1 |    36861 |    7872
2 |    16002 |    4806
3 |    21461 |    4256
4 |     8117 |    4337
5 |     1616 |    8647
(5 rows)
```

以下範例說明如何將常值新增至 UNION 查詢的輸出，以便查看結果集中的每個資料列是由哪個查詢表達式所產生。查詢會將來自第一個查詢表達式的資料列識別為 "B" (表示買方)，來自第二個查詢表達式的資料列識別為 "S" (表示賣家)。

查詢會識別價值 10,000 USD 以上的票券交易買方和賣家。UNION 運算子任一邊的兩個查詢表達式之間唯一的差異，就是 SALES 資料表的聯結資料欄。

```
select listid, lastname, firstname, username,
pricepaid as price, 'S' as buyorsell
from sales, users
where sales.sellerid=users.userid
and pricepaid >=10000
union
select listid, lastname, firstname, username, pricepaid,
'B' as buyorsell
from sales, users
where sales.buyerid=users.userid
and pricepaid >=10000
order by 1, 2, 3, 4, 5;

listid | lastname | firstname | username |   price   | buyorsell
--------+----------+-----------+----------+-----------+-----------
209658 | Lamb     | Colette   | VOR15LYI |  10000.00 | B
209658 | West     | Kato      | ELU81XAA |  10000.00 | S
212395 | Greer    | Harlan    | GXO71KOC |  12624.00 | S
212395 | Perry    | Cora      | YWR73YNZ |  12624.00 | B
215156 | Banks    | Patrick   | ZNQ69CLT |  10000.00 | S
215156 | Hayden   | Malachi   | BBG56AKU |  10000.00 | B
(6 rows)
```

以下範例使用 UNION ALL 運算子，因為重複的資料列 (若找到) 需保留在結果中。若是特定活動 ID 系列，查詢會針對與各個活動相關聯的每筆銷售傳回 0 或更多資料列，並針對該活動的每份清單傳回 0 或 1。LISTING 和 EVENT 資料表中每個資料列的活動 ID 都是唯一的，但 SALES 資料表中相同的活動和清單 ID 組合可能會有多筆銷售。

結果集中的第三個資料欄會識別資料列的來源。若是來自 SALES 資料表，則會在 SALESROW 資料欄中標示為「Yes (是)」 (SALESROW 是 SALES.LISTID 的別名)。若資料列來自 LISTING 資料表，則會在 SALESROW 資料欄中標示為「No (否)」。

在此情況下，結果集會包含活動 7787、清單 500 的三個銷售資料列。換句話說，此清單與活動組合發生了三筆不同的交易。另外兩份清單 501 和 502 並未產生任何銷售，因此查詢針對這些清單 ID 產生的唯一資料列是來自 LISTING 資料表 (SALESROW = 'No')。

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

若您執行相同查詢，但未使用 ALL 關鍵字，結果只會保留其中一項銷售交易。

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# 範例 UNION ALL 查詢
<a name="c_example_unionall_query"></a>

以下範例使用 UNION ALL 運算子，因為重複的資料列 (若找到) 需保留在結果中。若是特定活動 ID 系列，查詢會針對與各個活動相關聯的每筆銷售傳回 0 或更多資料列，並針對該活動的每份清單傳回 0 或 1。LISTING 和 EVENT 資料表中每個資料列的活動 ID 都是唯一的，但 SALES 資料表中相同的活動和清單 ID 組合可能會有多筆銷售。

結果集中的第三個資料欄會識別資料列的來源。若是來自 SALES 資料表，則會在 SALESROW 資料欄中標示為「Yes (是)」 (SALESROW 是 SALES.LISTID 的別名)。若資料列來自 LISTING 資料表，則會在 SALESROW 資料欄中標示為「No (否)」。

在此情況下，結果集會包含活動 7787、清單 500 的三個銷售資料列。換句話說，此清單與活動組合發生了三筆不同的交易。另外兩份清單 501 和 502 並未產生任何銷售，因此查詢針對這些清單 ID 產生的唯一資料列是來自 LISTING 資料表 (SALESROW = 'No')。

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union all
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
7787 |    500 | Yes
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(6 rows)
```

若您執行相同查詢，但未使用 ALL 關鍵字，結果只會保留其中一項銷售交易。

```
select eventid, listid, 'Yes' as salesrow
from sales
where listid in(500,501,502)
union
select eventid, listid, 'No'
from listing
where listid in(500,501,502)
order by listid asc;

eventid | listid | salesrow
---------+--------+----------
7787 |    500 | No
7787 |    500 | Yes
6473 |    501 | No
5108 |    502 | No
(4 rows)
```

# 範例 INTERSECT 查詢
<a name="c_example_intersect_query"></a>

比較下列範例與第一個 UNION 範例。這兩個範例的唯一差異在於使用的集合運算子，但結果非常不同。只有其中一個資料列相同：

```
235494 |    23875 |    8771
```

 這是在限制的 5 個資料列結果中，唯一同時存在兩個資料表中的資料列。

```
select listid, sellerid, eventid from listing
intersect
select listid, sellerid, eventid from sales
order by listid desc, sellerid, eventid
limit 5;

listid | sellerid | eventid
--------+----------+---------
235494 |    23875 |    8771
235482 |     1067 |    2667
235479 |     1589 |    7303
235476 |    15550 |     793
235475 |    22306 |    7848
(5 rows)
```

以下查詢會尋找三月份同時於紐約市和洛杉磯的場館舉行的活動 (有售票)。兩個查詢表達式之間唯一的差異就是 VENUECITY 資料欄的限制條件。

```
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='Los Angeles'
intersect
select distinct eventname from event, sales, venue
where event.eventid=sales.eventid and event.venueid=venue.venueid
and date_part(month,starttime)=3 and venuecity='New York City'
order by eventname asc;

eventname
----------------------------
A Streetcar Named Desire
Dirty Dancing
Electra
Running with Annalise
Hairspray
Mary Poppins
November
Oliver!
Return To Forever
Rhinoceros
South Pacific
The 39 Steps
The Bacchae
The Caucasian Chalk Circle
The Country Girl
Wicked
Woyzeck
(16 rows)
```

# 範例 EXCEPT 查詢
<a name="c_Example_MINUS_query"></a>

TICKIT 資料庫中的 CATEGORY 資料表包含以下 11 個資料列：

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
   1   | Sports   | MLB       | Major League Baseball
   2   | Sports   | NHL       | National Hockey League
   3   | Sports   | NFL       | National Football League
   4   | Sports   | NBA       | National Basketball Association
   5   | Sports   | MLS       | Major League Soccer
   6   | Shows    | Musicals  | Musical theatre
   7   | Shows    | Plays     | All non-musical theatre
   8   | Shows    | Opera     | All opera and light opera
   9   | Concerts | Pop       | All rock and pop music concerts
  10   | Concerts | Jazz      | All jazz singers and bands
  11   | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

假設 CATEGORY\$1STAGE 資料表 (臨時資料表) 包含一個額外的資料列：

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
1 | Sports   | MLB       | Major League Baseball
2 | Sports   | NHL       | National Hockey League
3 | Sports   | NFL       | National Football League
4 | Sports   | NBA       | National Basketball Association
5 | Sports   | MLS       | Major League Soccer
6 | Shows    | Musicals  | Musical theatre
7 | Shows    | Plays     | All non-musical theatre
8 | Shows    | Opera     | All opera and light opera
9 | Concerts | Pop       | All rock and pop music concerts
10 | Concerts | Jazz      | All jazz singers and bands
11 | Concerts | Classical | All symphony, concerto, and choir concerts
12 | Concerts | Comedy    | All stand up comedy performances
(12 rows)
```

傳回兩個資料表之間的差異。換句話說，會傳回 CATEGORY\$1STAGE 資料表而非 CATEGORY 資料表中的資料列：

```
select * from category_stage
except
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

以下對等查詢使用同義詞 MINUS。

```
select * from category_stage
minus
select * from category;

catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
12 | Concerts | Comedy  | All stand up comedy performances
(1 row)
```

若您將 SELECT 表達式的順序反轉，則查詢不會傳回任何資料列。

# ORDER BY 子句
<a name="r_ORDER_BY_clause"></a>

**Topics**
+ [語法](#r_ORDER_BY_clause-synopsis)
+ [Parameters](#r_ORDER_BY_clause-parameters)
+ [使用須知](#r_ORDER_BY_usage_notes)
+ [ORDER BY 的範例](r_Examples_with_ORDER_BY.md)

ORDER BY 子句會排序查詢的結果集。

## 語法
<a name="r_ORDER_BY_clause-synopsis"></a>

```
[ ORDER BY expression [ ASC | DESC ] ]
[ NULLS FIRST | NULLS LAST ]
[ LIMIT { count | ALL } ]
[ OFFSET start ]
```

## Parameters
<a name="r_ORDER_BY_clause-parameters"></a>

 *表達式*   
此表達式會排序查詢結果集的順序，通常是藉由指定選取清單中的一個或多個資料欄。結果會根據二進位 UTF-8 順序傳回。您還可以指定下列項目：  
+ 不在選取清單中的資料欄
+ 由查詢所參考資料表中的一個或多個資料欄構成的表達式
+ 代表選取清單項目位置的序數 (或是，若沒有選取清單的話，則為資料欄在資料表中的位置)
+ 定義選取清單項目的別名
當 ORDER BY 子句包含多個表達式時，結果集會根據第一個表達式排序，然後對擁有與第一個表達式相符之值的資料列套用第二個表達式，以此類推。

ASC \$1 DESC   
此選項會定義表達式的排序順序，如下所示：  
+ ASC：遞增 (例如，數值從低到高，字元字串 'A' 到 'Z')。若未指定選項，資料會預設為遞增排序。
+ DESC：遞減 (數值從高到低，字串 'Z' 到 'A')。

NULLS FIRST \$1 NULLS LAST  
這些選項指定 NULL 值應該排序在最前 (在非 null 值之前) 或排序在最後 (在非 null 值之後)。根據預設，依 ASC 順序排序時，NULL 值排在最後面，而依 DESC 順序排序時，則排在最前面。

LIMIT *number* \$1 ALL   <a name="order-by-clause-limit"></a>
此選項會控制查詢傳回的排序資料列數。LIMIT 數字必須是正整數；最大值為 `2147483647`。  
LIMIT 0 不會傳回任何資料列。您可以使用此語法進行測試：查看查詢執行情形 (不顯示任何資料列)，或從資料表傳回資料欄清單。若您使用 LIMIT 0 傳回資料欄清單，則 ORDER BY 子句是多餘的。預設值為 LIMIT ALL。

OFFSET *start*   <a name="order-by-clause-offset"></a>
此選項會指定先略過 *start* 之前的資料列數，再開始傳回資料列。OFFSET 數字必須是正整數；最大值為 `2147483647`。搭配 LIMIT 選項使用時，會先略過 OFFSET 資料列，再開始計算傳回的 LIMIT 資料列。如果未使用 LIMIT 選項，則結果集中的資料列數會減掉略過的資料列數。OFFSET 子句略過的資料列仍須經過掃描，因此使用較大的 OFFSET 值可能會導致效率不佳。

## 使用須知
<a name="r_ORDER_BY_usage_notes"></a>

 請注意以下使用 ORDER BY 子句的預期行為：
+ NULL 值會視為「高於」所有其他值。使用預設的遞增排序順序時，NULL 值會排列在最後面。若要變更此行為，請使用 NULLS FIRST 選項。
+ 若查詢未包含 ORDER BY 子句，系統傳回的結果集當中就不會有可預測的資料列排列順序。執行相同的查詢兩次，可能會傳回依不同順序排列的結果集。
+ LIMIT 和 OFFSET 選項可在沒有 ORDER BY 子句的情況下使用；不過，若要傳回一致的資料列集，請使用這些選項搭配 ORDER BY。
+ 在任何平行系統中，例如 Amazon Redshift，當 ORDER BY 子句無法產生唯一排列順序時，資料列的順序便會不確定。也就是說，如果 ORDER BY 表達式產生重複的值，則這些資料列的傳回順序可能與其他系統不同，也可能隨著每次執行 Amazon Redshift 而有所不同。
+ Amazon Redshift 不支援 ORDER BY 子句中的字符文字。

# ORDER BY 的範例
<a name="r_Examples_with_ORDER_BY"></a>

從 CATEGORY 資料表傳回全部 11 列，並依第二個資料欄 CATGROUP 排序。若結果擁有相同的 CATGROUP 值，則依字元字串的長度排列 CATDESC 資料欄的值。然後，依 CATID 和 CATNAME 欄排序。

```
select * from category order by 2, length(catdesc), 1, 3;

catid | catgroup |  catname  |                  catdesc
------+----------+-----------+----------------------------------------
10    | Concerts | Jazz      | All jazz singers and bands
9     | Concerts | Pop       | All rock and pop music concerts
11    | Concerts | Classical | All symphony, concerto, and choir conce
6     | Shows    | Musicals  | Musical theatre
7     | Shows    | Plays     | All non-musical theatre
8     | Shows    | Opera     | All opera and light opera
5     | Sports   | MLS       | Major League Soccer
1     | Sports   | MLB       | Major League Baseball
2     | Sports   | NHL       | National Hockey League
3     | Sports   | NFL       | National Football League
4     | Sports   | NBA       | National Basketball Association
(11 rows)
```

從 SALES 資料表傳回選取的欄，並依最高 QTYSOLD 值排序。將結果限制為前 10 個資料列：

```
select salesid, qtysold, pricepaid, commission, saletime from sales
order by qtysold, pricepaid, commission, salesid, saletime desc
limit 10;

salesid | qtysold | pricepaid | commission |      saletime
--------+---------+-----------+------------+---------------------
15401   |       8 |    272.00 |      40.80 | 2008-03-18 06:54:56
61683   |       8 |    296.00 |      44.40 | 2008-11-26 04:00:23
90528   |       8 |    328.00 |      49.20 | 2008-06-11 02:38:09
74549   |       8 |    336.00 |      50.40 | 2008-01-19 12:01:21
130232  |       8 |    352.00 |      52.80 | 2008-05-02 05:52:31
55243   |       8 |    384.00 |      57.60 | 2008-07-12 02:19:53
16004   |       8 |    440.00 |      66.00 | 2008-11-04 07:22:31
489     |       8 |    496.00 |      74.40 | 2008-08-03 05:48:55
4197    |       8 |    512.00 |      76.80 | 2008-03-23 11:35:33
16929   |       8 |    568.00 |      85.20 | 2008-12-19 02:59:33
(10 rows)
```

使用 LIMIT 0 語法會傳回一份資料欄清單，但沒有資料列：

```
select * from venue limit 0;
venueid | venuename | venuecity | venuestate | venueseats
---------+-----------+-----------+------------+------------
(0 rows)
```

# CONNECT BY 子句
<a name="r_CONNECT_BY_clause"></a>

CONNECT BY 子句會指定階層中資料列之間的關係。您可以使用 CONNECT BY，透過將資料表聯結至自身並處理階層式資料，以階層順序選取資料列。例如，您可以使用它來遞迴循環組織結構圖和列出資料。

階層式查詢會以下列順序處理：

1. 如果 FROM 子句具有聯結，則會先處理它。

1. CONNECT BY 子句會受到評估。

1. WHERE 子句會受到評估。

## 語法
<a name="r_CONNECT_BY_clause-synopsis"></a>

```
[START WITH start_with_conditions]
CONNECT BY connect_by_conditions
```

**注意**  
雖然 START 和 CONNECT 不是保留字，但如果您在查詢中使用 START 和 CONNECT 做為資料表別名，請使用分隔識別碼 (雙引號) 或 AS，以避免在執行階段失敗。

```
SELECT COUNT(*)
FROM Employee "start"
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

```
SELECT COUNT(*)
FROM Employee AS start
CONNECT BY PRIOR id = manager_id
START WITH name = 'John'
```

## Parameters
<a name="r_CONNECT_BY_parameters"></a>

 *start\$1with\$1conditions*   
指定階層根資料列的條件

 *connect\$1by\$1conditions*   
指定階層父項資料列與子資料列之間關係的條件。至少有一個條件必須使用用來參照父資料列的 ` ` 一元運算子來限定。  

```
PRIOR column = expression
-- or
expression > PRIOR column
```

## 運算子
<a name="r_CONNECT_BY_operators"></a>

您可以在 CONNECT BY 查詢中使用以下運算子。

 *LEVEL*   
傳回階層中目前資料列層級的虛擬資料欄。針對根資料列傳回 1，針對根資料列的子項傳回 2，依此類推。

 *PRIOR*   
一元運算子，用於評估階層中目前資料列之父資料列的運算式。

## 範例
<a name="r_CONNECT_BY_example"></a>

下列範例是 CONNECT BY 查詢，此查詢會傳回直接或間接向 John 報告的員工人數，不超過 4 個層級。

```
SELECT id, name, manager_id
FROM employee
WHERE LEVEL < 4
START WITH name = 'John'
CONNECT BY PRIOR id = manager_id;
```

以下為查詢結果。

```
id      name      manager_id
------+----------+--------------
  101     John        100
  102     Jorge       101
  103     Kwaku       101
  110     Liu         101
  201     Sofía       102
  106     Mateo       102
  110     Nikki       103
  104     Paulo       103
  105     Richard     103
  120     Saanvi      104
  200     Shirley     104
  205     Zhang       104
```

 此範例的資料表定義：

```
CREATE TABLE employee (
   id INT,
   name VARCHAR(20),
   manager_id INT
   );
```

 以下是插入到資料表中的資料列。

```
INSERT INTO employee(id, name, manager_id)  VALUES
(100, 'Carlos', null),
(101, 'John', 100),
(102, 'Jorge', 101),
(103, 'Kwaku', 101),
(110, 'Liu', 101),
(106, 'Mateo', 102),
(110, 'Nikki', 103),
(104, 'Paulo', 103),
(105, 'Richard', 103),
(120, 'Saanvi', 104),
(200, 'Shirley', 104),
(201, 'Sofía', 102),
(205, 'Zhang', 104);
```

以下是 John 的部門組織結構圖。

![\[John 的部門組織結構圖。\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/images/org-chart.png)


# 子查詢範例
<a name="r_Subquery_examples"></a>

下列範例顯示將子查詢納入 SELECT 查詢的不同方式。請參閱 [JOIN 範例](r_Join_examples.md)，了解另一個使用子查詢的範例。

## SELECT 清單子查詢
<a name="r_Subquery_examples-select-list-subquery"></a>

以下範例包含 SELECT 清單中的子查詢。此子查詢為*純量*：它只會傳回一個資料欄和一個值，該值會在從外部查詢傳回的每個資料列的結果中重複出現。查詢會比較子查詢運算的 Q1SALES 值與 2008 年另兩季 (2 和 3) 的銷售數字，如外部查詢所定義。

```
select qtr, sum(pricepaid) as qtrsales,
(select sum(pricepaid)
from sales join date on sales.dateid=date.dateid
where qtr='1' and year=2008) as q1sales
from sales join date on sales.dateid=date.dateid
where qtr in('2','3') and year=2008
group by qtr
order by qtr;

qtr  |  qtrsales   |   q1sales
-------+-------------+-------------
2     | 30560050.00 | 24742065.00
3     | 31170237.00 | 24742065.00
(2 rows)
```

## WHERE 子句子查詢
<a name="r_Subquery_examples-where-clause-subquery"></a>

以下範例包含 WHERE 子句中的資料表子查詢。此子查詢會產生多個資料列。在此情況下，資料列只會包含一個資料欄，但資料表子查詢可包含多個資料欄和資料列，就像任何其他資料表一樣。

查詢會尋找票券銷售量最高的前 10 名賣家。前 10 名清單受到子查詢的限制，會移除居住在有售票場地之城市的使用者。此查詢可透過不同的方式撰寫；例如，子查詢可重寫為主查詢內的聯結。

```
select firstname, lastname, city, max(qtysold) as maxsold
from users join sales on users.userid=sales.sellerid
where users.city not in(select venuecity from venue)
group by firstname, lastname, city
order by maxsold desc, city desc
limit 10;

firstname | lastname  |      city      | maxsold
-----------+-----------+----------------+---------
Noah       | Guerrero | Worcester      |       8
Isadora    | Moss     | Winooski       |       8
Kieran     | Harrison | Westminster    |       8
Heidi      | Davis    | Warwick        |       8
Sara       | Anthony  | Waco           |       8
Bree       | Buck     | Valdez         |       8
Evangeline | Sampson  | Trenton        |       8
Kendall    | Keith    | Stillwater     |       8
Bertha     | Bishop   | Stevens Point  |       8
Patricia   | Anderson | South Portland |       8
(10 rows)
```

## WITH 子句子查詢
<a name="r_Subquery_examples-with-clause-subqueries"></a>

請參閱 [WITH 子句](r_WITH_clause.md)。

# 相互關聯子查詢
<a name="r_correlated_subqueries"></a>

以下範例包含 WHERE 子句中的*相互關聯子查詢*；這類子查詢的資料欄與外部查詢產生的資料欄之間包含一項或多項相互關聯。在此情況下，相互關聯為 `where s.listid=l.listid`。針對外部查詢產生的每個資料列，子查詢會執行以限定或取消限定資料列。

```
select salesid, listid, sum(pricepaid) from sales s
where qtysold=
(select max(numtickets) from listing l
where s.listid=l.listid)
group by 1,2
order by 1,2
limit 5;

salesid | listid |   sum
--------+--------+----------
 27     |     28 | 111.00
 81     |    103 | 181.00
 142    |    149 | 240.00
 146    |    152 | 231.00
 194    |    210 | 144.00
(5 rows)
```

## 不支援的相互關聯子查詢模式
<a name="r_correlated_subqueries-correlated-subquery-patterns-that-are-not-supported"></a>

查詢規劃器會使用一種查詢重寫方法，稱為子查詢解除相互關聯，在 MPP 環境中最佳化數種相互關聯子查詢模式以供執行。有幾種類型的相互關聯子查詢採用了 Amazon Redshift 無法解除相互關聯也不支援的模式。包含下列相互關聯參考的查詢會傳回錯誤：
+  略過查詢區塊的相互關聯參考，也稱為「略過層級相互關聯參考」。例如，在下列查詢中，包含相互關聯參考的區塊和略過的區塊會以 NOT EXISTS 述詞連接：

  ```
  select event.eventname from event
  where not exists
  (select * from listing
  where not exists
  (select * from sales where event.eventid=sales.eventid));
  ```

  在此案例中略過的區塊是對 LISTING 資料表的子查詢。相互關聯參考會將 EVENT 和 SALES 資料表相互關聯。
+  來自子查詢的相互關聯參考，它是外部查詢中 ON 子句的一部分：

  ```
  select * from category
  left join event
  on category.catid=event.catid and eventid =
  (select max(eventid) from sales where sales.eventid=event.eventid);
  ```

  ON 子句包含從子查詢中 SALES 對外部查詢中 EVENT 的相互關聯參考。
+ Null 敏感的相互關聯會參考 Amazon Redshift 系統資料表。例如：

  ```
  select attrelid
  from stv_locks sl, pg_attribute
  where sl.table_id=pg_attribute.attrelid and 1 not in
  (select 1 from pg_opclass where sl.lock_owner = opcowner);
  ```
+ 來自子查詢內的相互關聯參考，當中包含視窗函數。

  ```
  select listid, qtysold
  from sales s
  where qtysold not in
  (select sum(numtickets) over() from listing l where s.listid=l.listid);
  ```
+ GROUP BY 資料欄中對相互關聯子查詢結果的參考。例如：

  ```
  select listing.listid,
  (select count (sales.listid) from sales where sales.listid=listing.listid) as list
  from listing
  group by list, listing.listid;
  ```
+ 子查詢中使用彙整函數和 GROUP BY 子句的相互關聯參考，會透過 IN 述詞連接至外部查詢。(此限制不會套用至 MIN 和 MAX 彙整函數)。例如：

  ```
  select * from listing where listid in
  (select sum(qtysold)
  from sales
  where numtickets>4
  group by salesid);
  ```

# SELECT INTO
<a name="r_SELECT_INTO"></a>

選取任何查詢所定義的資料列，然後將它們插入新的資料表中。您可以指定是否建立臨時或永久資料表。

## 語法
<a name="r_SELECT_INTO-synopsis"></a>

```
[ WITH with_subquery [, ...] ]
SELECT
[ TOP number | [ ALL | DISTINCT ]
* | expression [ AS output_name ] [, ...] ]
[ EXCLUDE column_list ]
INTO [ TEMPORARY | TEMP ] [ TABLE ] new_table
[ FROM table_reference [, ...] ]
[ WHERE condition ]
[ [ START WITH expression ] CONNECT BY expression ]
[ GROUP BY ALL | expression [, ...] ]
[ HAVING condition ]
[ QUALIFY condition ]
[ { UNION | ALL | INTERSECT | EXCEPT | MINUS } query ]
[ ORDER BY expression [ ASC | DESC ] ]
[ LIMIT { number | ALL } ]
[ OFFSET start ]
```

 如需有關此命令之參數的詳細資訊，請參閱 [SELECT](r_SELECT_synopsis.md)。

## 範例
<a name="r_SELECT_INTO-examples"></a>

從 EVENT 資料表選取所有資料列，並建立 NEWEVENT 資料表：

```
select * into newevent from event;
```

將彙整查詢的結果選入名為 PROFITS 的臨時資料表中：

```
select username, lastname, sum(pricepaid-commission) as profit
into temp table profits
from sales, users
where sales.sellerid=users.userid
group by 1, 2
order by 3 desc;
```

# SET
<a name="r_SET"></a>

設定伺服器組態參數的值。使用 SET 命令，僅覆寫目前工作階段持續時間的設定。

使用 [RESET](r_RESET.md) 命令將參數恢復為其預設值。

您可以採用數種方式來變更伺服器組態參數。如需詳細資訊，請參閱[修改伺服器組態](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings)。

## 語法
<a name="r_SET-synopsis"></a>

```
SET { [ SESSION | LOCAL ]
{ SEED | parameter_name } { TO | = }
{ value | 'value' | DEFAULT } |
SEED TO value }
```

以下陳述式會設定工作階段內容變數的值。

```
SET { [ SESSION | LOCAL ]
variable_name { TO | = }
{ value | 'value'  }
```

## Parameters
<a name="r_SET-parameters"></a>

SESSION   
指出目前工作階段的設定有效。預設值.

*variable\$1name*   
指定為工作階段設定的內容變數名稱。  
命名慣例是由點分隔的兩部分名稱，例如 *identifier.identifier*。只允許使用一個點分隔符號。使用符合 Amazon Redshift 標準識別碼規則的 *identifier*，如需詳細資訊，請參閱 [名稱與識別碼](r_names.md)。不允許使用分隔的識別碼。

LOCAL   
指出目前交易的設定有效。

SEED TO *value*   
設定 RANDOM 函數產生亂數時要使用的內部種子。  
SET SEED 會採用介於 0 和 1 之間的數*值*，並將此數字乘以 (231-1) 以搭配 [RANDOM 函數](r_RANDOM.md) 函數使用。若您在進行多次 RANDOM 呼叫之前使用 SET SEED，RANDOM 就會依可預測的順序產生數字。

 *parameter\$1name*   
要設定的參數名稱。如需參數的詳細資訊，請參閱 [修改伺服器組態](cm_chap_ConfigurationRef.md#t_Modifying_the_default_settings)。

 *value*   
新參數值。使用單引號將值設定為特定字串。若使用 SET SEED，此參數會包含 SEED 值。

DEFAULT   
將參數設定為預設值。

## 範例
<a name="r_SET-examples"></a>

 **變更目前工作階段的參數** 

下列範例會設定 datestyle：

```
set datestyle to 'SQL,DMY';
```

 **設定查詢群組以進行工作負載管理** 

若查詢群組在佇列定義中列為叢集 WLM 組態的一部分，您就可以對列出的查詢群組名稱設定 QUERY\$1GROUP 參數。後續查詢會指派至相關聯的查詢佇列。QUERY\$1GROUP 設定在工作階段期間仍然有效，或直到遇到 RESET QUERY\$1GROUP 命令為止。

此範例會在查詢群組 'priority' 中執行兩個查詢，然後重設查詢群組。

```
set query_group to 'priority';
select tbl, count(*)from stv_blocklist;
select query, elapsed, substring from svl_qlog order by query desc limit 5;
reset query_group;
```

如需詳細資訊，請參閱[工作負載管理](cm-c-implementing-workload-management.md)。

 **變更工作階段的預設身分命名空間** 

資料庫使用者可以設定 `default_identity_namespace`。此範例示範如何使用 `SET SESSION` 覆寫目前工作階段期間的設定，然後顯示新的身分提供者值。這在您搭配 Redshift 和 IAM Identity Center 使用身分提供者時最常用。如需搭配 Redshift 使用 IAM Identity Center 的詳細資訊，請參閱[將 Redshift 與 IAM Identity Center 連線，為使用者提供單一登入體驗](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)。

```
SET SESSION default_identity_namespace = 'MYCO';
         
SHOW default_identity_namespace;
```

執行命令後，您可以執行 GRANT 陳述式或 CREATE 陳述式，如下所示：

```
GRANT SELECT ON TABLE mytable TO alice;

GRANT UPDATE ON TABLE mytable TO salesrole;
         
CREATE USER bob password 'md50c983d1a624280812631c5389e60d48c';
```

在此執行個體中，設定預設身分命名空間的效果等同於在每個身分前面加上命名空間。在此範例中，`alice` 會取代為 `MYCO:alice`。如需與使用 IAM Identity Center 的 Redshift 組態相關設定的詳細資訊，請參閱 [ALTER SYSTEM](r_ALTER_SYSTEM.md) 和 [ALTER IDENTITY PROVIDER](r_ALTER_IDENTITY_PROVIDER.md)。

 **設定查詢群組的標籤** 

QUERY\$1GROUP 參數會為一個或多個在相同工作階段中的 SET 命令後面執行的查詢定義標籤。接著此標籤會在查詢執行時記錄，並且可用來限制從 STL\$1QUERY 和 STV\$1INFLIGHT 系統資料表以及 SVL\$1QLOG 檢視傳回的結果。

```
show query_group;
query_group
-------------
unset
(1 row)

set query_group to '6 p.m.';


show query_group;
query_group
-------------
6 p.m.
(1 row)

select * from sales where salesid=500;
salesid | listid | sellerid | buyerid | eventid | dateid | ...
---------+--------+----------+---------+---------+--------+-----
500 |    504 |     3858 |    2123 |    5871 |   2052 | ...
(1 row)

reset query_group;

select query, trim(label) querygroup, pid, trim(querytxt) sql
from stl_query
where label ='6 p.m.';
query | querygroup |  pid  |                  sql
-------+------------+-------+----------------------------------------
57 | 6 p.m.     | 30711 | select * from sales where salesid=500;
(1 row)
```

查詢群組標籤是實用的機制，方便用來隔離指令碼中執行的個別查詢或查詢群組。您不需要依 ID 識別和追蹤查詢；可依其標籤進行追蹤。

 **設定產生亂數的 Seed 值** 

以下範例會使用 SEED 選項搭配 SET，讓 RANDOM 函數依可預測的順序產生數字。

首先傳回三個 RANDOM 整數，但不先設定 SEED 值：

```
select cast (random() * 100 as int);
int4
------
6
(1 row)

select cast (random() * 100 as int);
int4
------
68
(1 row)

select cast (random() * 100 as int);
int4
------
56
(1 row)
```

現在，將 SEED 值設為 `.25`，並傳回三個以上的 RANDOM 數字：

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

最後，將 SEED 值重設為 `.25`，並驗證 RANDOM 是否傳回與前三個呼叫相同的結果：

```
set seed to .25;

select cast (random() * 100 as int);
int4
------
21
(1 row)

select cast (random() * 100 as int);
int4
------
79
(1 row)

select cast (random() * 100 as int);
int4
------
12
(1 row)
```

以下範例會設定自訂內容變數。

```
SET app_context.user_id TO 123;
SET app_context.user_id TO 'sample_variable_value';
```

# SET SESSION AUTHORIZATION
<a name="r_SET_SESSION_AUTHORIZATION"></a>

設定目前工作階段的使用者名稱。

例如，您可以使用 SET SESSION AUTHORIZATION 命令，以未經授權使用者的身分暫時執行工作階段或交易來測試資料庫存取。您必須是資料庫超級使用者才能執行此命令。

## 語法
<a name="r_SET_SESSION_AUTHORIZATION-synopsis"></a>

```
SET [ LOCAL ] SESSION AUTHORIZATION { user_name | DEFAULT }
```

## Parameters
<a name="r_SET_SESSION_AUTHORIZATION-parameters"></a>

LOCAL  
指出目前交易的設定有效。省略此參數會指出目前工作階段的設定有效。

 *user\$1name*   
要設定的使用者名稱。使用者名稱可做為識別碼或字串常值寫入。

DEFAULT  
將工作階段使用者名稱設為預設值。

## 範例
<a name="r_SET_SESSION_AUTHORIZATION-examples"></a>

以下範例會將目前工作階段的使用者名稱設為 `dwuser`：

```
SET SESSION AUTHORIZATION 'dwuser';
```

以下範例會將目前交易的使用者名稱設為 `dwuser`：

```
SET LOCAL SESSION AUTHORIZATION 'dwuser';
```

此範例會將目前工作階段的使用者名稱設為預設使用者名稱：

```
SET SESSION AUTHORIZATION DEFAULT;
```

# SET SESSION CHARACTERISTICS
<a name="r_SET_SESSION_CHARACTERISTICS"></a>

此命令已棄用。

# SHOW
<a name="r_SHOW"></a>

顯示伺服器組態參數的目前值。若 SET 命令有效，此值可為目前工作階段專用。如需組態參數的清單，請參閱 [組態參考](cm_chap_ConfigurationRef.md)。

## 語法
<a name="r_SHOW-synopsis"></a>

```
SHOW { parameter_name | ALL }
```

以下陳述式會顯示工作階段內容變數的目前值。如果該變數不存在，Amazon Redshift 會擲回錯誤。

```
SHOW variable_name
```

## Parameters
<a name="r_SHOW-parameters"></a>

 *parameter\$1name*   
顯示指定之參數的目前值。

ALL   
顯示所有參數的目前值。

*variable\$1name*   
顯示指定變數的目前值。

## 範例
<a name="r_SHOW-examples"></a>

以下範例會顯示 query\$1group 參數的值：

```
show query_group;

query_group

unset
(1 row)
```

以下範例會顯示所有參數與其值的清單：

```
show all;
name        |   setting
--------------------+--------------
datestyle          | ISO, MDY
extra_float_digits | 0
query_group        | unset
search_path        | $user,public
statement_timeout  | 0
```

下列範例會顯示指定變數的目前值。

```
SHOW app_context.user_id;
```

# 顯示資料欄授予
<a name="r_SHOW_COLUMN_GRANTS"></a>

在資料表中的資料欄上顯示授予。

## 所需的許可
<a name="r_SHOW_COLUMN_GRANTS-required-permissions"></a>

目標物件的 SHOW GRANTS 只會顯示目前使用者可見的授予。如果目前使用者滿足下列其中一項條件，則目前使用者可以看到授予：
+ 成為超級使用者
+ 成為授予的使用者
+ 獲得授予角色的擁有者
+ 獲得物件授予的目標角色

## 語法
<a name="r_SHOW_COLUMN_GRANTS-synopsis"></a>

```
SHOW COLUMN GRANTS ON TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_COLUMN_GRANTS-parameters"></a>

database\$1name  
包含目標資料表的資料庫名稱

schema\$1name  
包含目標資料表的結構描述名稱

table\$1name  
目標資料表的名稱

使用者名稱  
僅包含對輸出中使用者名稱的授予

role\$1name  
輸出中僅包含對 role\$1name 的授予

PUBLIC  
輸出中僅包含對 PUBLIC 的授予

row\$1limit  
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_COLUMN_GRANTS-examples"></a>

下列範例顯示資料表 demo\$1db.demo\$1schema.t100 上的資料欄授權：

```
SHOW COLUMN GRANTS ON TABLE demo_db.demo_schema.t100;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         134 | bob           | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | SELECT         |         130 | alice         | user          | f            | COLUMN          | dbadmin
 demo_db       | demo_schema | t100       | a           | COLUMN      | UPDATE         |         130 | alice         | user          | f            | COLUMN          | dbadmin
```

下列範例顯示使用者 bob 資料表 demo\$1schema.t100 上的資料欄授權：

```
SHOW COLUMN GRANTS ON TABLE demo_schema.t100 for bob;
 database_name | schema_name | table_name | column_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+-------------+------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | demo_schema | t100       | b           | COLUMN      | UPDATE         |         135 | bob           | user          | f            | COLUMN          | dbadmin
```

# SHOW COLUMNS
<a name="r_SHOW_COLUMNS"></a>

顯示資料表中的資料欄清單，以及某些資料欄屬性。

每個輸出列都包含以逗號分隔的資料庫名稱、結構描述名稱、資料表名稱、資料欄名稱、順序位置、資料欄預設值、為 nullable、資料類型、字元長度上限、數值精確度、備註、排序索引鍵類型、排序索引鍵順序、分佈索引鍵、編碼和定序。如需這些屬性的相關資訊，請參閱 [SVV\$1ALL\$1COLUMNS](r_SVV_ALL_COLUMNS.md)。

如果 SHOW COLUMNS 命令所產生的資料欄超過 10,000 個，則會傳回錯誤。

## 所需的許可
<a name="r_SHOW_COLUMNS-privileges"></a>

若要檢視 Amazon Redshift 資料表中的欄，目前使用者必須符合下列其中一項條件：
+ 身為超級使用者。
+ 是資料表的擁有者。
+ 在上層結構描述上具備 USAGE 權限，以及在資料表上具備 SELECT 權限，或在欄上具備 SELECT 權限。

## 語法
<a name="r_SHOW_COLUMNS-synopsis"></a>

```
SHOW COLUMNS FROM TABLE database_name.schema_name.table_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_COLUMNS-parameters"></a>

 *database\$1name*   
包含所要列出資料表的資料庫名稱。  
若要在 中顯示資料表 AWS Glue Data Catalog，請指定 (`awsdatacatalog`) 做為資料庫名稱，並確保系統組態`data_catalog_auto_mount`設定為 `true`。如需詳細資訊，請參閱[ALTER SYSTEM](r_ALTER_SYSTEM.md)。

 *schema\$1name*   
包含所要列出資料表的結構描述名稱。  
若要顯示 AWS Glue Data Catalog 資料表，請提供 AWS Glue 資料庫名稱做為結構描述名稱。

 *table\$1name*   
包含所要列出資料欄的資料表名稱。

 *filter\$1pattern*   
有效的 UTF-8 字元運算式，包含要比對資料表名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_COLUMNS.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。

 *row\$1limit*   
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_COLUMNS-examples"></a>

下列範例顯示 Amazon Redshift 資料庫中名為 `sample_data_dev` 且在結構描述 `tickit` 和資料表 `event` 中的資料欄。

```
SHOW COLUMNS FROM TABLE demo_schema.compound_sort_table;

  database_name | schema_name |     table_name      | column_name | ordinal_position | column_default | is_nullable |     data_type     | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+---------------------+-------------+------------------+----------------+-------------+-------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 demo_db       | demo_schema | compound_sort_table | id          |                1 |                | YES         | integer           |                          |                32 |             0 |         | COMPOUND      |        1 |        1 | delta32k | 
 demo_db       | demo_schema | compound_sort_table | name        |                2 |                | YES         | character varying |                       50 |                   |               |         | COMPOUND      |        2 |          | lzo      | default
 demo_db       | demo_schema | compound_sort_table | date_col    |                3 |                | YES         | date              |                          |                   |               |         |               |        0 |          | delta    | 
 demo_db       | demo_schema | compound_sort_table | amount      |                4 |                | YES         | numeric           |                          |                10 |             2 |         |               |        0 |          | mostly16 |
```

以下範例顯示名為 的 AWS Glue Data Catalog 資料庫中`awsdatacatalog`位於結構描述 `batman`和資料表 中的資料表`nation`。輸出限制為 `2` 個資料列。

```
SHOW COLUMNS FROM TABLE second_db.public.t22;

 database_name | schema_name | table_name | column_name | ordinal_position | column_default | is_nullable |          data_type          | character_maximum_length | numeric_precision | numeric_scale | remarks | sort_key_type | sort_key | dist_key | encoding | collation 
---------------+-------------+------------+-------------+------------------+----------------+-------------+-----------------------------+--------------------------+-------------------+---------------+---------+---------------+----------+----------+----------+-----------
 second_db     | public      | t22        | col1        |                1 |                | YES         | integer                     |                          |                32 |             0 |         | INTERLEAVED   |       -1 |          | mostly8  | 
 second_db     | public      | t22        | col2        |                2 |                | YES         | character varying           |                      100 |                   |               |         | INTERLEAVED   |        2 |          | text255  | default
 second_db     | public      | t22        | col3        |                3 |                | YES         | timestamp without time zone |                          |                   |               |         |               |        0 |          | raw      | 
 second_db     | public      | t22        | col4        |                4 |                | YES         | numeric                     |                          |                10 |             2 |         |               |        0 |          | az64     |
```

# 顯示限制
<a name="r_SHOW_CONSTRAINTS"></a>

顯示資料表中主索引鍵和外部索引鍵限制條件的清單。

## 所需的許可
<a name="r_SHOW_CONSTRAINTS-required-permissions"></a>

若要在資料表上執行 SHOW CONSTRAINTS，目前的使用者必須符合下列其中一項條件：
+ 成為超級使用者
+ 成為資料表的擁有者
+ 獲得父系結構描述的 USAGE 權限和資料表的 SELECT 權限

## 語法
<a name="r_SHOW_CONSTRAINTS-synopsis"></a>

```
SHOW CONSTRAINTS {PRIMARY KEYS | FOREIGN KEYS [EXPORTED]}
FROM TABLE
{ database_name.schema_name.table_name | schema_name.table_name }
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_CONSTRAINTS-parameters"></a>

*database\$1name*  
包含目標資料表的資料庫名稱

*schema\$1name*  
包含目標資料表的結構描述名稱

*table\$1name*  
目標資料表的名稱

匯出  
指定 EXPORTED 時，列出參考目標資料表之其他資料表的所有外部索引鍵。

*row\$1limit*  
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_CONSTRAINTS-examples"></a>

下列範例顯示資料表 demo\$1db.demo\$1schema.pk1 的主要金鑰限制條件：

```
SHOW CONSTRAINTS PRIMARY KEYS FROM TABLE demo_db.demo_schema.pk1;
 database_name | schema_name | table_name | pk_name  | column_name | key_seq 
---------------+-------------+------------+----------+-------------+---------
 demo_db       | demo_schema | pk1        | pk1_pkey | i           |       1
 demo_db       | demo_schema | pk1        | pk1_pkey | j           |       2
 demo_db       | demo_schema | pk1        | pk1_pkey | c           |       3
```

下列範例顯示資料表 demo\$1schema.fk2 的外部金鑰限制條件：

```
SHOW CONSTRAINTS FOREIGN KEYS FROM TABLE demo_schema.fk2;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |  fk_name   | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey | pk1_pkey |             |             |
```

下列範例顯示從資料表 demo\$1schema.pk1 匯出的外部金鑰限制條件：

```
SHOW CONSTRAINTS FOREIGN KEYS EXPORTED FROM TABLE demo_schema.pk1;
 pk_database_name | pk_schema_name | pk_table_name | pk_column_name | fk_database_name | fk_schema_name | fk_table_name | fk_column_name | key_seq |     fk_name     | pk_name  | update_rule | delete_rule | deferrability 
------------------+----------------+---------------+----------------+------------------+----------------+---------------+----------------+---------+-----------------+----------+-------------+-------------+---------------
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | fk2           | i              |       1 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | fk2           | j              |       2 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | fk2           | c              |       3 | fk2_i_fkey      | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | i              | demo_db          | demo_schema    | other_fk      | i              |       1 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | j              | demo_db          | demo_schema    | other_fk      | j              |       2 | other_fk_i_fkey | pk1_pkey |             |             | 
 demo_db          | demo_schema    | pk1           | c              | demo_db          | demo_schema    | other_fk      | c              |       3 | other_fk_i_fkey | pk1_pkey |             |             |
```

# SHOW EXTERNAL TABLE
<a name="r_SHOW_EXTERNAL_TABLE"></a>

顯示外部資料表的定義，包括資料表屬性和資料欄屬性。您可以使用 SHOW EXTERNAL TABLE 陳述式的輸出來重新建立資料表。

如需外部資料表建立的相關資訊，請參閱 [CREATE EXTERNAL TABLE](r_CREATE_EXTERNAL_TABLE.md)。

## 語法
<a name="r_SHOW_EXTERNAL_TABLE-synopsis"></a>

```
SHOW EXTERNAL TABLE [external_database].external_schema.table_name [ PARTITION ]
```

## Parameters
<a name="r_SHOW_EXTERNAL_TABLE-parameters"></a>

 *external\$1database*   
相關聯外部資料庫的名稱。此為選用參數。

 *external\$1schema*   
相關聯外部結構描述的名稱。

 *table\$1name*   
要顯示的資料表名稱。

PARTITION   
顯示 ALTER TABLE 敘述句，以將分割區新增至資料表定義。

## 範例
<a name="r_SHOW_EXTERNAL_TABLE-examples"></a>

以下範例基於外部資料表定義如下：

```
CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
     csmallint smallint,
     cint int,
     cbigint bigint,
     cfloat float4,
     cdouble float8,
     cchar char(10),
     cvarchar varchar(255),
     cdecimal_small decimal(18,9),
     cdecimal_big decimal(30,15),
     ctimestamp TIMESTAMP,
     cboolean boolean,
     cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime TIMESTAMP)
STORED AS PARQUET
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';
```

以下是 SHOW EXTERNAL TABLE 命令的範例，以及資料表 `my_schema.alldatatypes_parquet_test_partitioned` 的輸出。

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';"
```

以下是 SHOW EXTERNAL TABLE 命令的範例，以及相同資料表的輸出，但資料庫也會在參數中指定。

```
SHOW EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned;
```

```
"CREATE EXTERNAL TABLE my_database.my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date, ctime timestamp)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';"
```

以下是 SHOW EXTERNAL TABLE 命令的範例，以及使用 `PARTITION` 參數時的輸出。輸出包含 ALTER TABLE 陳述式，以將分割區新增至資料表定義。

```
SHOW EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned PARTITION;
```

```
"CREATE EXTERNAL TABLE my_schema.alldatatypes_parquet_test_partitioned (
    csmallint smallint,
    cint int,
    cbigint bigint,
    cfloat float4,
    cdouble float8,
    cchar char(10),
    cvarchar varchar(255),
    cdecimal_small decimal(18,9),
    cdecimal_big decimal(30,15),
    ctimestamp timestamp,
    cboolean boolean,
    cstring varchar(16383)
)
PARTITIONED BY (cdate date)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-01') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-01';
ALTER TABLE my_schema.alldatatypes_parquet_test_partitioned ADD IF NOT EXISTS PARTITION (cdate='2021-01-02') LOCATION 's3://amzn-s3-demo-bucket/alldatatypes_parquet_partitioned2/cdate=2021-01-02';"
```

# SHOW DATABASES
<a name="r_SHOW_DATABASES"></a>

顯示來自 Data Catalog 或 Amazon Redshift 資料倉儲的資料庫。SHOW DATABASES 列出所有可存取的資料庫，例如資料倉儲、 AWS Glue Data Catalog 資料庫 (awsdatacatalog)、資料共用資料庫和 Lake Formation 資料庫。

## 所需的許可
<a name="r_SHOW_DATABASES-privileges"></a>

使用者可以看到所有資料庫，除了：
+ 若要看見從具有許可的資料共用建立的資料庫，就必須授予目前使用者資料庫上的 USAGE 許可。

## 語法
<a name="r_SHOW_DATABASES-syntax"></a>

若要顯示來自 Amazon Redshift 資料倉儲的資料庫：

```
SHOW DATABASES 
[ LIKE '<expression>' ]
[ LIMIT row_limit ]
```

若要顯示來自 Data Catalog 的資料庫：

```
SHOW DATABASES FROM DATA CATALOG 
[ ACCOUNT  '<id1>', '<id2>', ... ]
[ LIKE '<expression>' ]
[ IAM_ROLE default | 'SESSION' | 'arn:aws:iam::<account-id>:role/<role-name>' ]
[ LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_DATABASES-parameters"></a>

ACCOUNT '<id1>', '<id2>', ...  
要從中列出資料庫 AWS Glue Data Catalog 的帳戶。省略此參數表示 Amazon Redshift 應該顯示擁有叢集之帳戶中的資料庫。

LIKE '<expression>'  
從資料庫清單中篩選符合您指定運算式的資料庫。此參數支援使用萬用字元 % (百分比) 和 \$1 (底線) 的模式。

IAM\$1ROLE default \$1 'SESSION' \$1 'arn:aws:iam::<account-id>:role/<role-name>'  
如果您在執行 SHOW DATABASES 命令時指定與叢集關聯的 IAM 角色，當您在資料庫上執行查詢時，Amazon Redshift 將會使用該角色的登入資料。  
指定 `default` 關鍵字表示使用設定為預設值且與叢集相關聯的 IAM 角色。  
如果您使用聯合身分連線到 Amazon Redshift 叢集，並從使用 [CREATE DATABASE](r_CREATE_DATABASE.md) 命令建立的外部資料庫存取資料表，請使用 `'SESSION'`。如需使用聯合身分的範例，請參閱[使用聯合身分管理 Amazon Redshift 對本機資源和 Amazon Redshift Spectrum 外部資料表的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorization-fas-spectrum.html)，其中會說明如何設定聯合身分。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。IAM 角色最少須具有在所要存取的 Amazon S3 儲存貯體上執行 LIST 操作，以及在儲存貯體包含的 Amazon S3 物件上執行 GET 操作的許可。若要進一步了解從 AWS Glue Data Catalog 為資料共用和使用 IAM\$1ROLE 建立的資料庫，請參閱[以取用者身分使用 Lake Formation 管理的資料共用](https://docs.aws.amazon.com/redshift/latest/dg/lake-formation-getting-started-consumer.html)。  
以下顯示單一 ARN 的 IAM\$1ROLE 參數字串語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-name>'
```
您可以鏈結角色，以便您的叢集可以擔任其他 IAM 角色 (可能屬於其他帳戶)。您最多可以鏈結 10 個角色。如需詳細資訊，請參閱[在 Amazon Redshift Spectrum 中鏈結 IAM 角色](c-spectrum-iam-policies.md#c-spectrum-chaining-roles)。  
 對於此 IAM 角色，請附加與以下內容相似的 IAM 許可政策。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AccessSecret",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetResourcePolicy",
                "secretsmanager:GetSecretValue",
                "secretsmanager:DescribeSecret",
                "secretsmanager:ListSecretVersionIds"
            ],
            "Resource": "arn:aws:secretsmanager:us-west-2:123456789012:secret:my-rds-secret-VNenFy"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": [
                "secretsmanager:GetRandomPassword",
                "secretsmanager:ListSecrets"
            ],
            "Resource": "*"
        }
    ]
}
```
如需建立 IAM 角色以搭配聯合查詢使用的步驟，請參閱[建立秘密和 IAM 角色來使用聯合查詢](federated-create-secret-iam-role.md)。  
不要在鏈結的角色清單中包含空格。
以下顯示鏈結三個角色的語法。  

```
IAM_ROLE 'arn:aws:iam::<aws-account-id>:role/<role-1-name>,arn:aws:iam::<aws-account-id>:role/<role-2-name>,arn:aws:iam::<aws-account-id>:role/<role-3-name>'
```

LIMIT *row\$1limit*  
限制 (LIMIT) 傳回列數的子句。其中 *row\$1limit* 是要傳回的列數上限。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_DATABASES-examples"></a>

下列範例會顯示帳戶識別碼 123456789012 中的所有 Data Catalog 資料庫。

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012'

  catalog_id  | database_name |                        database_arn                    |     type     |                                             target_database                                      | location | parameters
--------------+---------------+--------------------------------------------------------+--------------+--------------------------------------------------------------------------------------------------+----------+------------
 123456789012 |   database1   | arn:aws:glue:us-east-1:123456789012:database/database1 | Data Catalog |                                                                                                  |          |
 123456789012 |   database2   | arn:aws:glue:us-east-1:123456789012:database/database2 | Data Catalog | arn:aws:redshift:us-east-1:123456789012:datashare:035c45ea-61ce-86f0-8b75-19ac6102c3b7/database2 |          |
```

以下範例會示範如何在使用 IAM 角色的登入資料時，顯示帳戶識別碼 123456789012 中的所有 Data Catalog 資料庫。

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE default;
```

```
SHOW DATABASES FROM DATA CATALOG ACCOUNT '123456789012' IAM_ROLE <iam-role-arn>;
```

下列範例顯示已連線 Amazon Redshift 資料倉儲中的所有資料庫。

```
SHOW DATABASES

database_name  | database_owner | database_type        | database_acl | parameters | database_isolation_level
---------------+----------------+----------------------+--------------+------------+--------------------
awsdatacatalog | 1              | auto mounted catalog | NULL         | UNKNOWN    | UNKNOWN
dev            | 1              | local                | NULL         | NULL       | Snapshot Isolation
```

# 顯示功能
<a name="r_SHOW_FUNCTIONS"></a>

顯示結構描述中的函數清單，以及所列出物件的相關資訊。

每個輸出列都有資料欄 database\$1name、schema\$1name、 function\$1name、 number\$1of\$1arguments、 argument\$1list、return\$1type、remarks。

如果 SHOW FUNCTIONS 會產生超過 10，000 個資料列，則命令會引發錯誤。

## 所需的許可
<a name="r_SHOW_FUNCTIONS-required-permissions"></a>

若要檢視 Redshift 結構描述中的函數，目前的使用者必須符合下列其中一項條件：
+ 成為超級使用者
+ 成為函數的擁有者
+ 在父系結構描述上授予 USAGE 權限，並在函數上授予 EXECUTE

## 語法
<a name="r_SHOW_FUNCTIONS-synopsis"></a>

```
SHOW FUNCTIONS FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_FUNCTIONS-parameters"></a>

*database\$1name*  
包含要列出之函數的資料庫名稱。

*schema\$1name*  
包含要列出之函數的結構描述名稱。

*filter\$1pattern*  
有效的 UTF-8 字元表達式，具有符合函數名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_FUNCTIONS.html)
請注意， filter\$1pattern 只符合函數名稱。

*row\$1limit*  
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_FUNCTIONS-examples"></a>

下列範例顯示來自結構描述 demo\$1db.demo\$1schema 的函數：

```
SHOW FUNCTIONS FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |    function_name     | number_of_arguments |                                  argument_list                                  |    return_type    | remarks 
---------------+-------------+----------------------+---------------------+---------------------------------------------------------------------------------+-------------------+---------
 demo_db       | demo_schema | f2                   |                   6 | integer, character varying, numeric, date, timestamp without time zone, boolean | character varying | 
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer                                                                | numeric           | 
 demo_db       | demo_schema | f_days_between       |                   2 | date, date                                                                      | integer           |
```

下列範例顯示來自結構描述 demo\$1schema 的函數，其名稱結尾為 'discount'：

```
SHOW FUNCTIONS FROM SCHEMA demo_schema like '%discount';
 database_name | schema_name |    function_name     | number_of_arguments |  argument_list   | return_type | remarks 
---------------+-------------+----------------------+---------------------+------------------+-------------+---------
 demo_db       | demo_schema | f_calculate_discount |                   2 | numeric, integer | numeric     |
```

# SHOW GRANTS
<a name="r_SHOW_GRANTS"></a>

顯示使用者、角色或物件的授權。物件可以是資料庫、結構描述、資料表、函數或範本。當您指定物件時 (例如資料表或函式)，您需要使用兩部分或三部分記號來限定該物件。例如 `schema_name.table_name` 或 `database_name.schema_name.table_name`。

如果 SHOW GRANTS 會產生超過 10，000 個資料列，則命令會引發錯誤。

## 所需的許可
<a name="r_SHOW_GRANTS-permissions"></a>

若要為目標使用者或角色執行 SHOW GRANTS，目前使用者必須符合下列其中一項條件：
+ 成為超級使用者
+ 成為目標使用者
+ 成為目標角色的擁有者
+ 獲授予角色

目標物件的 SHOW GRANTS 只會顯示目前使用者可見的授予。如果目前使用者滿足下列其中一項條件，則目前使用者可以看到授予：
+ 成為超級使用者
+ 成為目標使用者
+ 獲得授予角色的擁有者
+ 獲得物件授予的目標角色

## 語法
<a name="r_SHOW_GRANTS-syntax"></a>

以下是顯示物件授權的語法。請注意，第二種指定函式的方式僅適用於從資料共用建立的外部結構描述和資料庫。

```
SHOW GRANTS ON
{
 DATABASE database_name |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } ( [ [ argname ] argtype [, ...] ] ) |
 FUNCTION {database_name.schema_name.function_name | schema_name.function_name } |
 SCHEMA {database_name.schema_name | schema_name} | 
 { TABLE {database_name.schema_name.table_name | schema_name.table_name} | table_name }
 TEMPLATE {database_name.schema_name.template_name | template_name}
}
[FOR {username | ROLE role_name | PUBLIC}]
[LIMIT row_limit]
```

以下是顯示使用者或角色授權的語法。

```
SHOW GRANTS FOR
{username | ROLE role_name}
[FROM DATABASE database_name]
[LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_GRANTS-parameters"></a>

 *database\$1name*   
要顯示其授權的資料庫名稱。

 *function\$1name*   
要顯示其授權的函式名稱。

template\$1name  
要顯示授予的範本名稱。

 *schema\$1name*   
要顯示其授權的結構描述名稱。

 *table\$1name*   
要顯示其授權的資料表名稱。

FOR *username*   
表示顯示使用者的授權。

FOR ROLE *role\$1name*   
表示顯示角色的授權。

FOR PUBLIC  
表示顯示 PUBLIC 的授權。

 *row\$1limit*   
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_GRANTS-examples"></a>

下列範例會顯示名為 `dev` 之資料庫的所有授權。

```
SHOW GRANTS on database demo_db;

  database_name | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | grantor_name 
---------------+----------------+-------------+---------------+---------------+--------------+-----------------+--------------
 demo_db       | ALTER          |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TRUNCATE       |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DROP           |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | INSERT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | TEMP           |           0 | public        | public        | f            | DATABASE        | dbadmin
 demo_db       | SELECT         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | UPDATE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | DELETE         |         112 | alice         | user          | f            | TABLES          | dbadmin
 demo_db       | REFERENCES     |         112 | alice         | user          | f            | TABLES          | dbadmin
```

下列命令會顯示名為 `demo` 之結構描述的所有授權。

```
SHOW GRANTS ON SCHEMA demo_schema;

 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | demo_schema | SCHEMA      | ALTER          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | DROP           |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | USAGE          |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
 demo_schema | demo_schema | SCHEMA      | CREATE         |         112 | alice         | user          | f            | SCHEMA          | db1           | dbadmin
```

下列命令會顯示名為 `alice` 之使用者的所有授權。

```
SHOW GRANTS FOR alice;

 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 demo_db       |             |             | DATABASE    | INSERT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | SELECT         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | UPDATE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DELETE         |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | REFERENCES     |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | DROP           |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | TRUNCATE       |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       |             |             | DATABASE    | ALTER          |         124 | alice         | user          | TABLES          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | USAGE          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | CREATE         |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | DROP           |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema |             | SCHEMA      | ALTER          |         124 | alice         | user          | SCHEMA          | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | INSERT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | SELECT         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | UPDATE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DELETE         |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | RULE           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | REFERENCES     |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRIGGER        |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | DROP           |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | TRUNCATE       |         124 | alice         | user          | TABLE           | dbadmin
 demo_db       | demo_schema | t1          | TABLE       | ALTER          |         124 | alice         | user          | TABLE           | dbadmin
```

```
SHOW GRANTS FOR alice FROM DATABASE second_db;
 database_name | schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | privilege_scope | grantor_name 
---------------+-------------+-------------+-------------+----------------+-------------+---------------+---------------+-----------------+--------------
 second_db     | public      | t22         | TABLE       | SELECT         |         101 | alice         | user          | TABLE           | dbadmin
```

下列命令會顯示名為 `alice` 之使用者在名為 `t3` 的資料表上的所有授權。請注意，您可以使用兩部分或三部分記號來指定資料表名稱。

```
SHOW GRANTS ON TABLE demo_db.demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin


SHOW GRANTS ON TABLE demo_schema.t3 FOR ALICE;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 demo_schema | t3          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 demo_schema | t3          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

下列範例會顯示名為 `t4` 之資料表的所有授權。請注意您可以指定資料表名稱的不同方式。

```
SHOW GRANTS ON t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 
SHOW GRANTS ON TABLE public.t4;
 schema_name | object_name | object_type | privilege_type | identity_id | identity_name | identity_type | admin_option | privilege_scope | database_name | grantor_name 
-------------+-------------+-------------+----------------+-------------+---------------+---------------+--------------+-----------------+---------------+--------------
 public      | t4          | TABLE       | ALTER          |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRUNCATE       |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DROP           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | TRIGGER        |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | SELECT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | INSERT         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | UPDATE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | DELETE         |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | RULE           |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
 public      | t4          | TABLE       | REFERENCES     |         130 | alice         | user          | f            | TABLE           | demo_db       | dbadmin
```

# SHOW MODEL
<a name="r_SHOW_MODEL"></a>

顯示有關機器學習模型的實用資訊，包括其狀態、用於建立模型的參數，以及具有輸入引數類型的預測函數。您可以使用 SHOW MODEL 中的資訊來重新建立模型。如果基底資料表已變更，使用相同的 SQL 陳述式執行 CREATE MODEL 會產生不同的模型。由 SHOW MODEL 傳回的資訊與模型所有者和具有 EXECUTE 權限的使用者不同。從 Amazon Redshift 訓練模型或模型為 BYOM 模型時，SHOW MODEL 會顯示不同的輸出。

## 語法
<a name="r_SHOW_MODEL-synopsis"></a>

```
SHOW MODEL ( ALL | model_name )
```

## Parameters
<a name="r_SHOW_MODEL-parameters"></a>

ALL   
傳回使用者可以使用的所有模型及其結構描述。

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

## 使用須知
<a name="r_SHOW_MODEL_usage_notes"></a>

SHOW MODEL 會傳回下列結果：
+ 模型名稱。
+ 建立模型所在的結構描述。
+ 模型的擁有者。
+ 模型建立時間。
+ 模型的狀態，例如 READY、TRAINING 或 FAILED。
+ 失敗模型的原因訊息。
+ 如果模型已完成訓練，則會出現驗證錯誤。
+ 衍生非 BYOM 方法之模型所需的估計成本。只有模型的擁有者可以檢視此資訊。
+ 使用者指定的參數及其值的清單，特別是下列各項：
  + 指定的 TARGET 資料欄。
  + 模型類型 AUTO 或 XGBoost。
  + 問題類型，例如 REGRESSION、BINARY\$1CLASSIFICATION、MULTICLASS\$1CLASSIFICATION。此參數是 AUTO 特有的參數。
  + Amazon SageMaker AI 訓練任務的名稱，或建立模型的 Amazon SageMaker AI Autopilot 任務的名稱。您可以使用此任務名稱在 Amazon SageMaker AI 上尋找有關該模型的詳細資訊。
  + 目標，如 MSE、F1、準確性。此參數是 AUTO 特有的參數。
  + 所建立函數的名稱。
  + 推論類型 (本機或遠端)。
  + 預測函數輸入引數。
  + 非使用自有模型 (BYOM) 之模型的預測函數輸入引數類型。
  + 預測函數的傳回類型。此參數是 BYOM 特有的參數。
  + 具有遠端推論之 BYOM 模型的 Amazon SageMaker AI 端點名稱。
  + IAM 角色。只有模型的擁有者可以看到此項目。
  + 使用的 S3 儲存貯體。只有模型的擁有者可以看到此項目。
  + 如果提供了金鑰，則為 AWS KMS 金鑰。只有模型的擁有者可以看到此項目。
  + 模型可以執行的時間上限。
+ 如果模型類型不是 AUTO，則 Amazon Redshift 也會顯示所提供超參數及其值的清單。

您還可以在其他目錄資料表中檢視由 SHOW MODEL 提供的一些資訊，例如 pg\$1proc。Amazon Redshift 會傳回 pg\$1proc 目錄資料表中註冊的預測函數相關資訊。此資訊包括用於預測函數的輸入引數名稱及其類型。Amazon Redshift 會傳回 SHOW MODEL 命令中的相同資訊。

```
SELECT * FROM pg_proc WHERE proname ILIKE '%<function_name>%';
```

## 範例
<a name="r_SHOW_MODEL-examples"></a>

下例範例顯示「顯示模型」的輸出。

```
SHOW MODEL ALL;

Schema Name |  Model Name
------------+---------------
 public     | customer_churn
```

customer\$1churn 的擁有者可以看到以下輸出。僅具有 EXECUTE 權限的使用者無法看到 IAM 角色、Amazon S3 儲存貯體和模式的預估成本。

```
SHOW MODEL customer_churn;

       Key                 |           Value
---------------------------+-----------------------------------
 Model Name                | customer_churn
 Schema Name               | public
 Owner                     | 'owner'
 Creation Time             | Sat, 15.01.2000 14:45:20
 Model State               | READY
 validation:F1             | 0.855
 Estimated Cost            | 5.7
                           |
 TRAINING DATA:            |
 Table                     | customer_data
 Target Column             | CHURN
                           |
 PARAMETERS:               |
 Model Type                | auto
 Problem Type              | binary_classification
 Objective                 | f1
 Function Name             | predict_churn
 Function Parameters       | age zip average_daily_spend average_daily_cases
 Function Parameter Types  | int int float float
 IAM Role                  | 'iam_role'
 KMS Key                   | 'kms_key'
 Max Runtime               | 36000
```

# SHOW DATASHARES
<a name="r_SHOW_DATASHARES"></a>

顯示叢集中來自相同帳戶或跨帳戶的輸入和輸出共用。如果您未指定資料共用名稱，Amazon Redshift 會顯示叢集中所有資料庫中的所有資料共用。具有 ALTER 和 SHARE 權限的使用者可以查看他們有權限的共用。

## 語法
<a name="r_SHOW_DATASHARES-synopsis"></a>

```
SHOW DATASHARES [ LIKE 'namepattern' ] 
```

## Parameters
<a name="r_SHOW_DATASHARES-parameters"></a>

LIKE  
選用子句，將指定的名稱模式與資料共用的描述進行比較。使用此子句時，Amazon Redshift 只會顯示名稱符合指定名稱模式的資料共用。

*namepattern*  
請求的資料共用名稱或名稱的一部分會使用萬用字元進行比對。

## 範例
<a name="r_SHOW_DATASHARES-examples"></a>

下列範例會顯示叢集中的輸入和輸出共用。

```
SHOW DATASHARES;
SHOW DATASHARES LIKE 'sales%';

share_name   | share_owner | source_database | consumer_database | share_type | createdate          | is_publicaccessible | share_acl | producer_account |           producer_namespace
-------------+-------------+-----------------+-------------------+------------+---------------------+---------------------+-----------+------------------+---------------------------------------
'salesshare' | 100         | dev             |                   | outbound   | 2020-12-09 01:22:54.| False               |           |   123456789012   | 13b8833d-17c6-4f16-8fe4-1a018f5ed00d
```

# 顯示參數
<a name="r_SHOW_PARAMETERS"></a>

顯示函數/程序的參數清單，以及參數的一些相關資訊。

每個輸出列都有資料欄 database\$1name、schema\$1name、 procedure\$1name 或 function\$1name、parameter\$1name、ordinal\$1position、parameter\$1type (IN/OUT)、data\$1type、 character\$1maximum\$1length、 numeric\$1precision、 numeric\$1scale 和 remarks。

## 所需的許可
<a name="r_SHOW_PARAMETERS-required-permissions"></a>

若要在 Redshift 結構描述中檢視函數/程序，目前的使用者必須符合下列其中一項條件：
+ 成為超級使用者
+ 成為函數的擁有者
+ 在父系結構描述上授予 USAGE 權限，並在函數上授予 EXECUTE

## 語法
<a name="r_SHOW_PARAMETERS-synopsis"></a>

```
SHOW PARAMETERS OF {FUNCTION| PROCEDURE}
[database_name.]schema_name.function_name(argtype [, ...] )
[LIKE 'filter_pattern'];
```

## Parameters
<a name="r_SHOW_PARAMETERS-parameters"></a>

*database\$1name*  
包含要列出之函數的資料庫名稱。

*schema\$1name*  
包含要列出之函數的結構描述名稱。

*filter\$1pattern*  
有效的 UTF-8 字元運算式，包含要比對資料表名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_PARAMETERS.html)

## 範例
<a name="r_SHOW_PARAMETERS-examples"></a>

下列範例顯示程序 demo\$1db.demo\$1schema.f1 的參數：

```
SHOW PARAMETERS OF PROCEDURE demo_db.demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL);
 database_name | schema_name | procedure_name |  parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+------------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | operation        |                1 | IN             | character varying           |                       10 |                   |              
 demo_db       | demo_schema | f1             | value1           |                2 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2           |                3 | IN             | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | result           |                4 | INOUT          | numeric                     |                          |                18 |             0
 demo_db       | demo_schema | f1             | operation_status |                5 | OUT            | character varying           |                       50 |                   |              
 demo_db       | demo_schema | f1             | calculation_time |                6 | OUT            | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f1             | is_successful    |                7 | OUT            | boolean                     |                          |                   |
```

下列範例顯示名稱開頭為 'val' 的程序 demo\$1schema.f1 參數：

```
SHOW PARAMETERS OF PROCEDURE demo_schema.f1(VARCHAR, DECIMAL, DECIMAL, DECIMAL) like 'val%';
 database_name | schema_name | procedure_name | parameter_name | ordinal_position | parameter_type | data_type | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+----------------+----------------+------------------+----------------+-----------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f1             | value1         |                2 | IN             | numeric   |                          |                18 |             0
 demo_db       | demo_schema | f1             | value2         |                3 | IN             | numeric   |                          |                18 |             0
```

下列範例顯示函數 demo\$1schema.f2 的參數：

```
SHOW PARAMETERS OF FUNCTION demo_schema.f2(INT, VARCHAR, DECIMAL, DATE, TIMESTAMP, BOOLEAN);
 database_name | schema_name | function_name | parameter_name  | ordinal_position | parameter_type |          data_type          | character_maximum_length | numeric_precision | numeric_scale 
---------------+-------------+---------------+-----------------+------------------+----------------+-----------------------------+--------------------------+-------------------+---------------
 demo_db       | demo_schema | f2            |                 |                0 | RETURN         | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | int_param       |                1 | IN             | integer                     |                          |                32 |             0
 demo_db       | demo_schema | f2            | varchar_param   |                2 | IN             | character varying           |                       -1 |                   |              
 demo_db       | demo_schema | f2            | decimal_param   |                3 | IN             | numeric                     |                          |                   |              
 demo_db       | demo_schema | f2            | date_param      |                4 | IN             | date                        |                          |                   |              
 demo_db       | demo_schema | f2            | timestamp_param |                5 | IN             | timestamp without time zone |                          |                   |              
 demo_db       | demo_schema | f2            | boolean_param   |                6 | IN             | boolean                     |                          |                   |
```

# 顯示政策
<a name="r_SHOW_POLICIES"></a>

顯示資料庫中定義的資料列層級安全性 (RLS) 和動態資料遮罩 (DDM) 政策，以及套用至特定關係的 RLS 和 DDM 政策。只有超級使用者或資料庫上具有 `sys:secadmin`角色的使用者才能檢視這些政策的結果。

## 語法
<a name="r_SHOW_POLICIES-synopsis"></a>

```
SHOW { RLS | MASKING } POLICIES
[
    ON { database_name.schema_name.relation_name
       | schema_name.relation_name
       }
    [ FOR { user_name | ROLE role_name | PUBLIC } ]
  |
    FROM DATABASE database_name
]
[ LIMIT row_limit ];
```

## Parameters
<a name="r_SHOW_POLICIES-parameters"></a>

*database\$1name*  
要顯示政策的資料庫名稱。

*schema\$1name*  
要顯示連接政策之關係的結構描述名稱。

*relation\$1name*  
要顯示連接政策的關係名稱。

*user\$1name*  
在關聯上附加政策的使用者名稱。

*role\$1name*  
在關聯上附加政策的角色名稱。

*row\$1limit*  
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

**注意**  
Amazon Redshift 聯合許可目錄支援顯示來自與連線資料庫不同的資料庫的政策。SHOW POLICIES 命令支援具有 Amazon Redshift 聯合許可的倉儲中所有資料庫的跨資料庫查詢

## 範例
<a name="r_SHOW_POLICIES-examples"></a>

下列命令顯示來自連線資料庫的 RLS 政策。

```
SHOW RLS POLICIES;

  policy_name   | policy_alias |                           policy_atts                            |                                                                  policy_qual                                                                         | policy_enabled | policy_modified_by |    policy_modified_time    
----------------+--------------+------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+--------------------+----------------------------
 policy_america | rls_table    | [{"colname":"region","type":"character varying(10)"}]            | (("rls_table"."region" = CAST('USA' AS TEXT)) OR ("rls_table"."region" = CAST('CANADA' AS TEXT)) OR ("rls_table"."region" = CAST('Mexico' AS TEXT))) | t              | admin              | 2025-11-07 14:57:27
```

下列命令顯示來自資料庫 "sales\$1db.finance-catalog" 的遮罩政策；

```
SHOW MASKING POLICIES FROM DATABASE "sales_db@finance-catalog";

  policy_name  |                          input_columns                           |                                                  policy_expression                                                  | policy_modified_by |    policy_modified_time    
---------------+------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------+--------------------+----------------------------
 hash_credit   | [{"colname":"credit_card","type":"character varying(256)"}]      | [{"expr":"SHA2((\"masked_table\".\"credit_card\" + CAST('testSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}]   | admin              | 2025-11-07 16:05:54
 hash_username | [{"colname":"username","type":"character varying(256)"}]         | [{"expr":"SHA2((\"masked_table\".\"username\" + CAST('otherTestSalt' AS TEXT)), CAST(256 AS INT4))","type":"text"}] | admin              | 2025-11-07 16:07:08
(2 rows)
```

下列命令顯示連接到關係 sales\$1table 的 RLS 政策；

```
SHOW RLS POLICIES ON sales_schema.sales_table;

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |          grantee          | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+---------------------------+--------------+--------------+-----------+----------------------
 policy_global  | sales_schema | sales_table   | table         | admin    | sales_analyst_role_global | role         | t            | t         | and
 policy_america | sales_schema | sales_table   | table         | admin    | sales_analyst_usa         | user         | t            | t         | and
```

下列命令顯示從資料庫 "sales\$1db.finance-catalog" 遮罩附加在 relation transaction\$1table 上的政策。

```
SHOW MASKING POLICIES ON "sales_db@finance-catalog".sales_schema.transaction_table LIMIT 1;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority |   input_columns   |   output_columns   
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+-------------------+-------------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"]     | ["user_name"]
```

下列命令顯示從使用者 "IAMR：sales\$1analyst\$1usa" 的資料庫 "sales\$1db.finance-catalog" 連接到關係 sales\$1table 上的 RLS 政策。

```
SHOW RLS POLICIES ON "sales_db@finance-catalog".sales_schema.sales_table FOR "IAMR:sales_analyst_usa";

  policy_name   | schema_name  | relation_name | relation_kind | grantor  |      grantee           | grantee_kind | is_policy_on | is_rls_on | rls_conjunction_type 
----------------+--------------+---------------+---------------+----------+------------------------+--------------+--------------+-----------+----------------------
 policy_america | sales_schema | sales_table   | table         | admin    | IAMR:sales_analyst_usa | user         | t            | t         | and
```

下列命令顯示從角色 transaction\$1analyst\$1role 資料庫 "sales\$1db.finance-catalog" 連接到 relation transaction\$1table 上的 RLS 政策。

```
SHOW MASKING POLICIES ON sales_schema.transaction_table FOR ROLE transaction_analyst_role;

  policy_name  | schema_name  |   relation_name   | relation_type | grantor  |         grantee          | grantee_type | priority | input_columns | output_columns 
---------------+--------------+-------------------+---------------+----------+--------------------------+--------------+----------+---------------+----------------
 hash_username | sales_schema | transaction_table | table         | admin    | transaction_analyst_role | role         |      100 | ["user_name"] | ["user_name"]
```

# SHOW PROCEDURE
<a name="r_SHOW_PROCEDURE"></a>

顯示特定預存程序的定義，包括其簽章。您可以使用 SHOW PROCEDURE 的輸出來重新建立預存程序。

## 語法
<a name="r_SHOW_PROCEDURE-synopsis"></a>

```
SHOW PROCEDURE sp_name [( [ [ argname ] [ argmode ] argtype [, ...] ] )]
```

## Parameters
<a name="r_SHOW_PROCEDURE-parameters"></a>

 *sp\$1name*   
要顯示的程序的名稱。

*[argname] [ argmode] argtype*   
用來識別預存程序的輸入引數類型。您可以選擇性包含完整引數資料類型，包括 OUT 引數。如果預存程序的名稱是唯一的 (亦即不過載)，則此為選用部分。

## 範例
<a name="r_SHOW_PROCEDURE-examples"></a>

下列範例顯示程序 `test_spl2` 的定義。

```
show procedure test_sp2(int, varchar);
                                        Stored Procedure Definition
------------------------------------------------------------------------------------------------------------
CREATE OR REPLACE PROCEDURE public.test_sp2(f1 integer, INOUT f2 character varying, OUT character varying)
LANGUAGE plpgsql
AS $_$
DECLARE
out_var alias for $3;
loop_var int;
BEGIN
IF f1 is null OR f2 is null THEN
RAISE EXCEPTION 'input cannot be null';
END IF;
CREATE TEMP TABLE etl(a int, b varchar);
FOR loop_var IN 1..f1 LOOP
insert into etl values (loop_var, f2);
f2 := f2 || '+' || f2;
END LOOP;
SELECT INTO out_var count(*) from etl;
END;
$_$

(1 row)
```

# 顯示程序
<a name="r_SHOW_PROCEDURES"></a>

顯示結構描述中的程序清單，以及所列出物件的相關資訊。

每個輸出列都有欄 `database_name`、`schema_name`、`procedure_name`、`number_of_arguments`、`argument_list``return_type`、、 備註。

如果 SHOW PROCEDURES 會產生超過 10，000 個資料列，則命令會引發錯誤。

## 所需的許可
<a name="r_SHOW_PROCEDURES-required-permissions"></a>

若要檢視 Redshift 結構描述中的程序，目前的使用者必須符合下列其中一項條件：
+ 成為超級使用者
+ 成為程序的擁有者
+ 在父系結構描述上授予 USAGE 權限，並在程序上授予 EXECUTE

## 語法
<a name="r_SHOW_PROCEDURES-synopsis"></a>

```
SHOW PROCEDURES FROM SCHEMA
[database_name.]schema_name
[LIKE 'filter_pattern'] [LIMIT row_limit]
```

## Parameters
<a name="r_SHOW_PROCEDURES-parameters"></a>

database\$1name  
包含要列出程序的資料庫名稱。

schema\$1name  
包含要列出之程序的結構描述名稱。

filter\$1pattern  
有效的 UTF-8 字元表達式，具有符合程序名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_PROCEDURES.html)
請注意， filter\$1pattern 只符合程序名稱。

row\$1limit  
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_PROCEDURES-examples"></a>

下列範例顯示結構描述 demo\$1db.demo\$1schema 的程序：

```
SHOW PROCEDURES FROM SCHEMA demo_db.demo_schema;
 database_name | schema_name |  procedure_name   | number_of_arguments |                argument_list                 |                           return_type                            | remarks 
---------------+-------------+-------------------+---------------------+----------------------------------------------+------------------------------------------------------------------+---------
 demo_db       | demo_schema | f1                |                   4 | character varying, numeric, numeric, numeric | numeric, character varying, timestamp without time zone, boolean | 
 demo_db       | demo_schema | sp_get_result_set |                   2 | integer, refcursor                           | refcursor                                                        | 
 demo_db       | demo_schema | sp_process_data   |                   2 | numeric, numeric                             | numeric, character varying                                       |
```

下列範例顯示來自結構描述 demo\$1schema 的程序，其名稱結尾為 'data'：

```
SHOW PROCEDURES FROM SCHEMA demo_schema like '%data';
 database_name | schema_name | procedure_name  | number_of_arguments |  argument_list   |        return_type         | remarks 
---------------+-------------+-----------------+---------------------+------------------+----------------------------+---------
 demo_db       | demo_schema | sp_process_data |                   2 | numeric, numeric | numeric, character varying |
```

# SHOW SCHEMAS
<a name="r_SHOW_SCHEMAS"></a>

顯示資料庫中的結構描述清單，以及一些結構描述屬性。

每個輸出資料列都包含資料庫名稱、結構描述名稱、結構描述擁有者、結構描述類型、結構描述 ACL、來源資料庫和結構描述選項。如需這些屬性的相關資訊，請參閱 [SVV\$1ALL\$1SCHEMAS](r_SVV_ALL_SCHEMAS.md)。

如果 SHOW SCHEMA 命令可能產生超過 10,000 個結構描述，則會傳回錯誤。

## 所需的許可
<a name="r_SHOW_SCHEMAS-privileges"></a>

若要檢視 Amazon Redshift 資料表中的結構描述，目前使用者必須符合下列其中一項條件：
+ 身為超級使用者。
+ 是結構描述的擁有者。
+ 具有結構描述的 USAGE 權限。

## 語法
<a name="r_SHOW_SCHEMAS-synopsis"></a>

```
SHOW SCHEMAS FROM DATABASE database_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_SCHEMAS-parameters"></a>

 *database\$1name*   
包含所要列出資料表的資料庫名稱。  
若要在 中顯示資料表 AWS Glue Data Catalog，請指定 (`awsdatacatalog`) 做為資料庫名稱，並確保系統組態`data_catalog_auto_mount`設定為 `true`。如需詳細資訊，請參閱[ALTER SYSTEM](r_ALTER_SYSTEM.md)。

 *filter\$1pattern*   
有效的 UTF-8 字元運算式，包含要比對結構描述名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_SCHEMAS.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。

 *row\$1limit*   
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_SCHEMAS-examples"></a>

下面的範例會顯示名為 `dev` 的 Amazon Redshift 資料庫的結構描述。

```
SHOW SCHEMAS FROM DATABASE dev;

 database_name |     schema_name      | schema_owner | schema_type |         schema_acl          | source_database | schema_option 
---------------+----------------------+--------------+-------------+-----------------------------+-----------------+---------------
 dev           | pg_automv            |            1 | local       |                             |                 | 
 dev           | pg_catalog           |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | public               |            1 | local       | jpuser=UC/jpuser~=UC/jpuser |                 | 
 dev           | information_schema   |            1 | local       | jpuser=UC/jpuser~=U/jpuser  |                 | 
 dev           | schemad79cd6d93bf043 |            1 | local       |                             |                 |
```

下列範例顯示名為 的 AWS Glue Data Catalog 資料庫中的結構描述`awsdatacatalog`。輸出資料列數目上限為 `5`。

```
SHOW SCHEMAS FROM DATABASE awsdatacatalog LIMIT 5;

 database_name  |     schema_name      | schema_owner | schema_type | schema_acl | source_database | schema_option 
----------------+----------------------+--------------+-------------+------------+-----------------+---------------
 awsdatacatalog | 000_too_many_glue_db |              | EXTERNAL    |            |                 | 
 awsdatacatalog | 123_default          |              | EXTERNAL    |            |                 | 
 awsdatacatalog | adhoc                |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_10mb      |              | EXTERNAL    |            |                 | 
 awsdatacatalog | all_shapes_1g        |              | EXTERNAL    |            |                 |
```

# SHOW TABLE
<a name="r_SHOW_TABLE"></a>

顯示資料表的定義，包括資料表屬性、資料表限制條件、資料欄屬性、資料欄定序和資料欄限制條件。您可以使用 SHOW TABLE 陳述式的輸出來重新建立資料表。

如需建立資料表的相關資訊，請參閱 [CREATE TABLE](r_CREATE_TABLE_NEW.md)。

## 語法
<a name="r_SHOW_TABLE-synopsis"></a>

```
SHOW TABLE [schema_name.]table_name 
```

## Parameters
<a name="r_SHOW_TABLE-parameters"></a>

 *schema\$1name*   
(選擇性) 相關結構描述的名稱。

 *table\$1name*   
要顯示的資料表名稱。

## 範例
<a name="r_SHOW_TABLE-examples"></a>

以下是資料表 `sales` 的 SHOW TABLE 輸出範例。

```
show table sales;
```

```
CREATE TABLE public.sales (
salesid integer NOT NULL ENCODE az64,
listid integer NOT NULL ENCODE az64 distkey,
sellerid integer NOT NULL ENCODE az64,
buyerid integer NOT NULL ENCODE az64,
eventid integer NOT NULL ENCODE az64,
dateid smallint NOT NULL,
qtysold smallint NOT NULL ENCODE az64,
pricepaid numeric(8,2) ENCODE az64,
commission numeric(8,2) ENCODE az64,
saletime timestamp without time zone ENCODE az64
)
DISTSTYLE KEY SORTKEY ( dateid );
```

以下是結構描述 `public` 中資料表 `category` 的 SHOW TABLE 輸出範例。資料庫的定序是 CASE\$1SENSITIVE。

```
show table public.category;
```

```
CREATE TABLE public.category (
catid smallint NOT NULL distkey,
catgroup character varying(10) ENCODE lzo COLLATE case_sensitive,
catname character varying(10) ENCODE lzo COLLATE case_sensitive,
catdesc character varying(50) ENCODE lzo COLLATE case_sensitive
) 
DISTSTYLE KEY SORTKEY ( catid );
```

下列範例會建立具有主索引鍵的資料表 `foo`。

```
create table foo(a int PRIMARY KEY, b int);
```

SHOW TABLE 結果會顯示含有 `foo` 資料表所有屬性的建立陳述式。

```
show table foo;
```

```
CREATE TABLE public.foo ( 
a integer NOT NULL ENCODE az64, 
b integer ENCODE az64, PRIMARY KEY (a) 
) 
DISTSTYLE AUTO;
```

在此範例中，我們建立一個資料表，其中資料欄`a`繼承資料庫的預設 CASE\$1SENSITIVE 定序，而 `b`和 `c` 明確設定為 CASE\$1INSENSITIVE 定序。

```
CREATE TABLE public.foo (
a CHAR, 
b VARCHAR(10) COLLATE CASE_INSENSITIVE, 
c SUPER COLLATE CASE_INSENSITIVE
);
```

SHOW TABLE 結果會顯示含有 `foo` 資料表所有屬性的建立陳述式。

```
show table public.foo;
```

```
CREATE TABLE public.foo (
a character(1) ENCODE lzo COLLATE case_sensitive,
b character varying(10) ENCODE lzo COLLATE case_insensitive,
c super COLLATE case_insensitive
)
DISTSTYLE AUTO;
```

# SHOW TABLES
<a name="r_SHOW_TABLES"></a>

顯示結構描述中的資料表清單，以及一些資料表屬性。

每個輸出列都包含資料庫名稱、結構描述名稱、資料表名稱、資料表類型、資料表 ACL、備註、資料表擁有者、上次變更的時間、上次修改的時間、dist\$1style 和資料表子類型。如需這些屬性的相關資訊，請參閱 [SVV\$1ALL\$1TABLES](r_SVV_ALL_TABLES.md)。

修改和修改時間戳記可能會落後資料表更新約 20 分鐘。

如果 SHOW TABLES 命令所產生的資料表超過 10,000 個，則會傳回錯誤。

## 所需的許可
<a name="r_SHOW_TABLES-privileges"></a>

若要檢視 Amazon Redshift 結構描述中的資料表，目前使用者必須符合下列其中一項條件：
+ 身為超級使用者。
+ 是資料表的擁有者。
+ 在上層結構描述上具備 USAGE 權限，以及在資料表上具備 SELECT 權限，或在資料表中的任何欄上具備 SELECT 權限。

## 語法
<a name="r_SHOW_TABLES-synopsis"></a>

```
SHOW TABLES FROM SCHEMA database_name.schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ]
```

## Parameters
<a name="r_SHOW_TABLES-parameters"></a>

 *database\$1name*   
包含所要列出資料表的資料庫名稱。  
若要在 中顯示資料表 AWS Glue Data Catalog，請指定 (`awsdatacatalog`) 做為資料庫名稱，並確保系統組態`data_catalog_auto_mount`設定為 `true`。如需詳細資訊，請參閱[ALTER SYSTEM](r_ALTER_SYSTEM.md)。

 *schema\$1name*   
包含所要列出資料表的結構描述名稱。  
若要顯示 AWS Glue Data Catalog 資料表，請提供 AWS Glue 資料庫名稱做為結構描述名稱。

 *filter\$1pattern*   
有效的 UTF-8 字元運算式，包含要比對資料表名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_TABLES.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。

 *row\$1limit*   
傳回的最大資料列數。*row\$1limit* 可以是 0 到 10,000。

## 範例
<a name="r_SHOW_TABLES-examples"></a>

```
SHOW TABLES FROM SCHEMA s1;

 database_name | schema_name |    table_name     | table_type |              table_acl              | remarks | owner |     last_altered_time      |     last_modified_time     | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+-------------------------------------+---------+-------+----------------------------+----------------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | alice=arwdRxtDPA/alice~bob=d/alice  |         | alice |                            |                            |            | LATE BINDING VIEW
 dev           | s1          | manual_mv         | VIEW       | alice=arwdRxtDPA/alice~bob=P/alice  |         | alice |                            |                            |            | MATERIALIZED VIEW
 dev           | s1          | regular_view      | VIEW       | alice=arwdRxtDPA/alice~bob=r/alice  |         | alice |                            |                            |            | REGULAR VIEW
 dev           | s1          | test_table        | TABLE      | alice=arwdRxtDPA/alice~bob=rw/alice |         | alice | 2025-11-18 15:52:00.010452 | 2025-11-18 15:44:34.856073 | AUTO (ALL) | REGULAR TABLE
```

```
SHOW TABLES FROM SCHEMA dev.s1 LIKE '%view' LIMIT 1;

 database_name | schema_name |    table_name     | table_type |              table_acl               | remarks | owner | last_altered_time | last_modified_time | dist_style |   table_subtype   
---------------+-------------+-------------------+------------+--------------------------------------+---------+-------+-------------------+--------------------+------------+-------------------
 dev           | s1          | late_binding_view | VIEW       | {alice=arwdRxtDPA/alice,bob=d/alice} |         | alice |                   |                    |            | LATE BINDING VIEW
```

# 顯示範本
<a name="r_SHOW_TEMPLATE"></a>

顯示範本的完整定義，包括完整名稱 （資料庫、結構描述和範本名稱） 和所有參數。輸出是有效的 CREATE TEMPLATE 陳述式，可用來重新建立範本或建立具有修改的類似範本。

如需範本建立的詳細資訊，請參閱 [建立 範本](r_CREATE_TEMPLATE.md)。

## 所需的許可
<a name="r_SHOW_TEMPLATE-privileges"></a>

若要檢視範本定義，您必須具有下列其中一項：
+ 超級使用者權限
+ 範本上的 USAGE 權限和包含範本之結構描述上的 USAGE 權限

## 語法
<a name="r_SHOW_TEMPLATE-synopsis"></a>

```
SHOW TEMPLATE [database_name.][schema_name.]template_name;
```

## Parameters
<a name="r_SHOW_TEMPLATE-parameters"></a>

 *database\$1name*   
（選用） 建立範本的資料庫名稱。如果未指定，則會使用目前的資料庫。

 *schema\$1name*   
（選用） 建立範本的結構描述名稱。如果未指定，則會在目前的搜尋路徑中搜尋範本。

 *template\$1name*   
範本名稱。

## 範例
<a name="r_SHOW_TEMPLATE-examples"></a>

以下是範本 的 SHOW TEMPLATE 輸出範例`test_template`：

```
CREATE TEMPLATE test_template FOR COPY AS NOLOAD DELIMITER ',' ENCODING UTF16 ENCRYPTED;
```

```
SHOW TEMPLATE test_template;

CREATE OR REPLACE TEMPLATE dev.public.test_template FOR COPY AS ENCRYPTED NOLOAD ENCODING UTF16 DELIMITER ',';
```

下列範例會在結構描述 `demo_template`中建立範本`demo_schema`。

```
CREATE OR REPLACE TEMPLATE demo_schema.demo_template FOR COPY AS
ACCEPTANYDATE ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY' EXPLICIT_IDS ROUNDEC
TIMEFORMAT  AS 'DD.MM.YYYY HH:MI:SS' TRUNCATECOLUMNS NULL  AS 'null_string';
```

```
SHOW TEMPLATE demo_schema.demo_template;

CREATE OR REPLACE TEMPLATE dev.demo_schema.demo_template FOR COPY AS TRUNCATECOLUMNS NULL 'null_string' EXPLICIT_IDS TIMEFORMAT 'DD.MM.YYYY HH:MI:SS' ACCEPTANYDATE ROUNDEC ACCEPTINVCHARS DATEFORMAT 'DD-MM-YYYY';
```

# 顯示範本
<a name="r_SHOW_TEMPLATES"></a>

顯示結構描述中的範本清單及其屬性。

每個輸出列包含範本名稱、範本 ID、範本類型、範本擁有者、資料庫名稱、結構描述名稱、建立時間、上次修改時間和上次修改者。

如需完整的範本詳細資訊，包括範本參數，請參閱 [SYS\$1REDSHIFT\$1TEMPLATE](SYS_REDSHIFT_TEMPLATE.md)。

## 所需的許可
<a name="r_SHOW_TEMPLATES-privileges"></a>

若要檢視 Amazon Redshift 結構描述中的範本，您必須具有下列其中一項：
+ 超級使用者權限
+ 包含範本之結構描述的 USAGE 權限

## 語法
<a name="r_SHOW_TEMPLATES-synopsis"></a>

```
SHOW TEMPLATES FROM SCHEMA [database_name.]schema_name [LIKE 'filter_pattern'] [LIMIT row_limit ];
```

## Parameters
<a name="r_SHOW_TEMPLATES-parameters"></a>

 *database\$1name*   
（選用） 包含要列出之範本的資料庫名稱。如果未提供， 會使用目前的資料庫。

 *schema\$1name*   
包含要列出之範本的結構描述名稱。

 *filter\$1pattern*   
（選用） 有效的 UTF-8 字元表達式，具有符合範本名稱的模式。LIKE 選項會執行區分大小寫的比對，以支援下列模式比對中繼字元：      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_SHOW_TEMPLATES.html)
如果 *filter\$1pattern* 未包含任何中繼字元，則模式只代表字串本身，此時 LIKE 的功用如同等於運算子。

 *row\$1limit*   
傳回的最大資料列數。有效範圍為叢集上範本限制的 0 （預設為 1000)。

## 範例
<a name="r_SHOW_TEMPLATES-examples"></a>

```
SHOW TEMPLATES FROM SCHEMA s1;

 template_name          | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by
------------------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 template_maxerror      |      107685 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:10.514076 | 2025-12-16 19:31:10.514076 |              100
 json_template          |      107687 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:33.229566 | 2025-12-16 19:31:33.229567 |              100
 noload_template        |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
 csv_delimiter_template |      107688 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:42.354044 | 2025-12-16 19:31:42.354045 |              100
```

```
SHOW TEMPLATES FROM SCHEMA dev.s1 LIKE '%template' LIMIT 1;

 template_name  | template_id | template_type | template_owner | database_name | schema_name |        create_time         |     last_modified_time     | last_modified_by 
-----------------+-------------+---------------+----------------+---------------+-------------+----------------------------+----------------------------+------------------
 noload_template |      107686 | COPY          | alice          | dev           | s1          | 2025-12-16 19:31:17.370547 | 2025-12-16 19:31:17.370547 |              100
```

# SHOW VIEW
<a name="r_SHOW_VIEW"></a>

顯示檢視的定義，包括具體化視觀表和近期繫結檢視。您可以使用 SHOW VIEW 陳述式的輸出來重新建立檢視。

## 語法
<a name="r_SHOW_VIEW-synopsis"></a>

```
SHOW VIEW [schema_name.]view_name 
```

## Parameters
<a name="r_SHOW_VIEW-parameters"></a>

 *schema\$1name*   
(選擇性) 相關結構描述的名稱。

 *view\$1name*   
要顯示的檢視名稱。

## 範例
<a name="r_SHOW_VIEW-examples"></a>

 以下為 `LA_Venues_v` 檢視的檢視定義：

```
create view LA_Venues_v as select * from venue where venuecity='Los Angeles';
```

以下範例顯示 SHOW VIEW 命令和先前所定義檢視的輸出。

```
show view LA_Venues_v;
```

```
SELECT venue.venueid,
venue.venuename,
venue.venuecity,
venue.venuestate,
venue.venueseats
FROM venue WHERE ((venue.venuecity)::text = 'Los Angeles'::text);
```

以下為結構描述 `public` 中檢視 `public.Sports_v` 的檢視定義。

```
create view public.Sports_v as select * from category where catgroup='Sports';
```

以下範例顯示 SHOW VIEW 命令和先前所定義檢視的輸出。

```
show view public.Sports_v;
```

```
SELECT category.catid,
category.catgroup,
category.catname,
category.catdesc
FROM category WHERE ((category.catgroup)::text = 'Sports'::text);
```

# START TRANSACTION
<a name="r_START_TRANSACTION"></a>

BEGIN 函數的同義詞。

請參閱 [BEGIN](r_BEGIN.md)。

# TRUNCATE
<a name="r_TRUNCATE"></a>

刪除資料表中的所有資料列，但不執行資料表掃描：此操作是速度比非限定 DELETE 操作更快的替代方案。若要執行 TRUNCATE 命令，您必須具備資料表的 TRUNCATE 許可、是資料表的擁有者，或是超級使用者。若要授予截斷資料表的權限，請使用 [GRANT](r_GRANT.md) 命令。

TRUNCATE 比 DELETE 更有效率，而且不需要 VACUUM 和 ANALYZE。不過請注意，TRUNCATE 會遞交其執行所在的交易。

## 語法
<a name="r_TRUNCATE-synopsis"></a>

```
TRUNCATE [ TABLE ] table_name
```

此命令也適用於具體化視觀表。

```
TRUNCATE materialized_view_name
```

## Parameters
<a name="r_TRUNCATE-parameters"></a>

TABLE   
選用的關鍵字。

 *table\$1name*   
暫時性或持久性資料表。只有資料表的擁有者或超級使用者可將它截斷。  
您可以截斷任何資料表，包括外部索引鍵限制條件中參考的資料表。  
您不需要在截斷資料表之後將它清空。

 *materialized\$1view\$1name*   
具體化視觀表。  
您可以截斷用於 [將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md) 的具體化視觀表。

## 使用須知
<a name="r_TRUNCATE_usage_notes"></a>
+  TRUNCATE 命令會遞交其執行所在的交易；因此您無法轉返 TRUNCATE 操作，且 TRUNCATE 命令可能會在遞交本身的同時，遞交其他操作。
+ TRUNCATE 操作在連線至下列任一項的 Amazon Redshift 串流具體化視觀表上執行時，會保留獨佔鎖定：
  +  Amazon Kinesis Data Stream 
  +  Amazon Managed Streaming for Apache Kafka 主題 
  +  支援的外部串流，例如 Confluent Cloud Kafka 主題 

  如需詳細資訊，請參閱[將擷取串流至具體化視觀表](materialized-view-streaming-ingestion.md)。

## 範例
<a name="r_TRUNCATE-examples"></a>

使用 TRUNCATE 命令可刪除 CATEGORY 資料表中的所有資料列：

```
truncate category;
```

嘗試轉返 TRUNCATE 操作：

```
begin;

truncate date;

rollback;

select count(*) from date;
count
-------
0
(1 row)
```

DATE 資料表會在 ROLLBACK 命令之後保持空白，因為 TRUNCATE 命令會自動遞交。

下列範例會使用 TRUNCATE 命令，刪除具體化視觀表中的所有資料列。

```
truncate my_materialized_view;
```

它會刪除具體化視觀表中的所有記錄，並保持具體化視觀表及其結構描述不變。在查詢中，具體化視觀表名稱是一個範例。

# UNLOAD
<a name="r_UNLOAD"></a>


|  | 
| --- |
| 自 2025 年 4 月 30 日起，COPY 和 UNLOAD 命令的用戶端加密將不再開放給新客戶使用。如果您在 2025 年 4 月 30 日之前的 12 個月內使用用戶端加密搭配 COPY 和 UNLOAD 命令，您可以繼續使用用戶端加密搭配 COPY 或 UNLOAD 命令，直到 2026 年 4 月 30 日為止。2026 年 4 月 30 日之後，您將無法再針對 COPY 和 UNLOAD 使用用戶端加密。我們建議您盡快針對 COPY 和 UNLOAD 改用伺服器端加密。如果您已針對 COPY 和 UNLOAD 使用伺服器端加密，則不會有任何變更，而且您可以繼續使用，不需更改查詢。如需 COPY 和 UNLOAD 加密的詳細資訊，請參閱下方的 ENCRYPTED 參數。 | 

使用 Amazon S3 伺服器端加密 (SSE-S3)，將查詢的結果卸載至 Amazon S3 上的一或多個文字檔案、JSON 檔案或 Apache Parquet 檔案。您也可以指定使用 AWS Key Management Service 金鑰 (SSE-KMS) 的伺服器端加密。

依預設，卸載檔案的格式為以豎線分隔 (`|`) 的文字。

您可以設定 MAXFILESIZE 參數來管理 Amazon S3 上檔案的大小，以及藉由副檔名管理檔案數目。確定 S3 IP 範圍已新增至您的允許清單。若要進一步了解所需的 S3 IP 範圍，請參閱[網路隔離](https://docs.aws.amazon.com//redshift/latest/mgmt/security-network-isolation.html#network-isolation)。

您可以將 Amazon Redshift 查詢的結果以 Apache Parquet 卸載至您的 Amazon S3 資料湖，這是一種用於分析的高效率開放單欄式儲存格式。相較於文字格式，Parquet 格式的卸載速度提升達 2 倍，並且在 Amazon S3 中使用的儲存空間減少達 6 倍。這可以讓您將已在 Amazon S3 中執行的資料轉換和資料充實，以開放的格式儲存到您的 Amazon S3 資料湖。然後，您可以使用 Redshift Spectrum 和其他 AWS 服務來分析資料，例如 Amazon Athena、Amazon EMR 和 Amazon SageMaker AI。

若要取得有關使用 UNLOAD 命令的更多資訊和範例案例，請參閱 [在 Amazon Redshift 中卸載資料](c_unloading_data.md)。

## 所需的權限和許可
<a name="r_UNLOAD-permissions"></a>

為了使 UNLOAD 命令成功執行，至少需要資料庫中資料的 SELECT 權限，以及寫入 Amazon S3 位置的許可。如需存取 UNLOAD 命令 AWS 資源之許可的相關資訊，請參閱 [存取其他 AWS 資源的許可](copy-usage_notes-access-permissions.md)。

若要套用最低權限許可，請依照這些建議，視需要僅將許可授予執行命令的使用者。
+ 使用者必須具有資料的 SELECT 權限。如需如何限制資料庫權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。
+ 使用者需要許可，才能擔任 IAM 角色來寫入 AWS 帳戶中的 Amazon S3 儲存貯體。若要限制資料庫使用者擔任角色的存取權，請參閱《Amazon Redshift 管理指南》**中的[限制對 IAM 角色的存取](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service-database-users.html)。
+ 使用者需要能存取 Amazon S3 儲存貯體。若要使用 Amazon S3 儲存貯體政策限制許可，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 的儲存貯體政策](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)。

## 語法
<a name="r_UNLOAD-synopsis"></a>

```
UNLOAD ('select-statement')
TO 's3://object-path/name-prefix'
authorization
[ option, ...] 

where authorization is
IAM_ROLE { default | 'arn:aws:iam::<AWS 帳戶-id-1>:role/<role-name>[,arn:aws:iam::<AWS 帳戶-id-2>:role/<role-name>][,...]' }
            
where option is
| [ FORMAT [ AS ] ] CSV | PARQUET | JSON
| PARTITION BY ( column_name [, ... ] ) [ INCLUDE ]
| MANIFEST [ VERBOSE ]
| HEADER
| DELIMITER [ AS ] 'delimiter-char'
| FIXEDWIDTH [ AS ] 'fixedwidth-spec'
| ENCRYPTED [ AUTO ]
| BZIP2
| GZIP
| ZSTD
| ADDQUOTES
| NULL [ AS ] 'null-string'
| ESCAPE
| ALLOWOVERWRITE
| CLEANPATH
| PARALLEL [ { ON | TRUE } | { OFF | FALSE } ]
| MAXFILESIZE [AS] max-size [ MB | GB ]
| ROWGROUPSIZE [AS] size [ MB | GB ]
| REGION [AS] 'aws-region' }
| EXTENSION 'extension-name'
```

## Parameters
<a name="unload-parameters"></a>

('*select-statement*')   
SELECT 查詢。查詢的結果會卸載。大多數情況下，藉由在查詢中指定 ORDER BY 子句依排序順序卸載資料會有其實用性。此方式可節省重新載入資料時，排序資料所需的時間。  
查詢必須用單引號括住，如下所示：  

```
('select * from venue order by venueid')
```
如果您的查詢包含引號 (例如為了將常值括住)，請將常值放在兩組單引號內，您也必須將查詢放在單引號之間：  

```
('select * from venue where venuestate=''NV''')
```

TO 's3://*object-path/name-prefix*'  
Amazon S3 上 Amazon Redshift 將寫入輸出檔案物件之位置的完整路徑 (包括儲存貯體名稱在內)，若指定了 MANIFEST，則包括資訊清單檔案。物件名稱前面會加上 *name-prefix*。如果您使用 `PARTITION BY`，會自動視需要將一個斜線 (/) 新增到 *name-prefix* 值的結尾。為了提升安全性，UNLOAD 會使用 HTTPS 連線連接至 Amazon S3。根據預設，UNLOAD 會在每個分割中寫入一個或多個檔案。UNLOAD 會在指定的名稱字首附加分割號碼和部分編號，如下所示：  
`<object-path>/<name-prefix><slice-number>_part_<part-number>`.   
若指定了 MANIFEST，則會寫入資訊清單檔案，如下所示：  
`<object_path>/<name_prefix>manifest`.   
如果指定 PARALLEL 為 OFF，資料檔案會寫入如下：  
`<object_path>/<name_prefix><part-number>`.   
UNLOAD 會使用 Amazon S3 伺服器端加密 (SSE) 自動建立加密檔案，若使用了 MANIFEST，則也會包括資訊清單檔案。COPY 命令會在載入操作期間自動讀取伺服器端加密檔案。您可以使用 Amazon S3 主控台或 API，透明地從儲存貯體下載伺服器端加密檔案。如需詳細資訊，請參閱[使用伺服器端加密保護資料](https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html)。  
當 Amazon S3 儲存貯體與 Amazon Redshift 資料庫不在相同 AWS 區域 內時，就需要 REGION。

*authorization*  
UNLOAD 命令需要授權才能將資料寫入 Amazon S3。UNLOAD 命令會使用與 COPY 命令相同的參數進行授權。如需詳細資訊，請參閱 COPY 命令語法參考中的 [授權參數](copy-parameters-authorization.md)。

IAM\$1ROLE \$1 default \$1 'arn:aws:iam::*<AWS 帳戶-id-1>*:role/*<role-name>*'  <a name="unload-iam"></a>
使用預設關鍵字，讓 Amazon Redshift 使用設定為預設並在執行 UNLOAD 命令時與叢集關聯的 IAM 角色。  
對叢集進行身分驗證和授權時所使用的 IAM 角色使用 Amazon Resource Name (ARN)。如果指定 IAM\$1ROLE，則不能使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY、SESSION\$1TOKEN 或 CREDENTIALS。IAM\$1ROLE 可以鏈結。如需詳細資訊，請參閱《Amazon Redshift 管理指南》**中的[鏈結 IAM 角色](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html#authorizing-redshift-service-chaining-roles)。

[ FORMAT [AS] ] CSV \$1 PARQUET \$1 JSON  <a name="unload-csv"></a>
關鍵字，用來指定取代預設格式的卸載格式。  
使用 CSV 時，會使用逗號 ( , ) 字元做為預設分隔符號卸載至 CSV 格式的文字檔案。如果欄位包含分隔符號、雙引號、新行字元或歸位字元，已卸載檔案中的欄位便會括在雙引號中。資料欄位中的雙引號會使用額外的雙引號進行逸出。卸載零個資料列時，Amazon Redshift 可能會寫入空的 Amazon S3 物件。  
使用 PARQUET 時，會卸載至 Apache Parquet 1.0 版格式的檔案。根據預設，每個資料列群組都會使用 SNAPPY 壓縮進行壓縮。如需 Apache Parquet 格式的相關資訊，請參閱 [Parquet](https://parquet.apache.org/)。  
使用 JSON 時會卸載到 JSON 文件，每行都會包含一個 JSON 物件，代表查詢結果中的完整記錄。當查詢結果包含 SUPER 資料欄時，Amazon Redshift 支援編寫巢狀 JSON。若要建立有效的 JSON 物件，查詢中每個資料欄的名稱必須是唯一的。在 JSON 文件中，布林值會卸載為 `t` 或 `f`，NULL 值會被卸載為 `null`。卸載零個資料列時，Amazon Redshift 不會寫入 Amazon S3 物件。  
FORMAT 和 AS 關鍵字是選用的。您無法使用 CSV 搭配 ESCAPE、FIXEDWIDTH 或 ADDQUOTES。您無法搭配 DELIMITER、FIXEDWIDTH、ADDQUOTES、ESCAPE、NULL AS、HEADER、GZIP、BZIP2 或 ZSTD 使用 PARQUET。搭配 ENCRYPTED 的 PARQUET 僅支援使用 AWS Key Management Service 金鑰 (SSE-KMS) 的伺服器端加密。您無法搭配 DELIMITER、HEADER、FIXEDWIDTH、ADDQUOTES、ESCAPE 或 NULL AS 使用 JSON。

PARTITION BY ( *column\$1name* [, ... ] ) [INCLUDE]  <a name="unload-partitionby"></a>
指定卸載操作的分割區索引鍵。UNLOAD 會依序根據分割區索引鍵的值和 Apache Hive 慣例，自動將輸出檔案分到分割資料夾。例如，屬於 2019 年分割區和九月分割區的 Parquet 檔案便會具有以下字首：`s3://amzn-s3-demo-bucket/my_prefix/year=2019/month=September/000.parquet`。  
*column\$1name* 的值必須是正在卸載查詢結果中的資料行。  
如果您指定 PARTITION BY 搭配 INCLUDE 選項，則不會從上傳的檔案中移除分割區資料欄。  
Amazon Redshift 不支援 PARTITION BY 子句中的字串文字。

MANIFEST [ VERBOSE ]  
會建立資訊清單檔案，當中明確列出 UNLOAD 程序建立的資料檔案的詳細資訊。清單檔案是 JSON 格式的文字檔，其中列出寫入 Amazon S3 的每個檔案的 URL。  
如果指定 MANIFEST 時搭配 VERBOSE 選項，則資訊清單會包含下列詳細資訊：  
+ 資料欄名稱和資料類型，以及針對 CHAR、VARCHAR 或 NUMERIC 資料類型，每個資料欄的維度。針對 CHAR 和 VARCHAR 資料類型，維度為長度。針對 DECIMAL 或 NUMERIC 資料類型，維度為精確度和規模。
+ 卸載至每個檔案的資料列計數。如果指定了 HEADER 選項，則資料列計數會包括標題行。
+ 卸載的所有檔案的檔案大小總計以及卸載至所有檔案的資料列計數總計。如果指定了 HEADER 選項，則資料列計數會包括標題行。
+ 作者。作者一律是 "Amazon Redshift"。
您只能在 MANIFEST 之後指定 VERBOSE。  
資訊清單檔案會寫入與卸載檔案相同的 Amazon S3 路徑字首，其格式為 `<object_path_prefix>manifest`。例如，若 UNLOAD 指定 Amazon S3 路徑字首 '`s3://amzn-s3-demo-bucket/venue_`'，則資訊清單檔案的位置會是 '`s3://amzn-s3-demo-bucket/venue_manifest`'。

HEADER  
在每個輸出檔案上方新增包含資料欄名稱的標題行。文字轉換選項，例如 CSV、DELIMITER、ADDQUOTES 和 ESCAPE，也適用標題行。您無法使用 HEADER 與 FIXEDWIDTH 搭配。

DELIMITER AS '*delimiter\$1character*'  
指定單一 ASCII 字元，用以分隔輸出檔案中的欄位，例如縱線字元 ( \$1 )、逗號 ( , ) 或 Tab 字元 ( \$1t )。文字檔的預設分隔符號為縱線字元。CSV 檔的預設分隔符號為逗號字元。AS 關鍵字為選用。您無法使用 DELIMITER 與 FIXEDWIDTH 搭配。若資料包含分隔符號字元，您需要指定 ESCAPE 選項來逸出分隔符號，或使用 ADDQUOTES 將資料括在雙引號中。或者，指定資料中未包含的分隔符號。

FIXEDWIDTH '*fixedwidth\$1spec*'  
將資料卸載至每個欄寬是固定長度 (而不是以分隔字元隔開) 的檔案。*fixedwidth\$1spec* 是字串，指定資料欄數和欄寬。AS 關鍵字為選用。由於 FIXEDWIDTH 不會截斷資料，因此 UNLOAD 陳述式中每個資料欄的規格都必須至少為該資料欄最長項目的長度。*fixedwidth\$1spec* 的格式如下所示：  

```
'colID1:colWidth1,colID2:colWidth2, ...'
```
您無法使用 FIXEDWIDTH 與 DELIMITER 或 HEADER 搭配。

ENCRYPTED [AUTO]  <a name="unload-parameters-encrypted"></a>
指定 Amazon S3 上的輸出檔案將使用 Amazon S3 伺服器端加密進行加密。若指定了 MANIFEST，則也會加密資訊清單檔案。如需詳細資訊，請參閱[卸載加密的資料檔案](t_unloading_encrypted_files.md)。如果您未指定 ENCRYPTED 參數，UNLOAD 會使用 Amazon S3 伺服器端加密搭配受管加密金鑰 AWS(SSE-S3) 自動建立加密檔案。  
對於 ENCRYPTED，您可能想要使用伺服器端加密搭配 AWS KMS 金鑰 (SSE-KMS) 卸載至 Amazon S3。如果是這種情況，請使用 [KMS_KEY_ID](#unload-parameters-kms-key-id) 參數來提供金鑰 ID。您無法使用 [使用 CREDENTIALS 參數](copy-parameters-authorization.md#copy-credentials) 參數搭配 KMS\$1KEY\$1ID 參數。如果您使用 KMS\$1KEY\$1ID 針對資料執行 UNLOAD 命令，您接著便可以針對相同的資料執行 COPY 操作，而無須指定金鑰。  
如果使用 ENCRYPTED AUTO，UNLOAD 命令會擷取目標 Amazon S3 儲存貯體屬性上的預設 AWS KMS 加密金鑰，並使用 AWS KMS 金鑰加密寫入 Amazon S3 的檔案。如果儲存貯體沒有預設 AWS KMS 加密金鑰，UNLOAD 會使用 Amazon Redshift 伺服器端加密搭配 AWS受管加密金鑰 (SSE-S3) 自動建立加密檔案。您無法搭配 KMS\$1KEY\$1ID、MASTER\$1SYMMETRIC\$1KEY 或包含 master\$1symmetric\$1key 的 CREDENTIALS 使用此選項。

KMS\$1KEY\$1ID '*key-id*'  <a name="unload-parameters-kms-key-id"></a>
指定用於加密 Amazon S3 上資料檔案之 AWS Key Management Service (AWS KMS) 金鑰的金鑰 ID。如需詳細資訊，請參閱[什麼是 AWS Key Management Service？](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 如果您指定 KMS\$1KEY\$1ID，則必須一併指定 [ENCRYPTED](#unload-parameters-encrypted) 參數。如果您指定 KMS\$1KEY\$1ID，則不能使用 CREDENTIALS 參數進行驗證。請改用 [使用 IAM\$1ROLE 參數](copy-parameters-authorization.md#copy-iam-role) 或 [使用 ACCESS\$1KEY\$1ID 和 SECRET\$1ACCESS\$1KEY 參數](copy-parameters-authorization.md#copy-access-key-id)。

BZIP2   
將資料卸載至每個分割中的一個或多個 bzip2 壓縮檔。產生的每個檔案都會附加 `.bz2` 副檔名。

GZIP   
將資料卸載至每個分割中的一個或多個 gzip 壓縮檔。產生的每個檔案都會附加 `.gz` 副檔名。

ZSTD   
將資料卸載至每個分割中的一個或多個 Zstandard 壓縮檔。產生的每個檔案都會附加 `.zst` 副檔名。

ADDQUOTES   
在每個卸載的資料欄位前後加上引號，如此 Amazon Redshift 就能卸載包含分隔符號本身的資料值。例如，如果分隔符號是逗號，您可以成功卸載並重新載入下列資料：  

```
 "1","Hello, World" 
```
如果沒有新增雙引號，`Hello, World` 字串將會剖析為兩個不同欄位。  
某些輸出格式不支援 ADDQUOTES。  
若您使用 ADDQUOTES，則必須在重新載入資料時，於 COPY 中指定 REMOVEQUOTES。

NULL AS '*null-string*'  
指定一個字串，代表卸載檔案中的 null 值。若使用此選項，所有輸出檔案都會包含指定的字串，用以取代所選取資料中找到的任何 null 值。若未指定此選項，則 null 值會卸載為：  
+ 分隔符號輸出的零長度字串 
+ 固定寬度輸出的空白字串
若針對固定寬度卸載指定 null 字串，而輸出資料欄的寬度小於 null 字串的寬度，則會發生下列行為：  
+ 非字元資料欄的輸出為空欄位 
+ 針對字元資料欄回報錯誤 
與其他使用者定義字串代表 null 值的資料類型不同，Amazon Redshift 會使用 JSON 格式匯出 SUPER 資料欄，並在 JSON 格式決定時將其表示為 null 值。因此，SUPER 資料欄會忽略 UNLOAD 命令中使用的 NULL [AS] 選項。

ESCAPE   
分隔符號卸載檔案的 CHAR 和 VARCHAR 資料欄中會放入逸出字元 (`\`)，位於出現下列字元的每個位置前面：  
+ 換行：`\n`
+ 歸位字元: `\r`
+ 針對卸載資料指定的分隔符號字元。
+ 逸出字元：`\`
+ 引號字元：`"` 或 `'` (如果 UNLOAD 命令中同時指定了 ESCAPE 與 ADDQUOTES)。
如果您使用 COPY 搭配 ESCAPE 選項載入資料，則在 UNLOAD 命令中也必須指定 ESCAPE 選項，以產生具相互關係的輸出檔案。同樣地，如果您使用 ESCAPE 選項執行 UNLOAD，則在 COPY 相同的資料時需要使用 ESCAPE。

ALLOWOVERWRITE   <a name="allowoverwrite"></a>
根據預設，若找到可能會覆寫的檔案，則 UNLOAD 會失敗。若指定了 ALLOWOVERWRITE，UNLOAD 會覆寫現有檔案，包括資訊清單檔案。

CLEANPATH  <a name="cleanpath"></a>
在將檔案卸載到指定位置之前，CLEANPATH 選項會移除 TO 子句中指定之 Amazon S3 路徑中的現有檔案。  
如果您包含 PARTITION BY 子句，則只會從分割區資料夾中移除現有檔案，以接收 UNLOAD 作業所產生的新檔案。  
您必須具有 Amazon S3 儲存貯體的 `s3:DeleteObject` 許可。如需詳細資訊，請參閱《Amazon Simple Storage Service 使用者指南》**中的 [Amazon S3 的政策和許可](https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-policy-language-overview.html)。您使用 CLEANPATH 選項移除的檔案會永久刪除，且無法復原。如果目標 Amazon S3 儲存貯體已啟用版本控制，則 UNLOAD 搭配 CLEANPATH 選項不會移除檔案的先前版本。  
如果您指定 ALLOWOVERWRITE 選項，則無法指定 CLEANPATH 選項。

PARALLEL   <a name="unload-parallel"></a>
依預設，UNLOAD 會根據叢集中的分割數，將資料平行寫入多個檔案。預設選項為 ON 或 TRUE。若 PARALLEL 為 OFF 或 FALSE，則 UNLOAD 會依序寫入一個或多個資料檔案，並絕對會根據 ORDER BY 子句 (如有使用的話) 排序。資料檔案大小上限為 6.2 GB。因此，假如您卸載 13.4 GB 的資料，UNLOAD 會建立下列三個檔案。  

```
s3://amzn-s3-demo-bucket/key000    6.2 GB
s3://amzn-s3-demo-bucket/key001    6.2 GB
s3://amzn-s3-demo-bucket/key002    1.0 GB
```
UNLOAD 命令是設計為使用平行處理。我們建議在多數的情況將 PARALLEL 保持為啟用，特別是在使用 COPY 命令將檔案是用來載入資料表時。

MAXFILESIZE [AS] max-size [ MB \$1 GB ]   <a name="unload-maxfilesize"></a>
指定 UNLOAD 在 Amazon S3 中建立的檔案大小上限。指定介於 5 MB 和 6.2 GB 之間的小數值。AS 關鍵字為選用。預設單位為 MB。如果未指定 MAXFILESIZE，則預設的檔案大小上限為 6.2 GB。資訊清單檔案的大小 (如有使用的話) 不受 MAXFILESIZE 的影響。

ROWGROUPSIZE [AS] size [ MB \$1 GB ]   <a name="unload-rowgroupsize"></a>
指定資料列群組的大小。選擇較大的大小可減少資料列群組的數目，進而減少網路通訊量。請指定介於 32 MB 到 128 MB 之間的整數值。AS 關鍵字為選用。預設單位為 MB。  
若沒有指定 ROWGROUPSIZE，則預設大小為 32 MB。若要使用此參數，儲存格式必須是 Parquet，且節點類型必須是 ra3.4xlarge、ra3.16xlarge 或 dc2.8xlarge。

REGION [AS] '*aws-region*'  <a name="unload-region"></a>
指定目標 Amazon S3 AWS 區域 儲存貯體所在的 。UNLOAD 到與 Amazon Redshift 資料庫不相同的 Amazon S3 AWS 區域 儲存貯體時需要 REGION。  
*aws\$1region* 的值必須符合 Amazon Redshift AWS 區域和端點資料表中列出的區域*AWS 一般參考*。 [https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region](https://docs.aws.amazon.com/general/latest/gr/rande.html#redshift_region)  
根據預設，UNLOAD 會假設目標 Amazon S3 儲存貯體與 AWS 區域 Amazon Redshift 資料庫位於相同的 中。

EXTENSION '*extension-name*'  <a name="unload-extension"></a>
指定要附加到卸載檔案名稱的副檔名。Amazon Redshift 不會執行任何驗證，因此您必須確認指定的副檔名是否正確。如果您指定壓縮方法而不提供副檔名，Amazon Redshift 只會將壓縮方法的副檔名新增至檔案名稱。如果您未提供任何副檔名，且未指定壓縮方法，Amazon Redshift 不會在檔案名稱中加入任何內容。

## 使用須知
<a name="unload-usage-notes"></a>

### 針對所有分隔文字的 UNLOAD 操作使用 ESCAPE
<a name="unload-usage-escape"></a>

當您使用分隔符號執行 UNLOAD，則您的資料中可能包括分隔符號或 ESCAPE 選項說明中列出的任何字元。在這種情況下，則您必須在 UNLOAD 陳述式中使用 ESCAPE 選項。若您未使用 ESCAPE 選項搭配 UNLOAD，則後續使用卸載資料的 COPY 操作可能會失敗。

**重要**  
強烈建議您一律使用 ESCAPE 搭配 UNLOAD 和 COPY 陳述式。如果您確定資料未包含任何分隔符號或可能需要逸出的其他字元，則為例外。

### 浮點數精確度喪失
<a name="unload-usage-floating-point-precision"></a>

您可能遇到後續卸載並重新載入的浮點資料精確度喪失的情況。

### Limit 子句
<a name="unload-usage-limit-clause"></a>

SELECT 查詢無法在外部 SELECT 中使用 LIMIT 子句。例如，以下 UNLOAD 陳述式會失敗。

```
unload ('select * from venue limit 10')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

請改為使用巢狀 LIMIT 子句，如下列範例所示。

```
unload ('select * from venue where venueid in
(select venueid from venue order by venueid desc limit 10)')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

您也可以使用 SELECT…INTO 或使用 LIMIT 子句的 CREATE TABLE AS 填入資料表，然後從該資料表卸載。

### 卸載 GEOMETRY 資料類型的欄位
<a name="unload-usage-geometry"></a>

您只能將 GEOMETRY 資料行卸載至文字或 CSV 格式。您無法卸載包含 `FIXEDWIDTH` 選項的 GEOMETRY 資料。資料會以擴充已知二進位 (EWKB) 格式的十六進位形式卸載。如果 EWKB 資料的大小超過 4 MB，則會發生警告，因為資料稍後將無法載入資料表。

### 卸載 HLLSKETCH 資料類型
<a name="unload-usage-hll"></a>

您只能將 HLLSKETCH 資料欄卸載至文字或 CSV 格式。您無法卸載包含 `FIXEDWIDTH` 選項的 HLLSKETCH 資料。如果是密集的 HyperLogLog 示意圖，資料會以 Base64 格式卸載，或以 JSON 格式卸載稀疏 HyperLogLog 示意圖。如需詳細資訊，請參閱[HyperLogLog 檔函數](hyperloglog-functions.md)。

下列範例會將包含 HLLSKETCH 資料欄的資料表匯出至檔案。

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

UNLOAD ('select * from hll_table') TO 's3://amzn-s3-demo-bucket/unload/'
IAM_ROLE 'arn:aws:iam::0123456789012:role/MyRedshiftRole' NULL AS 'null' ALLOWOVERWRITE CSV;
```

### 卸載 VARBYTE 資料類型的資料欄
<a name="unload-usage-varbyte"></a>

您只能將 VARBYTE 資料欄卸載至文字或 CSV 格式。資料會以十六進位形式卸載。您無法卸載包含 `FIXEDWIDTH` 選項的 VARBYTE 資料。不支援 UNLOAD CSV 的 `ADDQUOTES` 選項。VARBYTE 資料欄不能是 PARTITIONED BY 資料欄。

### FORMAT AS PARQUET 子句
<a name="unload-parquet-usage"></a>

使用 FORMAT AS PARQUET 時，請注意這些考量：
+ 卸載至 Parquet 不會使用檔案層級壓縮。每個資料列群組都會使用 SNAPPY 壓縮。
+ 如果未指定 MAXFILESIZE，則預設的檔案大小上限為 6.2 GB。您可以使用 MAXFILESIZE 來指定 5 MB – 6.2 GB 的檔案大小。實際檔案大小會在寫入檔案時估算，因此可能不會與您指定的數字完全相等。

  為了最大化掃描效能，Amazon Redshift 會嘗試建立包含 32-MB 相等大小資料列群組的 Parquet 檔案。您指定的 MAXFILESIZE 會自動四捨五入至最近的 32 MB 倍數。例如，如果您指定 MAXFILESIZE 為 200 MB，則每個卸載的 Parquet 檔案大約會是 192 MB (32 MB 資料列群組 x 6 = 192 MB)。
+ 如果資料行使用 TIMESTAMPTZ 資料格式，則只會卸載時間戳記的值。不會卸載時區資訊。
+ 請不要指定以底線 (\$1) 或句號 (.) 字元開頭的檔案名稱字首。Redshift Spectrum 會將以這些字元開頭的檔案視為隱藏檔案並進行忽略。

### PARTITION BY 子句
<a name="unload-partitionby-usage"></a>

使用 PARTITION BY 時，請注意這些考量：
+ 分割區資料行不會包含在輸出檔案中。
+ 請務必在用於 UNLOAD 陳述式的 SELECT 查詢中包含分割區資料行。您可以在 UNLOAD 命令中指定任何數量的分割區資料行。但是，其中一個限制是檔案內至少應包含一個非分割區資料行。
+ 如果分割區索引鍵的值為 Null，Amazon Redshift 會自動將該資料卸載至稱為 `partition_column=__HIVE_DEFAULT_PARTITION__` 的預設分割區。
+ UNLOAD 命令不會對外部目錄進行任何呼叫。如要註冊您新的分割區，使其成為您現有外部資料表的一部分，請使用單獨的 ALTER TABLE … ADD PARTITION … 命令。或者，您可以執行 CREATE EXTERNAL TABLE 命令來將已卸載的資料註冊為新的外部資料表。您也可以使用 AWS Glue 爬蟲程式來填入 Data Catalog。如需詳細資訊，請參閱《AWS Glue 開發人員指南》**中的[定義爬蟲程式](https://docs.aws.amazon.com/glue/latest/dg/add-crawler.html)。
+ 如果您使用 MANIFEST 選項，Amazon Redshift 只會在根 Amazon S3 資料夾中產生一個資訊清單檔案。
+ 您可以用來做為分割區索引鍵的資料欄資料類型為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、BOOLEAN、CHAR、VARCHAR、DATE 和 TIMESTAMP。

### 使用 ASSUMEROLE 權限授予 (IAM) 角色存取權以進行 UNLOAD 操作
<a name="unload-assumerole-privilege-usage"></a>

若要讓特定使用者和群組存取 IAM 角色以進行 UNLOAD 操作，超級使用者可以將 IAM 角色的 ASSUMEROLE 權限授予使用者和群組。如需相關資訊，請參閱[GRANT](r_GRANT.md)。

### UNLOAD 不支援 Amazon S3 Access Points 別名
<a name="unload-usage-s3-access-point-alias"></a>

您無法搭配 UNLOAD 命令使用 Amazon S3 Access Points 別名。

## 範例
<a name="r_UNLOAD-examples"></a>

如需顯示如何使用 UNLOAD 命令的範例，請參閱 [UNLOAD 範例](r_UNLOAD_command_examples.md)。

# UNLOAD 範例
<a name="r_UNLOAD_command_examples"></a>

這些範例會示範 UNLOAD 命令的各種參數。許多範例都會使用 TICKIT 範例資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

**注意**  
這些範例包含換行以方便閱讀。請勿在 *credentials-args* 字串中包含換行或空格。

## 將 VENUE 卸載至縱線分隔檔案 (預設分隔符號)
<a name="unload-examples-venue"></a>

下列範例會卸載 VENUE 資料表並將資料寫入 `s3://amzn-s3-demo-bucket/unload/`：

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

根據預設，UNLOAD 會在每個分割中寫入一個或多個檔案。假設有一個雙節點叢集，且每個節點有兩個分割，則上方範例會在 `amzn-s3-demo-bucket` 中建立這些檔案：

```
unload/0000_part_00
unload/0001_part_00
unload/0002_part_00
unload/0003_part_00
```

為了能更清楚區分輸出檔案，您可以在位置中包含字首。下列範例會卸載 VENUE 資料表並將資料寫入 `s3://amzn-s3-demo-bucket/unload/venue_pipe_`：

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

結果會是 `unload` 資料夾中的這四個檔案，同樣假設有四個分割。

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## 將 LINEITEM 資料表卸載至已分割的 Parquet 檔案
<a name="unload-examples-partitioned-parquet"></a>

以下範例會使用以 `l_shipdate` 資料行分割的 Parquet 格式卸載 LINEITEM 資料表。

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate);
```

假設有四個分割，則結果產生的 Parquet 檔案會以動態方式分成不同的資料夾。

```
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-02/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-03/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
s3://amzn-s3-demo-bucket/lineitem/l_shipdate=1992-01-04/0000_part_00.parquet
                                             0001_part_00.parquet
                                             0002_part_00.parquet
                                             0003_part_00.parquet
...
```

**注意**  
在某些情況下，UNLOAD 命令會使用 INCLUDE 選項，如下列 SQL 陳述式中所示。  

```
unload ('select * from lineitem')
to 's3://amzn-s3-demo-bucket/lineitem/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
PARQUET
PARTITION BY (l_shipdate) INCLUDE;
```
在這些情況下，`l_shipdate` 資料欄也在 Parquet 檔案的資料中。否則，`l_shipdate` 資料欄資料不在 Parquet 檔案中。

## 將 VENUE 資料表卸載到 JSON 檔案中
<a name="unload-examples-json"></a>

下列範例會卸載 VENUE 資料表，並以 JSON 格式寫入資料至 `s3://amzn-s3-demo-bucket/unload/`。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
JSON;
```

以下是 VENUE 資料表的範例資料列。

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

卸載到 JSON 後，檔案的格式類似於以下內容。

```
{"venueid":1,"venuename":"Pinewood Racetrack","venuecity":"Akron","venuestate":"OH","venueseats":0}
{"venueid":2,"venuename":"Columbus \"Crew\" Stadium ","venuecity":"Columbus","venuestate":"OH","venueseats":0}
{"venueid":4,"venuename":"Community, Ballpark, Arena","venuecity":"Kansas City","venuestate":"KS","venueseats":0}
```

## 將 VENUE 卸載至 CSV 檔案
<a name="unload-examples-csv"></a>

下列範例會卸載 VENUE 資料表，並以 CSV 格式寫入資料至 `s3://amzn-s3-demo-bucket/unload/`。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV;
```

假設 VENUE 資料表包含下列資料列。

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-----------
      1 | Pinewood Racetrack         | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

卸載檔案看起來類似下列。

```
1,Pinewood Racetrack,Akron,OH,0
2,"Columbus ""Crew"" Stadium",Columbus,OH,0
4,"Community, Ballpark, Arena",Kansas City,KS,0
```

## 使用分隔符號將 VENUE 卸載到 CSV 檔案
<a name="unload-examples-csv-delimiter"></a>

下列範例會卸載 VENUE 資料表，並使用縱線字元 (\$1) 做為分隔符號，寫入 CSV 格式的資料。卸載的檔案會寫入到 `s3://amzn-s3-demo-bucket/unload/`。此範例中的 VENUE 資料表在第一列 (`Pinewood Race|track`) 的值中包含縱線字元。它這樣做是為了表明結果中的值用雙引號括住。雙引號會逸出雙引號，而整個欄位會用雙引號括住。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
CSV DELIMITER AS '|';
```

假設 VENUE 資料表包含下列資料列。

```
venueid | venuename                  | venuecity       | venuestate | venueseats
--------+----------------------------+-----------------+------------+-------------
      1 | Pinewood Race|track        | Akron           | OH         | 0
      2 | Columbus "Crew" Stadium    | Columbus        | OH         | 0
      4 | Community, Ballpark, Arena | Kansas City     | KS         | 0
```

卸載檔案看起來類似下列。

```
1|"Pinewood Race|track"|Akron|OH|0
2|"Columbus ""Crew"" Stadium"|Columbus|OH|0
4|Community, Ballpark, Arena|Kansas City|KS|0
```

## 使用資訊清單檔案卸載 VENUE
<a name="unload-examples-manifest"></a>

若要建立資訊清單檔案，請包括 MANIFEST 選項。下列範例會卸載 VENUE 資料表，並將資訊清單檔案與資料檔案一起寫入 s3://amzn-s3-demo-bucket/venue\$1pipe\$1：

**重要**  
若您使用 MANIFEST 選項卸載檔案，則應在載入檔案時使用 MANIFEST 選項搭配 COPY 命令。若您使用相同的字首載入檔案且未指定 MANIFEST 選項，則 COPY 會失敗，因為它會假設資訊清單檔案是資料檔案。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

結果會是這五個檔案：

```
s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00
s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00
s3://amzn-s3-demo-bucket/venue_pipe_manifest
```

以下示範資訊清單檔案的內容。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0000_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0001_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0002_part_00"},
    {"url":"s3://amzn-s3-demo-bucket/tickit/venue_0003_part_00"}
  ]
}
```

## 使用 MANIFEST VERBOSE 卸載 VENUE
<a name="unload-examples-manifest-verbose"></a>

指定 MANIFEST VERBOSE 選項時，資訊清單檔案會包含下列區段：
+ `entries` 區段會列出每個檔案的 Amazon S3 路徑、檔案大小和資料列計數。
+ `schema` 區段會列出每個資料欄的資料欄名稱、資料類型和維度。
+ `meta` 區段會顯示所有檔案的檔案大小總計和資料列計數。

下列範例會使用 MANIFEST VERBOSE 選項來卸載 VENUE 資料表。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload_venue_folder/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest verbose;
```

以下示範資訊清單檔案的內容。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0000_part_00", "meta": { "content_length": 32295, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0001_part_00", "meta": { "content_length": 32771, "record_count": 20 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0002_part_00", "meta": { "content_length": 32302, "record_count": 10 }},
    {"url":"s3://amzn-s3-demo-bucket/venue_pipe_0003_part_00", "meta": { "content_length": 31810, "record_count": 15 }}
  ],
  "schema": {
    "elements": [
      {"name": "venueid", "type": { "base": "integer" }},
      {"name": "venuename", "type": { "base": "character varying", 25 }},
      {"name": "venuecity", "type": { "base": "character varying", 25 }},
      {"name": "venuestate", "type": { "base": "character varying", 25 }},
      {"name": "venueseats", "type": { "base": "character varying", 25 }}
    ]
  },
  "meta": {
    "content_length": 129178,
    "record_count": 55
  },
  "author": {
    "name": "Amazon Redshift",
    "version": "1.0.0"
  }
}
```

## 使用標題卸載 VENUE
<a name="unload-examples-header"></a>

以下範例會使用標題列卸載 VENUE。

```
unload ('select * from venue where venueseats > 75000')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
header
parallel off;
```

以下示範資訊具有標題列的輸出檔案的內容。

```
venueid|venuename|venuecity|venuestate|venueseats
6|New York Giants Stadium|East Rutherford|NJ|80242
78|INVESCO Field|Denver|CO|76125
83|FedExField|Landover|MD|91704
79|Arrowhead Stadium|Kansas City|MO|79451
```

## 將 VENUE 卸載至更小的檔案
<a name="unload-examples-maxfilesize"></a>

根據預設，檔案大小的上限為 6.2 GB。如果卸載資料大於 6.2 GB，則 UNLOAD 會為每個 6.2 GB 資料區段建立一個新檔案。若要建立更小的檔案，請包括 MAXFILESIZE 參數。假設先前範例中的資料大小為 20 GB，則下列 UNLOAD 命令會建立 20 個檔案，每個檔案的大小為 1 GB。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
maxfilesize 1 gb;
```

## 依序卸載 VENUE
<a name="unload-examples-serial"></a>

若要依序卸載，請指定 PARALLEL OFF。如此 UNLOAD 就會一次寫入一個檔案，直到每個檔案達到 6.2 GB 上限為止。

下列範例會卸載 VENUE 資料表並依序將資料寫入 `s3://amzn-s3-demo-bucket/unload/`。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off;
```

結果會產生一個名為 venue\$1serial\$1000 的檔案。

如果卸載資料大於 6.2 GB，則 UNLOAD 會為每個 6.2 GB 資料區段建立一個新檔案。下列範例會卸載 LINEORDER 資料表並依序將資料寫入 `s3://amzn-s3-demo-bucket/unload/`。

```
unload ('select * from lineorder')
to 's3://amzn-s3-demo-bucket/unload/lineorder_serial_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
parallel off gzip;
```

結果會是下方的一系列檔案。

```
lineorder_serial_0000.gz
lineorder_serial_0001.gz
lineorder_serial_0002.gz
lineorder_serial_0003.gz
```

為了能更清楚區分輸出檔案，您可以在位置中包含字首。下列範例會卸載 VENUE 資料表並將資料寫入 `s3://amzn-s3-demo-bucket/venue_pipe_`：

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/unload/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

結果會是 `unload` 資料夾中的這四個檔案，同樣假設有四個分割。

```
venue_pipe_0000_part_00
venue_pipe_0001_part_00
venue_pipe_0002_part_00
venue_pipe_0003_part_00
```

## 從卸載檔案載入 VENUE
<a name="unload-examples-load"></a>

若要從一組卸載檔案載入資料表，只要使用 COPY 命令將程序反向即可。下列範例會建立 LOADVENUE 這個新資料表，並從先前範例中建立的資料檔案載入資料表。

```
create table loadvenue (like venue);

copy loadvenue from 's3://amzn-s3-demo-bucket/venue_pipe_' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

若您使用 MANIFEST 選項在卸載檔案中建立資訊清單檔案，則您可以使用相同的資訊清單檔案載入資料。您可以使用 COPY 命令搭配 MANIFEST 選項來執行此動作。下列範例會使用資訊清單檔案載入資料。

```
copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_pipe_manifest' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest;
```

## 將 VENUE 卸載至加密檔案
<a name="unload-examples-unload-encrypted"></a>

下列範例會使用 AWS KMS 金鑰將 VENUE 資料表卸載至一組加密檔案。若您使用 ENCRYPTED 選項指定資訊清單檔案，則資訊清單檔案也會加密。如需詳細資訊，請參閱[卸載加密的資料檔案](t_unloading_encrypted_files.md)。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_kms'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
kms_key_id '1234abcd-12ab-34cd-56ef-1234567890ab'
manifest
encrypted;
```

下列範例會使用根對稱金鑰將 VENUE 資料表卸載至一組加密檔案。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_encrypt_cmk'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
encrypted;
```

## 從加密檔案載入 VENUE
<a name="unload-examples-load-encrypted"></a>

若要從使用 UNLOAD 搭配 ENCRYPT 選項建立的一組檔案中載入資料表，請使用 COPY 命令執行反向程序。利用該命令，使用 ENCRYPTED 選項並指定用於 UNLOAD 命令的相同根對稱金鑰。下列範例會從先前範例中建立的加密資料檔案載入 LOADVENUE 資料表。

```
create table loadvenue (like venue);

copy loadvenue
from 's3://amzn-s3-demo-bucket/venue_encrypt_manifest'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
master_symmetric_key 'EXAMPLEMASTERKEYtkbjk/OpCwtYSx/M4/t7DMCDIK722'
manifest
encrypted;
```

## 將 VENUE 資料卸載至 Tab 分隔檔案
<a name="unload-examples-venue-tab"></a>

```
unload ('select venueid, venuename, venueseats from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t';
```

輸出資料檔案看起來像這樣：

```
1	Toyota Park	Bridgeview	IL	0
2	Columbus Crew Stadium	Columbus	OH	0
3	RFK Stadium	Washington	DC	0
4	CommunityAmerica Ballpark	Kansas City	KS	0
5	Gillette Stadium	Foxborough	MA	68756
...
```

## 將 VENUE 卸載至固定寬度資料檔案
<a name="unload-venue-fixed-width"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_fw_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
fixedwidth as 'venueid:3,venuename:39,venuecity:16,venuestate:2,venueseats:6';
```

輸出資料檔案看起來會像下面這樣。

```
1  Toyota Park              Bridgeview  IL0
2  Columbus Crew Stadium    Columbus    OH0
3  RFK Stadium              Washington  DC0
4  CommunityAmerica BallparkKansas City KS0
5  Gillette Stadium         Foxborough  MA68756
...
```

## 將 VENUE 卸載至一組 Tab 分隔的 GZIP 壓縮檔案
<a name="unload-examples-venue-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter as '\t'
gzip;
```

## 將 VENUE 卸載到一個 GZIP 壓縮的文字檔案
<a name="unload-examples-venue-extension-gzip"></a>

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_tab_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
extension 'txt.gz'
gzip;
```

## 卸載包含分隔符號的資料
<a name="unload-examples-delimiter"></a>

此範例會使用 ADDQUOTES 選項卸載逗號分隔的資料，其中部分實際資料欄位包含逗號。

首先，請建立包含引號的資料表。

```
create table location (id int, location char(64));

insert into location values (1,'Phoenix, AZ'),(2,'San Diego, CA'),(3,'Chicago, IL');
```

接著使用 ADDQUOTES 選項卸載資料。

```
unload ('select id, location from location')
to 's3://amzn-s3-demo-bucket/location_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
delimiter ',' addquotes;
```

卸載的資料檔案看起來像這樣：

```
1,"Phoenix, AZ"
2,"San Diego, CA"
3,"Chicago, IL"
...
```

## 卸載聯結查詢的結果
<a name="unload-examples-join"></a>

以下範例會卸載包含視窗函數之聯結查詢的結果。

```
unload ('select venuecity, venuestate, caldate, pricepaid,
sum(pricepaid) over(partition by venuecity, venuestate
order by caldate rows between 3 preceding and 3 following) as winsum
from sales join date on sales.dateid=date.dateid
join event on event.eventid=sales.eventid
join venue on event.venueid=venue.venueid
order by 1,2')
to 's3://amzn-s3-demo-bucket/tickit/winsum'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

輸出檔案看起來像這樣：

```
Atlanta|GA|2008-01-04|363.00|1362.00
Atlanta|GA|2008-01-05|233.00|2030.00
Atlanta|GA|2008-01-06|310.00|3135.00
Atlanta|GA|2008-01-08|166.00|8338.00
Atlanta|GA|2008-01-11|268.00|7630.00
...
```

## 使用 NULL AS 卸載
<a name="unload-examples-null-as"></a>

根據預設，UNLOAD 會將 null 值做為空字串輸出。下列範例說明如何使用 NULL AS 將文字字串替換為 null。

我們將在這些範例的 VENUE 資料表中加入一些 null 值。

```
update venue set venuestate = NULL
where venuecity = 'Cleveland';
```

從其中 VENUESTATE 是 null 的 VENUE 選取，以確認資料欄包含 NULL。

```
select * from venue where venuestate is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
```

現在使用 NULL AS 選項對 VENUE 資料表執行 UNLOAD，將 null 值取代為字元字串 '`fred`'。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

下列來自卸載檔案的範例顯示，null 值已取代為 `fred`。另外發現，VENUESEATS 的某些值也是 null，並且已取代為 `fred`。即使 VENUESEATS 的資料類型為整數，UNLOAD 仍會在卸載檔案中將值轉換成文字，然後 COPY 會再將它們還原為整數。若您要卸載至固定寬度的檔案，則 NULL AS 字串不得大於欄位寬度。

```
248|Charles Playhouse|Boston|MA|0
251|Paris Hotel|Las Vegas|NV|fred
258|Tropicana Hotel|Las Vegas|NV|fred
300|Kennedy Center Opera House|Washington|DC|0
306|Lyric Opera House|Baltimore|MD|0
308|Metropolitan Opera|New York City|NY|0
  5|Gillette Stadium|Foxborough|MA|5
 22|Quicken Loans Arena|Cleveland|fred|0
101|Progressive Field|Cleveland|fred|43345
...
```

若要從卸載檔案載入資料表，請使用 COPY 命令搭配相同的 NULL AS 選項。

**注意**  
如果嘗試將 null 載入己定義為 NOT NULL 的欄，COPY 命令會失敗。

```
create table loadvenuenulls (like venue);

copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
null as 'fred';
```

若要確認資料欄包含 null，而不只是空字串，請從 LOADVENUENULLS 選取並篩選出 null。

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |

...
```

您可以使用預設的 NULL AS 行為 UNLOAD 包含 null 的資料表，然後使用預設的 NULL AS 行為將資料 COPY 回資料表中；不過，目標資料表中任何非數值欄位都會包含空字串，而非 null。根據預設，UNLOAD 會將 null 轉換成空字串 (空格或零長度)。COPY 會針對數值資料欄將空字串轉換成 NULL，但是會將空字串插入非數值資料欄。下列範例說明如何使用預設的 NULL AS 行為來執行 UNLOAD，後面接著 COPY。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole';
```

在此情況下，當您篩選出 null 時，只會有 VENUESEATS 包含 null 的資料列。VENUESTATE 在資料表 (VENUE) 中包含 null，而 VENUESTATE 在目標資料表 (LOADVENUENULLS) 中則包含空字串。

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
     251 | Paris Hotel              | Las Vegas | NV         |
...
```

若要在非數值資料欄中將空字串載入為 NULL，請包含 EMPTYASNULL 或 BLANKSASNULL 選項。也可以兩者都使用。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' allowoverwrite;

truncate loadvenuenulls;
copy loadvenuenulls from 's3://amzn-s3-demo-bucket/nulls/'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' EMPTYASNULL;
```

若要確認資料欄包含 NULL，而不只是空格或空字串，請從 LOADVENUENULLS 選取並篩選出 null。

```
select * from loadvenuenulls where venuestate is null or venueseats is null;

 venueid |        venuename         | venuecity | venuestate | venueseats
---------+--------------------------+-----------+------------+------------
      72 | Cleveland Browns Stadium | Cleveland |            |      73200
     253 | Mirage Hotel             | Las Vegas | NV         |
     255 | Venetian Hotel           | Las Vegas | NV         |
      22 | Quicken Loans Arena      | Cleveland |            |          0
     101 | Progressive Field        | Cleveland |            |      43345
     251 | Paris Hotel              | Las Vegas | NV         |
     ...
```

## 使用 ALLOWOVERWRITE 參數卸載
<a name="unload-examples-allowoverwrite"></a>

根據預設，UNLOAD 不會覆寫目的地儲存貯體中的現有檔案。例如，如果您執行相同的 UNLOAD 陳述式兩次，而未修改目的地儲存貯體中的檔案，則第二個 UNLOAD 會失敗。為覆寫現有檔案 (包括資訊清單檔案)，指定 ALLOWOVERWRITE 選項。

```
unload ('select * from venue')
to 's3://amzn-s3-demo-bucket/venue_pipe_'
iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole'
manifest allowoverwrite;
```

## 使用 PARALLEL 和 MANIFEST 參數卸載 EVENT 資料表
<a name="unload-examples-manifest-parallel"></a>

您可以以平行方式 UNLOAD 資料表並產生清單檔案。Amazon S3 資料檔案都是在相同層級建立的，名稱字尾為模式 `0000_part_00`。清單檔案與資料檔案位於相同的資料夾層級，並加上字尾 `manifest`。下面的 SQL 會卸載 EVENT 資料表，並季戀具有基本名稱 `parallel` 的文件

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/parallel'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel on
manifest;
```

Amazon S3 檔案清單類似以下內容。

```
 Name                       Last modified                        Size                  
 parallel0000_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB  
 parallel0001_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0002_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 52.1 KB
 parallel0003_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 51.1 KB
 parallel0004_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.6 KB
 parallel0005_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 53.4 KB
 parallel0006_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 54.1 KB
 parallel0007_part_00	-   August 2, 2023, 14:54:39 (UTC-07:00) 55.9 KB
 parallelmanifest       -   August 2, 2023, 14:54:39 (UTC-07:00) 886.0 B
```

`parallelmanifest` 檔案內容類似以下內容。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/parallel0000_part_00", "meta": { "content_length": 53316 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0001_part_00", "meta": { "content_length": 54704 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0002_part_00", "meta": { "content_length": 53326 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0003_part_00", "meta": { "content_length": 52356 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0004_part_00", "meta": { "content_length": 55933 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0005_part_00", "meta": { "content_length": 54648 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0006_part_00", "meta": { "content_length": 55436 }},
    {"url":"s3://amzn-s3-demo-bucket/parallel0007_part_00", "meta": { "content_length": 57272 }}
  ]
}
```

## 使用 PARALLEL OFF 和 MANIFEST 參數卸載 EVENT 資料表
<a name="unload-examples-manifest-serial"></a>

您可以依序 (PARALLEL OFF) UNLOAD 資料表並產生清單檔案。Amazon S3 資料檔案都是在相同層級建立的，名稱字尾為模式 `0000`。清單檔案與資料檔案位於相同的資料夾層級，並加上字尾 `manifest`。

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/serial'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
parallel off
manifest;
```

Amazon S3 檔案清單類似以下內容。

```
 Name                       Last modified                        Size                  
 serial0000             -   August 2, 2023, 15:54:39 (UTC-07:00) 426.7 KB  
 serialmanifest         -   August 2, 2023, 15:54:39 (UTC-07:00) 120.0 B
```

`serialmanifest` 檔案內容類似以下內容。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/serial000", "meta": { "content_length": 436991 }}
  ]
}
```

## 使用 PARTITION BY 和 MANIFEST 參數卸載 EVENT 資料表
<a name="unload-examples-manifest-partition"></a>

您可以依分割區 UNLOAD 資料表並產生清單檔案。Amazon S3 中會建立一個新資料夾，其中包含子分割區資料夾，而子資料夾中的資料檔案名稱模式類似於 `0000_par_00`。清單檔案與名稱為 `manifest` 的子資料夾位於相同的資料夾層級。

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/partition'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
partition by (eventname)
manifest;
```

Amazon S3 檔案清單類似以下內容。

```
 Name                   Type     Last modified                        Size                  
 partition           	Folder
```

在 `partition` 資料夾中的是具有分割區名稱和清單檔案的子文件夾。下面顯示的是資料夾 `partition` 中資料夾清單的底端，類似以下內容。

```
 Name                   Type      Last modified                        Size                  
 ...
 eventname=Zucchero/    Folder 
 eventname=Zumanity/    Folder 
 eventname=ZZ Top/      Folder  
 manifest          	    -	    August 2, 2023, 15:54:39 (UTC-07:00) 467.6 KB
```

`eventname=Zucchero/` 資料夾中的資料檔案類似於以下內容。

```
 Name               Last modified                        Size                  
 0000_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 70.0 B
 0001_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 106.0 B
 0002_part_00	-   August 2, 2023, 15:59:15 (UTC-07:00) 70.0 B
 0004_part_00	-   August 2, 2023, 15:59:17 (UTC-07:00) 141.0 B
 0006_part_00	-   August 2, 2023, 15:59:16 (UTC-07:00) 35.0 B
 0007_part_00	-   August 2, 2023, 15:59:19 (UTC-07:00) 108.0 B
```

`manifest` 檔案內容底部類似以下內容。

```
{
  "entries": [
    ...
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zucchero/007_part_00", "meta": { "content_length": 108 }},
    {"url":"s3://amzn-s3-demo-bucket/partition/eventname=Zumanity/007_part_00", "meta": { "content_length": 72 }}
  ]
}
```

## 使用 MAXFILESIZE、ROWGROUPSIZE 和 MANIFEST 參數卸載 EVENT 資料表
<a name="unload-examples-manifest-maxsize"></a>

您可以以平行方式 UNLOAD 資料表並產生清單檔案。Amazon S3 資料檔案都是在相同層級建立的，名稱字尾為模式 `0000_part_00`。產生的 Parquet 資料檔案會限制為 256 MB，資料列群組大小為 128 MB。清單檔案與資料檔案位於相同的資料夾層級，並加上字尾 `manifest`。

```
unload ('select * from mytickit1.event')
to 's3://amzn-s3-demo-bucket/eventsize'
iam_role 'arn:aws:iam::123456789012:role/MyRedshiftRole'
maxfilesize 256 MB
rowgroupsize 128 MB
parallel on
parquet
manifest;
```

Amazon S3 檔案清單類似以下內容。

```
 Name                            Type      Last modified                        Size 
 eventsize0000_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.5 KB
 eventsize0001_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0002_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.4 KB
 eventsize0003_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.0 KB
 eventsize0004_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.3 KB
 eventsize0005_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 24.8 KB
 eventsize0006_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.0 KB
 eventsize0007_part_00.parquet	parquet	August 2, 2023, 17:35:21 (UTC-07:00) 25.6 KB
 eventsizemanifest                 -       August 2, 2023, 17:35:21 (UTC-07:00) 958.0 B
```

`eventsizemanifest` 檔案內容類似以下內容。

```
{
  "entries": [
    {"url":"s3://amzn-s3-demo-bucket/eventsize0000_part_00.parquet", "meta": { "content_length": 25130 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0001_part_00.parquet", "meta": { "content_length": 25428 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0002_part_00.parquet", "meta": { "content_length": 25025 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0003_part_00.parquet", "meta": { "content_length": 24554 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0004_part_00.parquet", "meta": { "content_length": 25918 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0005_part_00.parquet", "meta": { "content_length": 25362 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0006_part_00.parquet", "meta": { "content_length": 25647 }},
    {"url":"s3://amzn-s3-demo-bucket/eventsize0007_part_00.parquet", "meta": { "content_length": 26256 }}
  ]
}
```

# UPDATE
<a name="r_UPDATE"></a>

**Topics**
+ [語法](#r_UPDATE-synopsis)
+ [Parameters](#r_UPDATE-parameters)
+ [使用須知](#r_UPDATE_usage_notes)
+ [UPDATE 陳述式的範例](c_Examples_of_UPDATE_statements.md)

在條件滿足時，更新一個或多個資料表資料欄中的值。

**注意**  
單一 SQL 陳述式的大小上限為 16 MB。

## 語法
<a name="r_UPDATE-synopsis"></a>

```
[ WITH [RECURSIVE] common_table_expression [, common_table_expression , ...] ]
            UPDATE table_name [ [ AS ] alias ] SET column = { expression | DEFAULT } [,...]

[ FROM fromlist ]
[ WHERE condition ]
```

## Parameters
<a name="r_UPDATE-parameters"></a>

WITH 子句  
指定一個或多個 *common-table-expressions* 的選用子句。請參閱 [WITH 子句](r_WITH_clause.md)。

 *table\$1name*   
暫時性或持久性資料表。只有資料表的擁有者，或具有資料表 UPDATE 權限的使用者可以更新資料列。如果您在表達式或條件中使用 FROM 子句或從資料表選取，則必須具有這些資料表的 SELECT 權限。您無法在這裡為資料表提供別名；不過，您可以在 FROM 子句中指定別名。  
Amazon Redshift Spectrum 外部資料表處於唯讀狀態。您無法 UPDATE 外部資料表。

別名  
目標資料表的暫時替代名稱。別名是選擇性項目。AS 關鍵字一律為選用。

SET *column* =   
您要修改的一個或多個資料欄。未列出的資料欄會保留其目前值。不要在目標資料欄的規格中包含資料表名稱。例如，`UPDATE tab SET tab.col = 1` 無效。

 *表達式*   
此表達式會為所指定資料欄定義新值。

DEFAULT   
使用在 CREATE TABLE 陳述式中為資料欄指派的預設值更新資料欄。

FROM *tablelist*   
您可以透過參考其他資料表中的資訊更新資料表。請在 FROM 子句中列出這些其他資料表，或在 WHERE 條件中使用子查詢。FROM 子句中列出的資料表可以有別名。如果您需要在清單中包含 UPDATE 陳述式的目標資料表，請使用別名。

WHERE *condition*   
此選用子句會限制僅更新符合條件的資料列。當條件傳回 `true` 時，指定的 SET 欄就會更新。條件可以是資料欄上簡單的述詞，或是根據子查詢結果的條件。  
您可以在子查詢中為任何資料表命名，包括 UPDATE 的目標資料表在內。

## 使用須知
<a name="r_UPDATE_usage_notes"></a>

在更新資料表中的大量資料列之後：
+ 清空資料表以回收儲存空間和重新排序資料列。
+ 分析資料表以更新查詢規劃器的統計資訊。

UPDATE 陳述式的 FROM 子句中不支援左、右和完整外部聯結；它們會傳回下列錯誤：

```
ERROR: Target table must be part of an equijoin predicate
```

 若您需要指定外部聯結，可在 UPDATE 陳述式的 WHERE 子句中使用子查詢。

若您的 UPDATE 陳述式需要自我聯結至目標資料表，則您需要指定聯結條件以及 WHERE 子句條件來限定更新操作的資料列。大致而言，當目標資料表與其本身或其他資料表聯結時，最佳實務會是使用子查詢清楚區分聯結條件和限定更新資料列的條件。

當組態參數 `error_on_nondeterministic_update` 設定為 *true* 時，每列具有多個相符項目的 UPDATE 查詢會擲回錯誤。如需詳細資訊，請參閱[error\$1on\$1nondeterministic\$1update](r_error_on_nondeterministic_update.md)。

您可以更新 GENERATED BY DEFAULT AS IDENTITY 資料欄。定義為 GENERATED BY DEFAULT AS IDENTITY 的資料欄可以利用您提供的值進行更新。如需詳細資訊，請參閱[GENERATED BY DEFAULT AS IDENTITY](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause)。

# UPDATE 陳述式的範例
<a name="c_Examples_of_UPDATE_statements"></a>

如需下列範例中所用資料表的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。

TICKIT 資料庫中的 CATEGORY 資料表包含以下資料列：

```
+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 5     | Sports   | MLS       | Major League Soccer                        |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 1     | Sports   | MLB       | Major League Baseball                      |
| 6     | Shows    | Musicals  | Musical theatre                            |
| 3     | Sports   | NFL       | National Football League                   |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 2     | Sports   | NHL       | National Hockey League                     |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 4     | Sports   | NBA       | National Basketball Association            |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
+-------+----------+-----------+--------------------------------------------+
```

 **根據值的範圍更新資料表** 

根據 CATID 資料欄中的值範圍更新 CATGROUP 資料欄。

```
UPDATE category
SET catgroup='Theatre'
WHERE catid BETWEEN 6 AND 8;

SELECT * FROM category
WHERE catid BETWEEN 6 AND 8;

+-------+----------+----------+---------------------------+
| catid | catgroup | catname  |          catdesc          |
+-------+----------+----------+---------------------------+
| 6     | Theatre  | Musicals | Musical theatre           |
| 7     | Theatre  | Plays    | All non-musical theatre   |
| 8     | Theatre  | Opera    | All opera and light opera |
+-------+----------+----------+---------------------------+
```

 **根據目前值更新資料表** 

根據目前的 CATGROUP 值更新 CATNAME 和 CATDESC 資料欄：

```
UPDATE category
SET catdesc=default, catname='Shows'
WHERE catgroup='Theatre';

SELECT * FROM category
WHERE catname='Shows';

+-------+----------+---------+---------+
| catid | catgroup | catname | catdesc |
+-------+----------+---------+---------+
| 6     | Theatre  | Shows   | NULL    |
| 7     | Theatre  | Shows   | NULL    |
| 8     | Theatre  | Shows   | NULL    |
+-------+----------+---------+---------+)
```

在此情況下，CATDESC 資料欄已設為 null，因為資料表建立時並未定義任何預設值。

執行下列命令，將 CATEGORY 資料表資料重設回原始值：

```
TRUNCATE category;

COPY category
FROM 's3://redshift-downloads/tickit/category_pipe.txt' 
DELIMITER '|' 
IGNOREHEADER 1 
REGION 'us-east-1'
IAM_ROLE default;
```

 **根據 WHERE 子句子查詢的結果更新資料表** 

根據 WHERE 子句中子查詢的結果更新 CATEGORY 資料表：

```
UPDATE category
SET catdesc='Broadway Musical'
WHERE category.catid IN
(SELECT category.catid FROM category
JOIN event ON category.catid = event.catid
JOIN venue ON venue.venueid = event.venueid
JOIN sales ON sales.eventid = event.eventid
WHERE venuecity='New York City' AND catname='Musicals');
```

檢視更新的資料表：

```
SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 6     | Shows    | Musicals  | Broadway Musical                           |
| 7     | Shows    | Plays     | All non-musical theatre                    |
| 8     | Shows    | Opera     | All opera and light opera                  |
| 9     | Concerts | Pop       | All rock and pop music concerts            |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
+-------+----------+-----------+--------------------------------------------+
```

 **根據 WITH 子句子查詢的結果更新資料表** 

若要根據使用 WITH 子句之子查詢的結果來更新 CATEGORY 資料表，請使用下列範例。

```
WITH u1 as (SELECT catid FROM event ORDER BY catid DESC LIMIT 1) 
UPDATE category SET catid='200' FROM u1 WHERE u1.catid=category.catid;

SELECT * FROM category ORDER BY catid DESC LIMIT 1;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 200   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

## 根據聯結條件的結果更新資料表
<a name="c_Examples_of_UPDATE_statements-updating-a-table-based-on-the-result-of-a-join-condition"></a>

根據 EVENT 資料表中相符的 CATID 資料列，更新 CATEGORY 資料表中原有的 11 個資料列：

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid;

SELECT * FROM category ORDER BY catid;

+-------+----------+-----------+--------------------------------------------+
| catid | catgroup |  catname  |                  catdesc                   |
+-------+----------+-----------+--------------------------------------------+
| 2     | Sports   | NHL       | National Hockey League                     |
| 3     | Sports   | NFL       | National Football League                   |
| 4     | Sports   | NBA       | National Basketball Association            |
| 5     | Sports   | MLS       | Major League Soccer                        |
| 10    | Concerts | Jazz      | All jazz singers and bands                 |
| 11    | Concerts | Classical | All symphony, concerto, and choir concerts |
| 100   | Concerts | Pop       | All rock and pop music concerts            |
| 100   | Shows    | Plays     | All non-musical theatre                    |
| 100   | Shows    | Opera     | All opera and light opera                  |
| 100   | Shows    | Musicals  | Broadway Musical                           |
+-------+----------+-----------+--------------------------------------------+
```

 請注意，EVENT 會在 FROM 子句中列出，而目標資料表的聯結條件會在 WHERE 子句中定義。只有四個資料列符合更新資格。這四個資料列是 CATID 值原本為 6、7、8 和 9 的資料列；EVENT 資料表中只會表示這四種類別：

```
SELECT DISTINCT catid FROM event;

+-------+
| catid |
+-------+
| 6     |
| 7     |
| 8     |
| 9     |
+-------+
```

藉由延伸先前的範例並新增其他條件至 WHERE 子句，更新 CATEGORY 資料表中原有的 11 個資料列。由於 CATGROUP 資料欄的限制，只有一個資料列符合更新資格 (雖然四個資料列都符合聯結資格)。

```
UPDATE category SET catid=100
FROM event
WHERE event.catid=category.catid
AND catgroup='Concerts';

SELECT * FROM category WHERE catid=100;

+-------+----------+---------+---------------------------------+
| catid | catgroup | catname |             catdesc             |
+-------+----------+---------+---------------------------------+
| 100   | Concerts | Pop     | All rock and pop music concerts |
+-------+----------+---------+---------------------------------+
```

撰寫此範例的替代方法如下：

```
UPDATE category SET catid=100
FROM event JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
```

此方法的好處在於，聯結條件會與任何其他限定更新資料列的條件清楚區分。請注意 FROM 子句中的 CATEGORY 資料表使用別名 CAT。

## 使用 FROM 子句中外部聯結的更新
<a name="c_Examples_of_UPDATE_statements-updates-with-outer-joins-in-the-from-clause"></a>

上面的範例說明了 UPDATE 陳述式的 FROM 子句中指定的內部聯結。下列範例會傳回錯誤，因為 FROM 子句不支援目標資料表的外部聯結：

```
UPDATE category SET catid=100
FROM event LEFT JOIN category cat ON event.catid=cat.catid
WHERE cat.catgroup='Concerts';
ERROR:  Target table must be part of an equijoin predicate
```

若 UPDATE 陳述式需要外部聯結，您可以將外部聯結語法移到子查詢內：

```
UPDATE category SET catid=100
FROM
(SELECT event.catid FROM event LEFT JOIN category cat ON event.catid=cat.catid) eventcat
WHERE category.catid=eventcat.catid
AND catgroup='Concerts';
```

## 更新 SET 子句中另一個資料表的資料欄
<a name="c_Examples_of_UPDATE_statements-set-with-column-from-another-table"></a>

若要使用 sales 資料表中的值更新 TICKIT 範例資料庫中的 listing 資料表，請使用下列範例。

```
SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 4          |
| 108334 | 24         |
| 117150 | 4          |
| 135915 | 20         |
| 205927 | 6          |
+--------+------------+

UPDATE listing
SET numtickets = sales.sellerid
FROM sales
WHERE sales.sellerid = 1 AND listing.sellerid = sales.sellerid;

SELECT listid, numtickets FROM listing WHERE sellerid = 1 ORDER BY 1 ASC LIMIT 5;

+--------+------------+
| listid | numtickets |
+--------+------------+
| 100423 | 1          |
| 108334 | 1          |
| 117150 | 1          |
| 135915 | 1          |
| 205927 | 1          |
+--------+------------+
```

# USE
<a name="r_USE_command"></a>

變更執行查詢所在的資料庫。SHOW USE 會指向最近搭配 USE 命令使用的資料庫。RESET USE 會重設使用的資料庫。這表示，如果未在 SQL 中指定資料庫，則會在目前資料庫中搜尋物件。

## 語法
<a name="r_USE-synopsis"></a>

```
USE database
```

## 範例
<a name="r_USE_command-examples"></a>

假設有三個資料庫 `dev`、`pdb` 及 `pdb2`。讓每個資料庫的公有結構描述中有兩個資料表 `t`。首先，將資料插入不同資料庫的資料表：

```
dev=# insert into dev.public.t values (1);
INSERT 0 1
dev=# insert into pdb.public.t values (2);
INSERT 0 1
```

如果沒有明確設定資料庫，則系統會使用您的連線資料庫。檢查您目前的資料庫內容：

```
dev=# show use;
Use Database

(1 row)
dev=> show search_path;
search_path
$user, public
(1 row)
```

在未指定資料庫的情況下查詢資料表 `t` 時，系統會使用目前資料庫中的資料表：

```
dev=# select * from t;
c
----
1
(1 row)
```

使用 `use` 命令即可切換資料庫，而不會變更您的連線：

```
dev=# use pdb;
USE
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# select * from t;
id
----
2
(1 row)
```

您也可以明確指定結構描述：

```
dev=# select * from public.t;
id
----
2
(1 row)
```

您現在可以在目前資料庫內的不同結構描述中建立資料表：

```
dev=# create table s1.t(id int);
CREATE TABLE
dev=# insert into pdb.s1.t values (3);
INSERT 0 1
```

若您未指定結構描述，搜尋路徑會決定存取哪些結構描述的物件：

```
dev=# set search_path to public, s1;
SET
dev=# select * from t;
 id
----
  2
(1 row)
```

變更結構描述的順序以存取不同的資料表：

```
dev=# set search_path to s1, public;
SET
dev=# show search_path;
 search_path
-------------
 s1, public
(1 row)
dev=# select * from t;
 id
----
  3
(1 row)
```

切換到另一個資料庫，同時保持原始連線：

```
dev=# show use;
 Use Database
--------------
 pdb
(1 row)
dev=# use pdb2;
USE
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)
```

切換資料庫時，搜尋路徑會重設為預設值：

```
dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

建立資料表並在目前的資料庫中插入資料：

```
dev=# create table pdb2.public.t(id int);
CREATE TABLE
dev=# insert into pdb2.public.t values (4);
INSERT 0 1
dev=# select * from t;
 id
----
  4
(1 row)
```

在交易中，您可以使用三部分記號寫入目前的資料庫，並從任何資料庫讀取。這也包含連線資料庫：

```
dev=# show use;
 Use Database
--------------
 pdb2
(1 row)

dev=# BEGIN;
BEGIN
dev=# select * from t;
 id
----
  4
(1 row)

dev=# insert into t values (5);
INSERT 0 1
dev=# select * from t;
 id
----
  4
  5
(2 rows)

dev=# select * from pdb.public.t;
 id
----
  2
(1 row)

dev=# select * from dev.public.t;
 id
----
  1
(1 row)
```

重設為連線資料庫。請注意，這樣做不僅會回復為先前使用的資料庫 `pdb`，也會重設為連線資料庫。搜尋路徑也會變更為預設路徑：

```
dev=# RESET USE;
RESET
dev=# select * from t;
c
----
1
(1 row)
dev=# show use;
 Use Database
--------------

(1 row)

dev=# show search_path;
  search_path
---------------
 $user, public
(1 row)
```

您可以在交易開始時變更資料庫，但執行查詢之後就無法變更：

```
dev=# BEGIN;
BEGIN
dev=# use pdb;
USE
dev=# use pdb2;
USE
dev=# use pdb;
USE
dev=# select * from t;
 id
----
  2
(1 row)
dev=# use pdb2;
ERROR:  USEd Database cannot be set or reset inside a transaction after another command.
dev=# rollback;
ROLLBACK
(1 row)
```

### Data Catalog 範例
<a name="use-redlake-example"></a>

首先，在不同的結構描述和目錄中建立資料表，以示範跨目錄查詢。先從在連線資料庫中建立資料表開始。

```
dev=# CREATE TABLE dev.public.t (col INT);
dev=# INSERT INTO dev.public.t VALUES (1);
dev=# CREATE SCHEMA write_schema;
dev=# CREATE TABLE dev.write_schema.t (state char (2));
dev=# INSERT INTO dev.write_schema.t VALUES ('WA');
```

現在，於不同目錄中建立類似的資料表。這會示範如何使用跨目錄資料庫。

```
dev=# CREATE TABLE my_db@my_catalog.public.t (col INT);
dev=# INSERT INTO my_db@my_catalog.public.t VALUES (100);
dev=# CREATE SCHEMA my_db@my_catalog.write_schema;
dev=# CREATE TABLE my_db@my_catalog.write_schema.t (state char (2));
dev=# INSERT INTO my_db@my_catalog.write_schema.t VALUES ('CA');
```

檢查目前的資料庫內容。如果沒有明確設定資料庫，則系統會使用連線資料庫。

```
dev=# SHOW USE;
 Use Database
--------------

(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)

dev=# SELECT * FROM t;
 col
-----
   1
(1 row)
```

設定 USE 資料庫來查詢不同目錄中的資料表。

```
dev=# USE my_db@my_catalog;

dev=# SHOW USE;
            Use Database
-------------------------------------
 my_db@my_catalog
(1 row)

dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

查詢資料表 t 時，結果會來自跨目錄資料庫。

```
dev=# SELECT * FROM t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
 100
(1 row)

dev=# SELECT * FROM my_db@my_catalog.public.t;
 col
-----
 100
(1 row)
```

變更搜尋路徑以存取 USE 資料庫內不同結構描述中的資料表。

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 CA
(1 row)

dev=# SELECT * FROM my_db@my_catalog.write_schema.t;
 state
-------
 CA
(1 row)
```

即使 USE 設定為跨目錄資料庫，仍然可以明確查詢原始資料庫。

```
dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

重設 USE 資料庫，以再次參考連線資料庫中的物件。

```
dev=# RESET USE;

dev=# SHOW USE;
 Use Database
--------------

(1 row)
```

請注意，USE 重設時，search\$1path 也會重設。

```
dev=# SHOW search_path;
  search_path
---------------
 $user, public
(1 row)
```

重設後，查詢現在會參考原始連線資料庫。

```
dev=# SELECT * FROM t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM public.t;
 col
-----
   1
(1 row)

dev=# SELECT * FROM dev.public.t;
 col
-----
   1
(1 row)
```

您可以修改原始資料庫中的搜尋路徑，以存取不同的結構描述。

```
dev=# SET search_path to write_schema;

dev=# SHOW search_path;
 search_path
--------------
 write_schema
(1 row)

dev=# SELECT * FROM t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM write_schema.t;
 state
-------
 WA
(1 row)

dev=# SELECT * FROM dev.write_schema.t;
 state
-------
 WA
(1 row)
```

# VACUUM
<a name="r_VACUUM_command"></a>

在指定的資料表中或目前資料庫的所有資料表中，重新排序資料列並回收空間。

**注意**  
只有具有必要資料表權限的使用者才能有效地清除資料表。若 VACUUM 執行時沒有必要的資料表權限，操作仍會成功完成，但不會有任何作用。如需有效執行 VACUUM 的有效資料表權限清單，請參閱下列「所需權限」一節。

Amazon Redshift 會自動排序資料並在背景中執行 VACUUM DELETE。這可以減少執行 VACUUM 命令的需求。如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

根據預設，若資料表中超過 95% 的資料列已排序，則 VACUUM 會略過資料表的排序階段。略過排序階段可大幅改善 VACUUM 的效能。若要變更單一資料表預設的排序或刪除閾值，則在執行 VACUUM 命令時，包含資料表名稱和 TO *threshold* PERCENT 參數。

使用者可以在清空資料表時加以存取。在清空資料表時您可以執行查詢和寫入操作，但是當資料處理語言 (DML) 命令和清空並行執行時，這兩項可能都需要較長時間。如果您在清空期間執行 UPDATE 和 DELETE 陳述式，系統效能可能會降低。VACUUM DELETE 展示封鎖更新和刪除操作。

Amazon Redshift 會在背景自動執行 DELETE ONLY 清空。使用者執行資料定義語言 (DDL) 操作 (例如 ALTER TABLE) 時，自動清空操作將暫停。

**注意**  
Amazon Redshift VACUUM 命令語法和行為與 PostgreSQL VACUUM 操作有著顯著的差異。例如，Amazon Redshift 中的預設 VACUUM 操作為 VACUUM FULL，其會回收磁碟空間並重新排序所有資料列。相反地，PostgreSQL 中的預設 VACUUM 操作只會回收空間，並將空間提供重複使用。

如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

## 所需權限
<a name="r_VACUUM_command-privileges"></a>

以下是 VACUUM 所需的權限：
+ 超級使用者
+ 具有 VACUUM 權限的使用者
+ 資料表擁有者
+ 共用資料表的資料庫擁有者

## 語法
<a name="r_VACUUM_command-synopsis"></a>

```
VACUUM [ FULL | SORT ONLY | DELETE ONLY | REINDEX | RECLUSTER ]
[ [ table_name ] [ TO threshold PERCENT ] [ BOOST ] ]
```

## Parameters
<a name="r_VACUUM_command-parameters"></a>

FULL   <a name="vacuum-full"></a>
排序指定的資料表 (或目前資料庫中的所有資料表)，並回收先前 UPDATE 和 DELETE 操作將其標記為要進行刪除的資料列所佔用的磁碟空間。VACUUM FULL 是預設值。  
完整清空並不會對交錯資料表執行重新建立索引。若要在完整清空之後重新建立交錯資料表的索引，請使用 [VACUUM REINDEX](#vacuum-reindex) 選項。  
根據預設，若資料表中至少有 95% 的資料列已排序，則 VACUUM FULL 會略過資料表的排序階段。若 VACUUM 能夠略過排序階段，它就會執行 DELETE ONLY，並且在刪除階段中回收空間，如此至少有 95% 的剩餘資料列不會標記為要進行刪除。   
若未達排序閾值 (例如 90% 的資料列已排序)，且 VACUUM 執行了完整排序，則也會執行完整刪除操作，並復原已刪除資料列的全部空間。  
您只能變更單一資料表的預設清空閾值。若要變更單一資料表預設的清空閾值，請包含資料表名稱和 TO *threshold* PERCENT 參數。

SORT ONLY   <a name="vacuum-sort-only"></a>
排序指定的資料表 (或目前資料庫中的所有資料表)，但不回收已刪除資料列釋出的空間。當回收磁碟空間不重要，但重新排序新資料列很重要時，此選項很實用。若未排序的區域未包含大量已刪除資料列，且未跨到整個已排序區域，則 SORT ONLY 清空可縮短清空操作的經過時間。若應用程式沒有磁碟空間限制條件，但須倚賴與保持資料表資料列排序狀態相關聯的查詢最佳化，則可受益於這類清空。  
根據預設，若資料表中至少有 95% 的內容已排序，則 VACUUM SORT ONLY 會略過資料表。若要變更單一資料表預設的排序閾值，則在執行 VACUUM 時，包含資料表名稱和 TO *threshold* PERCENT 參數。

DELETE ONLY   <a name="vacuum-delete-only"></a>
Amazon Redshift 僅在背景執行 DELETE ONLY 清空，因此您很少需要執行 DELETE ONLY 清空。  
回收先前 UPDATE 和 DELETE 操作將其標記為要進行刪除的資料列所佔用的 VACUUM DELETE 磁碟空間，並使資料表精簡以釋出耗用的空間。DELETE ONLY 清空操作不會排序資料表的資料。  
當回收磁碟空間很重要，但重新排序新資料列不重要時，此選項可縮短清空操作的經過時間。當您的查詢效能已達最佳狀態，而不需要重新排序資料列來最佳化查詢效能時，此選項也很實用。  
根據預設，VACUUM DELETE ONLY 回收空間，如此至少有 95% 的剩餘資料列不會標記為要進行刪除。若要變更單一資料表預設的刪除閾值，則在執行 VACUUM 時，包含資料表名稱和 TO *threshold* PERCENT 參數。    
某些操作 (如 `ALTER TABLE APPEND`) 可能造成資料表遭切割成片段。當您使用 `DELETE ONLY` 子句時，清空操作會回收片段資料表的空間。重組操作同樣會套用 95% 的閾值。

REINDEX  <a name="vacuum-reindex"></a>
分析交錯排序索引鍵資料欄中值的分佈，然後執行完整的 VACUUM 操作。若使用了 REINDEX，則需有資料表名稱。  
VACUUM REINDEX 所需的時間會比 VACUUM FULL 大幅增加，因為它會額外進行交錯排序索引鍵分析。交錯資料表的排序和合併操作可能需要更長的時間，因為交錯排序可能需要重新排列比複合排序更多的資料列。  
如果 VACUUM REINDEX 操作在完成之前終止，下一次 VACUUM 在執行完整清空操作之前，會繼續執行重建索引操作。  
TO *threshold* PERCENT 不支援 VACUUM REINDEX。  

RECLUSTER  <a name="vacuum-recluster"></a>
排序資料表中未排序的部分。已依自動資料表排序排序的資料表部分會保持不變。此命令不會將新排序的資料與已排序的區域合併。也不會回收標記為刪除的所有空間。完成此命令後，資料表可能不會顯示完全排序，如 SVV\$1TABLE\$1INFO 中的 `unsorted` 欄位所指示。  
 我們建議您針對頻繁擷取的大型資料表以及僅存取最新資料的查詢，使用 VACUUM RECLUSTER。  
 TO threshold PERCENT 不支援 VACUUM RECLUSTER。若使用了 RECLUSTER，則需有資料表名稱。  
在具有交錯排序索引鍵的資料表和具有 ALL 分佈樣式的資料表上，不支援 VACUUM RECLUSTER。

 *table\$1name*   
要清空的資料表名稱。如果您未指定資料表名稱，則清空操作會套用至目前資料庫中的所有資料表。您可以指定任何使用者建立的永久或臨時資料表。此命令對於其他物件並無意義，例如檢視和系統資料表。  
 若您包含 TO *threshold* PERCENT 參數，則需有資料表名稱。

 TO *threshold* PERCENT   
此子句會指定閾值，超過此值時，VACUUM 會略過排序階段，以及指定在刪除階段中回收空間的目標閾值。*排序閾值*是清空之前，指定資料列中已依照排序順序排列的總列數百分比。 *刪除閾值*是清空之後，未標記為要進行刪除的總列數百分比下限。  
由於 VACUUM 只會在資料表中已排序資料列的百分比低於排序閾值時重新排序資料列，因此 Amazon Redshift 通常可大幅縮短 VACUUM 的時間。同樣地，當 VACUUM 未限於回收全部標記為要刪除之資料列的空間時，它經常能夠略過重新寫入只包含少數已刪除資料列的區塊。  
例如，若您指定 75 做為*閾值*，VACUUM 就會在資料表中有 75% 以上的資料列已依照排序順序排列時，略過排序階段。若是刪除階段，VACUUMS 會設定回收磁碟空間的目標，如此在清空之後，資料表中至少有 75% 的資料列不會標記為要進行刪除。*閾值*必須是介於 0 到 100 之間的整數。預設為 95。若您指定的值是 100，則除非資料表已完整排序，否則 VACUUM 一律會排序資料表，並且回收所有標記為要進行刪除之資料列的空間。若您指定的值是 0，則 VACUUM 永遠不會排序資料表，也不會回收空間。  
若您包含 TO *threshold* PERCENT 參數，則也必須指定資料表名稱。若省略資料表名稱，則 VACUUM 會失敗。  
您無法使用 TO *threshold* PERCENT 參數與 REINDEX 搭配。

BOOST  
搭配其他資源 (例如記憶體和磁碟空間) 執行 VACUUM 命令 (可用時)。使用 BOOST 選項，VACUUM 會在一個視窗中運作，並在 VACUUM 操作的期間封鎖同時進行的刪除和更新。搭配 BOOST 選項執行會和系統資源發生競爭，可能影響查詢效能。請在系統負荷較輕時執行 VACUUM BOOST，例如維護操作期間。  
請在使用 BOOST 選項時考慮以下事項：  
+ 指定 BOOST 時，*table\$1name* 值為必要項目。
+ 不支援與 REINDEX 同時使用 BOOST。
+ 使用 DELETE ONLY 時會忽略 BOOST。

## 使用須知
<a name="r_VACUUM_usage_notes"></a>

對於大多數 Amazon Redshift 應用程式，建議您執行完整清空。如需詳細資訊，請參閱[清空資料表](t_Reclaiming_storage_space202.md)。

在執行清空操作之前，請注意以下行為：
+ 您無法執行 VACUUM 於交易區塊內 (BEGIN ... END)。如需交易的相關資訊，請參閱 [Amazon Redshift 中的隔離層級](c_serial_isolation.md)。
+ 當資料庫清空時，資料庫可能會稍微擴大。在沒有刪除的資料列可回收，或資料表的新排序順序導致資料壓縮比率降低時，這是預期的行為。
+ 在清空操作期間，查詢效能預期會受到某種程度的影響。清空操作完成後，就會恢復正常效能。
+ 在清空操作期間，同時的寫入操作會繼續執行，但不建議在清空時執行寫入操作。較有效率的方式，是在執行清空之前，先完成寫入操作。此外，在清空操作開始之後寫入的任何資料，都無法藉由該次操作清空。在此情況下，將需要執行第二次清空操作。
+ 若載入或插入操作已在進行中，則清空操作可能無法開始執行。清空操作會暫時需要資料表的獨佔存取權，以開始執行。需要此獨佔存取權的時間很短，因此清空操作不會長時間封鎖同時執行的載入和插入操作。
+ 若沒有可對特殊資料表執行的工作，則會略過清空操作；不過，在發現可略過該操作的過程中，可能會產生一些額外成本。若您知道這是原始資料表，或未達清空閾值，則不要對它執行清空操作。
+ 在小型資料表上執行 DELETE ONLY 清空操作可能不會減少用來儲存資料的區塊數目，尤其是在資料表有大量資料欄，或叢集在每個節點上使用大量分割時。這些清空操作會對每個分割的每個資料欄新增一個區塊，用來負責同時插入資料表的工作，而此額外負荷有可能超過回收磁碟空間所減少的區塊數。例如，若 8 個節點叢集上的 10 欄資料表在清空前佔用了 1000 個區塊，則清空將不會減少實際的區塊數，除非因為刪除的資料列而回收了超過 80 個區塊的磁碟空間 (每個資料區塊都使用 1 MB)。

如果符合以下任何條件，則自動清空操作會暫停：
+ 使用者執行資料定義語言 (DDL) 操作，例如 ALTER TABLE，其需要在自動清空目前作業所在的資料表上進行獨佔鎖定。
+ 高叢集負載的期間。

### 支援並行 VACUUM
<a name="r_VACUUM_usage_notes_concurrent"></a>

Amazon Redshift 支援在叢集或工作群組中的不同工作階段中，並行執行多個清空交易。這表示，您可以一次發出所有清空模式的多個不同執行個體，且每個清空交易都在唯一的資料表上。單一資料表上無法同時值行兩項清空操作。

**執行並行清空的指引**
+ 在不同工作階段中執行並行清空交易時，您應該監控系統資源，並避免並行執行太多清空操作。
+ 建議的並行層級取決於要回收的空間量、要排序的列數和列寬、倉儲的大小，以及與 VACUUM 操作一起執行的工作負載大小。
+ 根據清空交易的模式，從兩個並行清空操作開始，並根據其執行時間和系統負載加入更多。就像使用者發出的其他繁重查詢一樣，如果您在 Amazon Redshift 達到系統資源限制時同時執行太多操作，則清空操作可能會開始排入佇列。
+ 執行多個 Vacuum BOOST 操作時務必謹慎。搭配 BOOST 選項執行 Vacuum 會和系統資源發生競爭，可能影響查詢效能。請在系統負荷較輕時執行 VACUUM BOOST，例如維護操作期間。
+ 如果您未指定資料表名稱，則清空操作會套用至目前資料庫中的所有資料表。這些清空操作仍會循序執行。

## 範例
<a name="r_VACUUM_command-examples"></a>

根據預設的 95% 清空閾值回收空間和資料庫，並排序所有資料表中的資料列。

```
vacuum;
```

回收空間，並根據預設的 95% 清空閾值重新排序 SALES 資料表中的資料列。

```
vacuum sales;
```

一律回收空間並重新排序 SALES 資料表中的資料列。

```
vacuum sales to 100 percent;
```

只有在已排序的資料列少於 75% 時，才重新排序 SALES 資料表中的資料列。

```
 vacuum sort only sales to 75 percent;
```

回收 SALES 資料表中的空間，如此至少有 75% 的剩餘資料列不會在清空後標記為要進行刪除。

```
vacuum delete only sales to 75 percent;
```

重新建立索引，然後清空 LISTING 資料表。

```
vacuum reindex listing;
```

下列命令會傳回錯誤。

```
vacuum reindex listing to 75 percent;
```

重新建立叢集，然後清空 LISTING 資料表。

```
vacuum recluster listing;
```

重新建立叢集，然後使用 BOOST 選項清空 LISTING 資料表。

```
vacuum recluster listing boost;
```

# SQL 函數參考
<a name="c_SQL_functions"></a>

**Topics**
+ [僅限領導節點函數](c_SQL_functions_leader_node_only.md)
+ [彙總函數](c_Aggregate_Functions.md)
+ [陣列函數](c_Array_Functions.md)
+ [位元彙整函數](c_bitwise_aggregate_functions.md)
+ [條件式運算式](c_conditional_expressions.md)
+ [資料類型格式化函數](r_Data_type_formatting.md)
+ [日期和時間函數](Date_functions_header.md)
+ [雜湊函數](hash-functions.md)
+ [HyperLogLog 檔函數](hyperloglog-functions.md)
+ [JSON 函數](json-functions.md)
+ [機器學習函數](ml-function.md)
+ [數學函數](Math_functions.md)
+ [物件函數](Object_Functions.md)
+ [空間函數](geospatial-functions.md)
+ [字串函數](String_functions_header.md)
+ [SUPER 類型資訊函數](c_Type_Info_Functions.md)
+ [VARBYTE 函數與運算子](varbyte-functions.md)
+ [範圍函數](c_Window_functions.md)
+ [系統管理函數](r_System_administration_functions.md)
+ [系統資訊函數](r_System_information_functions.md)

Amazon Redshift 支援許多 SQL 標準延伸的函數，以及標準彙總函數、純量函數和範圍函數。

**注意**  
Amazon Redshift 是以 PostgreSQL 為基礎。在設計和開發您的資料倉儲應用程式時，您必須知道 Amazon Redshift 與 PostgreSQL 之間有多項重要的差異。如需 Amazon Redshift SQL 與 PostgreSQL 之間差異的相關資訊，請參閱 [Amazon Redshift 和 PostgreSQL](c_redshift-and-postgres-sql.md)。

# 僅限領導節點函數
<a name="c_SQL_functions_leader_node_only"></a>

某些 Amazon Redshift 查詢會分配到運算節點上執行；其他的查詢則是只在領導者節點上執行。

當查詢參照使用者建立的資料表或系統資料表 (具有 STL 或 STV 字首的資料表，以及具有 SVL 或 SVV 字首的系統檢視) 時，領導者節點就會將 SQL 分送到運算節點。查詢如果只參考目錄資料表 (具有 PG 字首的資料表，例如 PG\$1TABLE\$1DEF)，或是未參考任何資料表，就只會在領導節點上執行。

某些 Amazon Redshift SQL 函數只有在領導者節點上才支援，在運算節點上不支援。使用領導者節點函數的查詢必須完全在領導者節點上執行，而不是在運算節點上，否則會傳回錯誤。

每個僅限於領導者節點的函數在文件中包含備註，說明如果函數參照使用者定義的資料表或 Amazon Redshift 系統資料表，將會傳回錯誤。

如需詳細資訊，請參閱[領導節點上所支援的 SQL 函數](c_sql-functions-leader-node.md)。

下列 SQL 函數是僅限於領導者節點的函數，在運算節點上不支援：

系統資訊函數
+ CURRENT\$1SCHEMA
+ CURRENT\$1SCHEMAS
+ HAS\$1DATABASE\$1PRIVILEGE
+ HAS\$1SCHEMA\$1PRIVILEGE
+ HAS\$1TABLE\$1PRIVILEGE

字串函數
+ SUBSTR

數學函數
+ FACTORIAL
+  LOG 

下列僅限於領導者節點的函數已被棄用並且不再受支援：

日期函數
+ AGE
+ CURRENT\$1TIME
+ CURRENT\$1TIMESTAMP
+ LOCALTIME
+ ISFINITE
+ NOW

字串函數
+ GETBIT
+ GET\$1BYTE
+ SET\$1BIT
+ SET\$1BYTE
+ TO\$1ASCII

# 彙總函數
<a name="c_Aggregate_Functions"></a>

**Topics**
+ [ANY\$1VALUE 函數](r_ANY_VALUE.md)
+ [APPROXIMATE PERCENTILE\$1DISC 函數](r_APPROXIMATE_PERCENTILE_DISC.md)
+ [AVG 函數](r_AVG.md)
+ [COUNT 函數](r_COUNT.md)
+ [LISTAGG 函數](r_LISTAGG.md)
+ [MAX 函數](r_MAX.md)
+ [MEDIAN 函數](r_MEDIAN.md)
+ [MIN 函數](r_MIN.md)
+ [PERCENTILE\$1CONT 函數](r_PERCENTILE_CONT.md)
+ [STDDEV\$1SAMP 和 STDDEV\$1POP 函數](r_STDDEV_functions.md)
+ [SUM 函數](r_SUM.md)
+ [VAR\$1SAMP 和 VAR\$1POP 函數](r_VARIANCE_functions.md)

彙總函數從一組輸入值計算單一結果值。

使用彙總函數的 SELECT 陳述式可以包含兩個選用子句：GROUP BY 和 HAVING。以下是這些子句的語法 (以 COUNT 函數為範例)：

```
SELECT count (*) expression FROM table_reference
WHERE condition [GROUP BY expression ] [ HAVING condition]
```

GROUP BY 子句依一或多個指定欄中的唯一值來彙總和分組結果。HAVING 子句將傳回的結果限定於特定彙總條件為 true 的列，例如 count (\$1) > 1。HAVING 子句的使用方式與 WHERE 根據欄的值來限定列一樣。如需這些額外子句的範例，請參閱 [COUNT](r_COUNT.md)。

彙總函數不接受巢狀彙總函數或範圍函數做為引數。

# ANY\$1VALUE 函數
<a name="r_ANY_VALUE"></a>

ANY\$1VALUE 函數從輸入運算式值非確定性傳回任何值。如果輸入表達式不會傳回任何資料列，此函數會傳回 `NULL`。如果輸入表達式中有 `NULL` 值，函數也會傳回 `NULL`。如果輸入包含的 `NULL` 值混合了非 `NULL` 的值，則可能會傳回 `NULL`。如果所有值都是 `NULL`，則會傳回 `NULL`。如果沒有符合條件的列，則會傳回 `NULL`。

## 語法
<a name="r_ANY_VALUE-synopsis"></a>

```
ANY_VALUE( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_ANY_VALUE-arguments"></a>

DISTINCT \$1 ALL  
指定 DISTINCT 或 ALL 可從輸入運算式值傳回任何值。DISTINCT 引數沒有任何作用，而且會被忽略。

 *expression *   
函數運算的目標欄或運算式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ BOOLEAN
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ INTERVAL YEAR TO MONTH
+ INTERVAL DAY TO SECOND
+ VARBYTE
+ SUPER
+ HLLSKETCH
+ GEOMETRY
+ GEOGRAPHY

## 傳回值
<a name="r_ANY_VALUE-returns"></a>

傳回與 *expression* 相同的資料類型。

## 使用須知
<a name="r_ANY_VALUE-usage-notes"></a>

如果指定欄 ANY\$1VALUE 函數的陳述式也包含第二個欄參考，則第二個欄必須出現在 GROUP BY 子句中，或包含在彙總函數中。

## 範例
<a name="r_ANY_VALUE-examples"></a>

這些範例使用《Amazon Redshift 入門指南》**中的[步驟 4：從 Amazon S3 載入範例資料](https://docs.aws.amazon.com/redshift/latest/gsg/rs-gsg-create-sample-db.html)中建立的事件表格。下列範例會傳回事件名稱為 Eagles 的任何 dateid 的執行個體。

```
select any_value(dateid) as dateid, eventname from event where eventname ='Eagles' group by eventname;
```

以下是結果。

```
dateid | eventname
-------+---------------
 1878  | Eagles
```

下列範例會傳回事件名稱為 Eagles 或 Cold War Kids 的任何 dateid 的執行個體。

```
select any_value(dateid) as dateid, eventname from event where eventname in('Eagles', 'Cold War Kids') group by eventname;
```

以下是結果。

```
dateid | eventname
-------+---------------
 1922  | Cold War Kids
 1878  | Eagles
```

# APPROXIMATE PERCENTILE\$1DISC 函數
<a name="r_APPROXIMATE_PERCENTILE_DISC"></a>

APPROXIMATE PERCENTILE\$1DISC 是採用離散分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回給定集裡的一個元素。近似法可讓函數執行較快，其相對錯誤率低到約 0.5%。

對於給定的*百分位數*值，APPROXIMATE PERCENTILE\$1DISC 使用分位數摘要演算法，大致估計 ORDER BY 子句中的表達式的離散百分位數。APPROXIMATE PERCENTILE\$1DISC 傳回的值具有大於或等於*百分位數*的最小累積分佈值 (根據相同的排序規格)。

## 語法
<a name="r_APPROXIMATE_PERCENTILE_DISC-synopsis"></a>

```
APPROXIMATE  PERCENTILE_DISC ( percentile )
WITHIN GROUP (ORDER BY expr)
```

## 引數
<a name="r_APPROXIMATE_PERCENTILE_DISC-arguments"></a>

 *percentile*   
介於 0 和 1 之間的數值常數。計算時會忽略 Null。

WITHIN GROUP ( ORDER BY *expr*)   
此子句指定要排序和計算百分位數的數值或日期/時間值。

## 傳回值
<a name="r_APPROXIMATE_PERCENTILE_DISC-returns"></a>

資料類型與 WITHIN GROUP 子句中的 ORDER BY 表達式相同。

## 使用須知
<a name="r_APPROXIMATE_PERCENTILE_DISC-usage-notes"></a>

如果 APPROXIMATE PERCENTILE\$1DISC 陳述式包含 GROUP BY 子句，則會限制結果集。限制會根據節點類型和節點數目而不同。如果超出限制，函數會失敗並傳回下列錯誤。

```
GROUP BY limit for approximate percentile_disc exceeded.
```

如果您需要評估的組數超過限制所允許，請考慮使用 [PERCENTILE\$1CONT 函數](r_PERCENTILE_CONT.md)。

## 範例
<a name="r_APPROXIMATE_PERCENTILE_DISC-examples"></a>

下列範例傳回排名前 10 個日期的銷售數量、銷售總計及第五個百分位數值。

```
select top 10 date.caldate,
count(totalprice), sum(totalprice),
approximate percentile_disc(0.5) 
within group (order by totalprice)
from listing
join date on listing.dateid = date.dateid
group by date.caldate
order by 3 desc;

caldate    | count | sum        | percentile_disc
-----------+-------+------------+----------------
2008-01-07 |   658 | 2081400.00 |         2020.00
2008-01-02 |   614 | 2064840.00 |         2178.00
2008-07-22 |   593 | 1994256.00 |         2214.00
2008-01-26 |   595 | 1993188.00 |         2272.00
2008-02-24 |   655 | 1975345.00 |         2070.00
2008-02-04 |   616 | 1972491.00 |         1995.00
2008-02-14 |   628 | 1971759.00 |         2184.00
2008-09-01 |   600 | 1944976.00 |         2100.00
2008-07-29 |   597 | 1944488.00 |         2106.00
2008-07-23 |   592 | 1943265.00 |         1974.00
```

# AVG 函數
<a name="r_AVG"></a>

 AVG 函數傳回輸入表達式值的平均值 (算術平均數)。AVG 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_AVG-synopsis"></a>

```
AVG ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_AVG-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算平均值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算平均值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="r_AVG-data-types"></a>

 AVG 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION 及 SUPER。

AVG 函數支援的傳回類型如下：
+ BIGINT 代表任何整數類型引數
+ DOUBLE PRECISION 代表浮點數引數
+ 針對任何其他引數類型，傳回與運算式相同的資料類型。

具有 NUMERIC 或 DECIMAL 引數的 AVG 函數，結果的預設精確度為 38。結果的小數位數和引數的小數位數相同。例如，DEC(5,2) 欄的 AVG 會傳回 DEC(38,2) 資料類型。

## 範例
<a name="r_AVG-examples"></a>

從 SALES 資料表尋找每次交易的平均銷售數量：

```
select avg(qtysold)from sales;

avg
-----
2
(1 row)
```

尋找所有列表所列出的平均總價：

```
select avg(numtickets*priceperticket) as avg_total_price from listing;

avg_total_price
-----------------
3034.41
(1 row)
```

尋找平均支付價格，按月份分組，依遞減順序排列：

```
select avg(pricepaid) as avg_price, month 
from sales, date
where sales.dateid = date.dateid
group by month
order by avg_price desc;

avg_price | month
-----------+-------
659.34 | MAR
655.06 | APR
645.82 | JAN
643.10 | MAY
642.72 | JUN
642.37 | SEP
640.72 | OCT
640.57 | DEC
635.34 | JUL
635.24 | FEB
634.24 | NOV
632.78 | AUG
(12 rows)
```

# COUNT 函數
<a name="r_COUNT"></a>

 COUNT 函數計算表達式所定義的列數。

COUNT 函數有下列版本。
+ COUNT ( \$1 ) 計算目標資料表中的所有列數，而不論是否包含 Null。
+ COUNT (*expression*) 計算特定欄或表達式中不含 NULL 值的列數。
+ COUNT (DISTINCT *expression*) 計算某欄或表達式中相異非 NULL 值的個數。
+ APPROXIMATE COUNT DISTINCT 會大致估計某欄或運算式中相異非 NULL 值的個數。

## 語法
<a name="r_COUNT-synopsis"></a>

```
COUNT( * | expression )
```

```
COUNT ( [ DISTINCT | ALL ] expression )
```

```
APPROXIMATE COUNT ( DISTINCT expression )
```

## 引數
<a name="r_COUNT-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。COUNT 函數支援所有引數資料類型。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計數之前會從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計數時會保留表達式中的所有重複值。ALL 為預設值。

APPROXIMATE  
搭配 APPROXIMATE 一起使用時，COUNT DISTINCT 函數會使用 HyperLogLog 演算法，大致估計某欄或運算式中相異非 NULL 值的個數。使用 APPROXIMATE 關鍵字的查詢執行較快，其相對錯誤率低到約 2%。如果每個查詢或每一組 (若有 group by 子句) 傳回數百萬個以上的大量相異值，則查詢一定要採用近似法。如果相異值較少 (數千個)，則近似法可能比精確計數更慢。APPROXIMATE 只能與 COUNT DISTINCT 一起使用。

## 傳回類型
<a name="c_Supported_data_types_count"></a>

COUNT 函數傳回 BIGINT。

## 範例
<a name="r_COUNT-examples"></a>

計算佛羅里達州的所有使用者人數：

```
select count(*) from users where state='FL';

count
-------
510
```

計算 EVENT 表中的所有事件名稱：

```
select count(eventname) from event;

count
-------
8798
```

計算 EVENT 表中的所有事件名稱：

```
select count(all eventname) from event;

count
-------
8798
```

從 EVENT 資料表計算所有唯一會場 ID 的數目：

```
select count(distinct venueid) as venues from event;

venues
--------
204
```

計算每個賣方列出整批銷售門票超過四張的次數。結果依賣方 ID 分組：

```
select count(*), sellerid from listing 
where numtickets > 4
group by sellerid
order by 1 desc, 2;

count | sellerid
------+----------
12    |    6386
11    |    17304
11    |    20123
11    |    25428
...
```

下列範例比較 COUNT 和 APPROXIMATE COUNT 的傳回值和執行時間。

```
select  count(distinct pricepaid) from sales;
              
count
-------
  4528


Time: 48.048 ms

               
select approximate count(distinct pricepaid) from sales;

count
-------
  4553


Time: 21.728 ms
```

# LISTAGG 函數
<a name="r_LISTAGG"></a>

對於查詢中的每一組，LISTAGG 彙整函數依據 ORDER BY 表達式來排序該組的列，然後將這些值串連成單一字串。

## 語法
<a name="r_LISTAGG-synopsis"></a>

```
LISTAGG( [DISTINCT] aggregate_expression [, 'delimiter' ] ) 
[ WITHIN GROUP (ORDER BY order_list) ]
```

## 引數
<a name="r_LISTAGG-arguments"></a>

DISTINCT  
此子句在串連值之前會從指定的運算式中消除重複值。忽略結尾空格。例如，字串 `'a'` 和 `'a '` 被視為重複。LISTAGG 會使用第一個遇到的值。如需詳細資訊，請參閱[多餘空格的意義](r_Character_types.md#r_Character_types-significance-of-trailing-blanks)。

 *aggregate\$1expression*   
 任何有效運算式 (例如欄名)，用於提供要彙總的值。忽略 NULL 值和空字串。

 *delimiter*   
用來區隔串連值的字串常數。預設值為 NULL。

 *WITHIN GROUP (ORDER BY order\$1list)*   
此子句指定彙總值的排序順序。

## 傳回值
<a name="r_LISTAGG-data-types"></a>

VARCHAR(MAX)。如果結果集大於 VARCHAR 大小上限，則 LISTAGG 會傳回下列錯誤：

```
Invalid operation: Result size exceeds LISTAGG limit
```

## 使用須知
<a name="r_LISTAGG-usage-notes"></a>
+ 如果陳述式包含多個使用 WITHIN GROUP 子句的 LISTAGG 函數，則每一個 WITHIN GROUP 子句必須使用相同的 ORDER BY 值。

  例如，下列陳述式會傳回錯誤。

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY sellerid) AS dates
  FROM sales;
  ```

  下列陳述式會成功執行。

  ```
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) 
  WITHIN GROUP (ORDER BY dateid) AS dates
  FROM sales;
  
  SELECT LISTAGG(sellerid) 
  WITHIN GROUP (ORDER BY dateid) AS sellers,
  LISTAGG(dateid) AS dates
  FROM sales;
  ```
+ 您無法使用 LISTAGG、PERCENTILE\$1CONT 和 MEDIAN 彙總函數搭配其他不同的彙總函數使用。

## 範例
<a name="r_LISTAGG-examples"></a>

下列範例彙總賣方 ID，依賣方 ID 排序。

```
SELECT LISTAGG(sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                                                                 
----------------------------------------------------------------------------------------------------------------------------------------
380, 380, 1178, 1178, 1178, 2731, 8117, 12905, 32043, 32043, 32043, 32432, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 47188, 48294
```

下列範例使用 DISTINCT 傳回唯一賣方 ID 的清單。

```
SELECT LISTAGG(DISTINCT sellerid, ', ') 
WITHIN GROUP (ORDER BY sellerid) 
FROM sales
WHERE eventid = 4337;

listagg                                                                                    
-------------------------------------------------------------------------------------------
380, 1178, 2731, 8117, 12905, 32043, 32432, 38669, 38750, 41498, 45676, 46324, 47188, 48294
```

下列範例彙總賣方 ID，依日期順序排序。

```
SELECT LISTAGG(sellerid, ', ')  
WITHIN GROUP (ORDER BY dateid) 
FROM sales
WHERE eventid = 4337;

   listagg
-----------------------------------------------------------------------------------------------------------------------------------------
 41498, 47188, 47188, 1178, 1178, 1178, 380, 45676, 46324, 48294, 32043, 32043, 32432, 12905, 8117, 38750, 2731, 32432, 32043, 380, 38669
```

下列範例以縱線分隔清單傳回 ID 為 660 的買方的銷售日期。

```
SELECT LISTAGG(
    (SELECT caldate FROM date WHERE date.dateid=sales.dateid), ' | '    
)
WITHIN GROUP (ORDER BY sellerid DESC, salesid ASC)
FROM sales
WHERE buyerid = 660;

             listagg
-------------------------------------------------
2008-07-16 | 2008-07-09 | 2008-01-01 | 2008-10-26
```

下列範例以逗號分隔清單傳回買方 ID 660、661 和 662 的銷售 ID。

```
SELECT buyerid, 
LISTAGG(salesid,', ')
WITHIN GROUP (ORDER BY salesid) AS sales_id
FROM sales
WHERE buyerid BETWEEN 660 AND 662
GROUP BY buyerid
ORDER BY buyerid;
            
buyerid |                sales_id
--------+-----------------------------------------------------
660     | 32872, 33095, 33514, 34548
661     | 19951, 20517, 21695, 21931
662     | 3318, 3823, 4215, 51980, 53202, 55908, 57832, 171603
```

# MAX 函數
<a name="r_MAX"></a>

 MAX 函數傳回一個列集的最大值。可使用 DISTINCT 或 ALL，但不影響結果。

## 語法
<a name="r_MAX-synopsis"></a>

```
MAX ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_MAX-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算最大值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算最大值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_max"></a>

傳回與 *expression* 相同的資料類型。MIN 函數的布林同等函數為 [BOOL\$1AND 函數](r_BOOL_AND.md)，MAX 的布林同等函數為 [BOOL\$1OR 函數](r_BOOL_OR.md)。

## 範例
<a name="r_MAX-examples"></a>

從所有銷售中尋找最高支付價格：

```
select max(pricepaid) from sales;

max
----------
12624.00
(1 row)
```

從所有銷售中尋找每張門票的最高支付價格：

```
select max(pricepaid/qtysold) as max_ticket_price
from sales;

max_ticket_price
-----------------
2500.00000000
(1 row)
```

# MEDIAN 函數
<a name="r_MEDIAN"></a>

計算值範圍的中值。忽略範圍內的 `NULL` 值。

MEDIAN 是採用連續分佈模型的反向分佈函數。

MEDIAN 是 [PERCENTILE\$1CONT](r_PERCENTILE_CONT.md) 的特殊情況。

## 語法
<a name="r_MEDIAN-synopsis"></a>

```
MEDIAN(median_expression)
```

## 引數
<a name="r_MEDIAN-arguments"></a>

 *median\$1expression*   
函數運算的目標欄或表達式。

## 資料類型
<a name="r_MEDIAN-data-types"></a>

傳回類型取決於 *median\$1expression* 的資料類型。下表顯示每一個 *median\$1expression* 資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_MEDIAN.html)

## 使用須知
<a name="r_MEDIAN-data-type-usage-notes"></a>

如果 *median\$1expression* 引數是以最大精確度 38 位數定義的 `DECIMAL` 資料類型，MEDIAN 可能會傳回不準確的結果或錯誤。如果 MEDIAN 函數的傳回值超過 38 位數，會將結果截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 *median\$1expression* 引數轉換為較低精確度。

如果陳述式中多次呼叫會排序的彙總函數 (LISTAGG、PERCENTILE\$1CONT 或 MEDIAN)，則所有呼叫必須使用相同的 ORDER BY 值。請注意，MEDIAN 會對表達式值套用隱含的 order by。

例如，下列陳述式會傳回錯誤。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

下列陳述式會成功執行。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 範例
<a name="r_MEDIAN-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例顯示 MEDIAN 產生與 PERCENTILE\$1CONT(0.5) 相同的結果。

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

下列範例會找出每個 sellerid 售出的中位數量。

```
SELECT sellerid, 
MEDIAN(qtysold)
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+
| sellerid | median |
+----------+--------+
|        1 |    1.5 |
|        2 |      2 |
|        3 |      2 |
|        4 |      2 |
|        5 |      1 |
|        6 |      1 |
|        7 |    1.5 |
|        8 |      1 |
|        9 |      4 |
|       12 |      2 |
+----------+--------+
```

若要驗證第一個 sellerid 的先前查詢結果，請使用下列範例。

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# MIN 函數
<a name="r_MIN"></a>

 MIN 函數傳回一個列集的最小值。可使用 DISTINCT 或 ALL，但不影響結果。

## 語法
<a name="r_MIN-synopsis"></a>

```
MIN ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_MIN-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ CHAR
+ VARCHAR
+ DATE
+ TIMESTAMP
+ TIMESTAMPTZ
+ TIME
+ TIMETZ
+ VARBYTE
+ SUPER

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算最小值之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算最小值時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_min"></a>

 傳回與 *expression* 相同的資料類型。MIN 函數的布林同等函數為 [BOOL\$1AND 函數](r_BOOL_AND.md)，MAX 的布林同等函數為 [BOOL\$1OR 函數](r_BOOL_OR.md)。

## 範例
<a name="r_MIN-examples"></a>

從所有銷售中尋找最低支付價格：

```
select min(pricepaid) from sales;

min
-------
20.00
(1 row)
```

從所有銷售中尋找每張門票的最低支付價格：

```
select min(pricepaid/qtysold)as min_ticket_price
from sales;

min_ticket_price
------------------
20.00000000
(1 row)
```

# PERCENTILE\$1CONT 函數
<a name="r_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT 是採用連續分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回插入值，該值將根據排序規格落入給定的百分位數值。

PERCENTILE\$1CONT 在值排序後計算值之間的線性插值。此函數在列根據排序規格來排序後，使用彙總群組中的百分位數值 `(P)` 和非 Null 列數 `(N)` 來計算列號。此列號 `(RN)` 是根據公式 `RN = (1+ (P*(N-1))` 來計算。彙總函數的最終結果是以列號 `CRN = CEILING(RN)` 到 `FRN = FLOOR(RN)` 各列的值之間的線性插值來計算。

最終結果如下。

如果 `(CRN = FRN = RN)`，則結果為 `(value of expression from row at RN)` 

否則結果如下：

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

## 語法
<a name="r_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT(percentile)
WITHIN GROUP(ORDER BY expr)
```

## 引數
<a name="r_PERCENTILE_CONT-arguments"></a>

 *percentile*   
介於 0 到 1 之間的數值常數。計算中會忽略 `NULL` 值。

*expr*  
指定要排序和計算百分位數的數值或日期/時間值。

## 傳回值
<a name="r_PERCENTILE_CONT-returns"></a>

傳回類型取決於 WITHIN GROUP 子句中 ORDER BY 表達式的資料類型。下表顯示每一個 ORDER BY 表達式資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_PERCENTILE_CONT.html)

## 使用須知
<a name="r_PERCENTILE_CONT-usage-notes"></a>

如果 ORDER BY 表達式是以最大精確度 38 位數定義的 DECIMAL 資料類型，PERCENTILE\$1CONT 可能會傳回不準確的結果或錯誤。如果 PERCENTILE\$1CONT 函數的傳回值超過 38 位數，結果會截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 ORDER BY 表達式轉換為較低精確度。

如果陳述式中多次呼叫會排序的彙總函數 (LISTAGG、PERCENTILE\$1CONT 或 MEDIAN)，則所有呼叫必須使用相同的 ORDER BY 值。請注意，MEDIAN 會對表達式值套用隱含的 order by。

例如，下列陳述式會傳回錯誤。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

An error occurred when executing the SQL command:
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(pricepaid)
FROM sales 
GROUP BY salesid, pricepaid;

ERROR: within group ORDER BY clauses for aggregate functions must be the same
```

下列陳述式會成功執行。

```
SELECT TOP 10 salesid, SUM(pricepaid), 
PERCENTILE_CONT(0.6) WITHIN GROUP(ORDER BY salesid),
MEDIAN(salesid)
FROM sales 
GROUP BY salesid, pricepaid;
```

## 範例
<a name="r_PERCENTILE_CONT-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例顯示 PERCENTILE\$1CONT(0.5) 產生與 MEDIAN 相同的結果。

```
SELECT TOP 10 DISTINCT sellerid, qtysold, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold),
MEDIAN(qtysold) 
FROM sales
GROUP BY sellerid, qtysold;

+----------+---------+-----------------+--------+
| sellerid | qtysold | percentile_cont | median |
+----------+---------+-----------------+--------+
|        2 |       2 |               2 |      2 |
|       26 |       1 |               1 |      1 |
|       33 |       1 |               1 |      1 |
|       38 |       1 |               1 |      1 |
|       43 |       1 |               1 |      1 |
|       48 |       2 |               2 |      2 |
|       48 |       3 |               3 |      3 |
|       77 |       4 |               4 |      4 |
|       85 |       4 |               4 |      4 |
|       95 |       2 |               2 |      2 |
+----------+---------+-----------------+--------+
```

以下範例會找出 SALES 表格中每個 sellerid 的銷售數量的 PERCENTILE\$1CONT(0.5) 和 PERCENTILE\$1CONT(0.75)。

```
SELECT sellerid, 
PERCENTILE_CONT(0.5) WITHIN GROUP(ORDER BY qtysold) as pct_50,
PERCENTILE_CONT(0.75) WITHIN GROUP(ORDER BY qtysold) as pct_75
FROM sales
GROUP BY sellerid
ORDER BY sellerid
LIMIT 10;

+----------+--------+---------+
| sellerid | pct_50 | pct_75 |
+----------+--------+---------+
|        1 |    1.5 |    1.75 |
|        2 |      2 |    2.25 |
|        3 |      2 |       3 |
|        4 |      2 |       2 |
|        5 |      1 |     1.5 |
|        6 |      1 |       1 |
|        7 |    1.5 |    1.75 |
|        8 |      1 |       1 |
|        9 |      4 |       4 |
|       12 |      2 |    3.25 |
+----------+--------+---------+
```

若要驗證第一個 sellerid 的先前查詢結果，請使用下列範例。

```
SELECT qtysold 
FROM sales 
WHERE sellerid=1;

+---------+
| qtysold |
+---------+
|       2 |
|       1 |
+---------+
```

# STDDEV\$1SAMP 和 STDDEV\$1POP 函數
<a name="r_STDDEV_functions"></a>

 STDDEV\$1SAMP 和 STDDEV\$1POP 函數傳回一組數值 (整數、小數或浮點數) 的樣本標準差和母體標準差。STDDEV\$1SAMP 函數的結果相當於同一組值的樣本變異數平方根。

STDDEV\$1SAMP 和 STDDEV 是同一個函數的同義詞。

## 語法
<a name="r_STDDEV_functions-syntax"></a>

```
STDDEV_SAMP | STDDEV ( [ DISTINCT | ALL ] expression)
STDDEV_POP ( [ DISTINCT | ALL ] expression)
```

表達式必須為整數、小數或浮點數資料類型。不論表達式的資料類型為何，此函數的傳回類型都是雙精確度數字。

**注意**  
標準差是採用浮點運算來計算，所得結果可能稍不精確。

## 使用須知
<a name="r_STDDEV_usage_notes"></a>

對包含單一值的表達式計算樣本標準差 (STDDEV 或 STDDEV\$1SAMP) 時，函數的結果為 NULL，不是 0。

## 範例
<a name="r_STDDEV_functions-examples"></a>

下列查詢傳回 VENUE 資料表的 VENUESEATS 欄中各值的平均值，接著傳回同一組值的樣本標準差和母體標準差。VENUESEATS 是 INTEGER 欄。結果的小數位數簡化到 2 位數。

```
select avg(venueseats),
cast(stddev_samp(venueseats) as dec(14,2)) stddevsamp,
cast(stddev_pop(venueseats) as dec(14,2)) stddevpop
from venue;

avg  | stddevsamp | stddevpop
-------+------------+-----------
17503 |   27847.76 |  27773.20
(1 row)
```

下列查詢傳回 SALES 資料表中的 COMMISSION 欄的樣本標準差。COMMISSION 是 DECIMAL 欄。結果的小數位數簡化到 10 位數。

```
select cast(stddev(commission) as dec(18,10))
from sales;

stddev
----------------
130.3912659086
(1 row)
```

下列查詢將 COMMISSION 欄的樣本標準差轉換為整數。

```
select cast(stddev(commission) as integer)
from sales;

stddev
--------
130
(1 row)
```

下列查詢傳回 COMMISSION 欄的樣本標準差和樣本變異數平方根。這些計算的結果相同。

```
select
cast(stddev_samp(commission) as dec(18,10)) stddevsamp,
cast(sqrt(var_samp(commission)) as dec(18,10)) sqrtvarsamp
from sales;

stddevsamp   |  sqrtvarsamp
----------------+----------------
130.3912659086 | 130.3912659086
(1 row)
```

# SUM 函數
<a name="r_SUM"></a>

 SUM 函數傳回輸入欄或表達式值的總和。SUM 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_SUM-synopsis"></a>

```
SUM ( [ DISTINCT | ALL ] expression )
```

## 引數
<a name="r_SUM-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。*expression* 是下列其中一種資料類型：  
+ SMALLINT
+ INTEGER
+ BIGINT
+ NUMERIC
+ DECIMAL
+ REAL
+ DOUBLE PRECISION
+ SUPER

DISTINCT \$1 ALL   
如果指定引數 DISTINCT，則函數在計算總和之前，將從指定的表達式中消除所有重複值。如果指定引數 ALL，則函數在計算總和時會保留表達式中的所有重複值。ALL 為預設值。

## 資料類型
<a name="c_Supported_data_types_sum"></a>

SUM 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL、DOUBLE PRECISION 及 SUPER。

SUM 函數支援的傳回類型如下 
+ BIGINT 代表 BIGINT、SMALLINT 及 INTEGER 引數
+ NUMERIC 代表 NUMERIC 引數
+ DOUBLE PRECISION 代表浮點數引數
+ 針對任何其他引數類型，傳回與運算式相同的資料類型。

具有 NUMERIC 或 DECIMAL 引數的 SUM 函數，結果的預設精確度為 38。結果的小數位數和引數的小數位數相同。例如，DEC(5,2) 欄的 SUM 會傳回 DEC(38,2) 資料類型。

## 範例
<a name="r_SUM-examples"></a>

 從 SALES 資料表中尋找所有已付佣金的總和：

```
select sum(commission) from sales;

sum
-------------
16614814.65
(1 row)
```

尋找佛羅里達州的所有會場的座位數：

```
select sum(venueseats) from venue
where venuestate = 'FL';

sum
--------
250411
(1 row)
```

尋找五月售出的座位數：

```
select sum(qtysold) from sales, date
where sales.dateid = date.dateid and date.month = 'MAY';

sum
-------
32291
(1 row)
```

# VAR\$1SAMP 和 VAR\$1POP 函數
<a name="r_VARIANCE_functions"></a>

 VAR\$1SAMP 和 VAR\$1POP 函數傳回一組數值 (整數、小數或浮點數) 的樣本變異數和母體變異數。VAR\$1SAMP 函數的結果相當於同一組值的平方樣本標準差。

VAR\$1SAMP 和 VARIANCE 是同一個函數的同義詞。

## 語法
<a name="r_VARIANCE_functions-syntax"></a>

```
VAR_SAMP | VARIANCE ( [ DISTINCT | ALL ] expression)
VAR_POP ( [ DISTINCT | ALL ] expression)
```

表達式必須為整數、小數或浮點數資料類型。不論表達式的資料類型為何，此函數的傳回類型都是雙精確度數字。

**注意**  
這些函數的結果可能隨著資料倉儲叢集而有所不同，視每個案例中的叢集組態而定。

## 使用須知
<a name="r_VARIANCE_usage_notes"></a>

對包含單一值的表達式計算樣本變異數 (VARIANCE 或 VAR\$1SAMP) 時，函數的結果為 NULL，不是 0。

## 範例
<a name="r_VARIANCE_functions-examples"></a>

下列查詢傳回 LISTING 資料表中的 NUMTICKETS 欄的四捨五入樣本變異數和母體變異數。

```
select avg(numtickets),
round(var_samp(numtickets)) varsamp,
round(var_pop(numtickets)) varpop
from listing;

avg | varsamp | varpop
-----+---------+--------
10 |      54 |     54
(1 row)
```

下列查詢執行同樣的計算，但將結果轉換為小數值。

```
select avg(numtickets),
cast(var_samp(numtickets) as dec(10,4)) varsamp,
cast(var_pop(numtickets) as dec(10,4)) varpop
from listing;

avg | varsamp | varpop
-----+---------+---------
10 | 53.6291 | 53.6288
(1 row)
```

# 陣列函數
<a name="c_Array_Functions"></a>

接下來，您可以找到 Amazon Redshift 支援存取和操作陣列的 SQL 陣列函數的說明。

**Topics**
+ [ARRAY 函數](r_array.md)
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)
+ [ARRAY\$1CONTAINS 函數](array_contains.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)
+ [ARRAY\$1EXCEPT 函數](array_except.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)
+ [ARRAY\$1INTERSECTION 函數](array_intersection.md)
+ [ARRAY\$1POSITION 函數](array_position.md)
+ [ARRAY\$1POSITIONS 函數](array_positions.md)
+ [ARRAY\$1SORT 函數](array_sort.md)
+ [ARRAY\$1UNION 函數](array_union.md)
+ [ARRAYS\$1OVERLAP 函數](arrays_overlap.md)
+ [GET\$1ARRAY\$1LENGTH 函數](get_array_length.md)
+ [SPLIT\$1TO\$1ARRAY 函數](split_to_array.md)
+ [SUBARRAY 函數](r_subarray.md)

# ARRAY 函數
<a name="r_array"></a>

建立 SUPER 資料類型的陣列。

## 語法
<a name="r_array-synopsis"></a>

```
ARRAY( [ expr1 ] [, expr2 [, ... ]] )
```

## 引數
<a name="r_array-argument"></a>

 *expr1, expr2*   
任何 Amazon Redshift 資料類型的運算式 (日期和時間類型除外)，因為 Amazon Redshift 不會將日期和時間類型轉換為 SUPER 資料類型。引數不需要是相同的資料類型。

## 傳回類型
<a name="r_array-return-type"></a>

ARRAY 函數會傳回 SUPER 資料類型。

## 範例
<a name="r_array-example"></a>

下列範例顯示數值陣列和不同資料類型的陣列。

```
--an array of numeric values
select ARRAY(1,50,null,100);
      array
------------------
 [1,50,null,100]
(1 row)

--an array of different data types
select ARRAY(1,'abc',true,3.14);
        array
-----------------------
 [1,"abc",true,3.14]
(1 row)
```

## 另請參閱
<a name="r_array-see-also"></a>
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)
+ [SPLIT\$1TO\$1ARRAY 函數](split_to_array.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)

# ARRAY\$1CONCAT 函數
<a name="r_array_concat"></a>

串連兩個陣列以建立陣列，其中包含第一個陣列中的所有元素，後面接著第二個陣列中的所有元素。兩個引數必須是有效的 SUPER 陣列。

## 語法
<a name="r_array_concat-synopsis"></a>

```
ARRAY_CONCAT( array1, array2 )
```

## 引數
<a name="r_array_concat-argument-arguments"></a>

 *array1*  
指定要串連的兩個陣列中第一個的值。

 *array2*  
指定要串連的兩個陣列中第二個的值。

## 傳回類型
<a name="r_array_concat-return-type"></a>

ARRAY\$1CONCAT 函數會傳回 SUPER 資料值。

## 範例
<a name="r_array_concat-example"></a>

下列範例顯示串連相同類型的兩個陣列，以及串連不同類型的兩個陣列。

```
-- concatenating two arrays 
SELECT ARRAY_CONCAT(ARRAY(10001,10002),ARRAY(10003,10004));
              array_concat
------------------------------------
 [10001,10002,10003,10004]
(1 row)

-- concatenating two arrays of different types 
SELECT ARRAY_CONCAT(ARRAY(10001,10002),ARRAY('ab','cd'));
          array_concat
------------------------------
 [10001,10002,"ab","cd"]
(1 row)
```

## 另請參閱
<a name="r_array_concat-see-also"></a>
+ [ARRAY\$1UNION 函數](array_union.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)
+ [SPLIT\$1TO\$1ARRAY 函數](split_to_array.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)

# ARRAY\$1CONTAINS 函數
<a name="array_contains"></a>

檢查陣列是否包含指定的值，如果找到，則傳回 TRUE。

## 語法
<a name="array_contains-syntax"></a>

```
ARRAY_CONTAINS( array, value [, null_match] )
```

## 引數
<a name="array_contains-arguments"></a>

 *陣列*   
SUPER 表達式，指定要在其中搜尋的陣列。

 *value*   
指定要搜尋之元素的值。

 *null\$1match*   
布林值，指定 NULL 值的處理方式：  
+ *null\$1match* = FALSE：搜尋 NULL 會傳回 NULL。如果陣列包含 NULL 值，且找不到非 NULL 搜尋值的相符項目，則 會傳回 NULL。
+ *null\$1match* = TRUE：NULLs 視為有效的可搜尋元素。如果陣列包含 NULL 值，且找不到非 NULL 搜尋值的相符項目，則會傳回 FALSE。
預設值為 TRUE。  
組態選項也可以指定預設 NULL 處理：  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 傳回類型
<a name="array_contains-return-type"></a>

ARRAY\$1CONTAINS 函數會傳回 BOOLEAN 類型。

## 範例
<a name="array_contains-example"></a>

下列範例顯示 ARRAY\$1CONTAINS 函數。

```
SELECT ARRAY_CONTAINS(ARRAY('red', 'green'), 'red');
array_contains
----------------
 t
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 TRUE 的函數行為。

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), NULL);
array_contains
----------------
 t
(1 row)

-- The array can contain NULLs
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'blue', TRUE);
array_contains
----------------
 f
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 FALSE 的函數行為。請注意，在函數中指定 *null\$1match* 行為會覆寫預設組態設定。

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_CONTAINS(ARRAY('red', 'green'), NULL, FALSE);
array_contains
----------------
 
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'green');
array_contains
----------------
 t
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_CONTAINS(ARRAY('red', NULL, 'green'), 'blue');
array_contains
----------------
 
(1 row)
```

## 另請參閱
<a name="array_contains-see-also"></a>
+ [ARRAY\$1POSITION 函數](array_position.md)
+ [ARRAY\$1POSITIONS 函數](array_positions.md)
+ [ARRAYS\$1OVERLAP 函數](arrays_overlap.md)

# ARRAY\$1DISTINCT 函數
<a name="array_distinct"></a>

建立新的陣列，只包含輸入陣列中的唯一元素，移除所有重複項目。輸出陣列中的元素順序不保證符合輸入順序。NULL 值視為有效元素；如果輸入陣列中存在多個 NULLs，則輸出中只會顯示一個 NULL。

## 語法
<a name="array_distinct-syntax"></a>

```
ARRAY_DISTINCT( array )
```

## 引數
<a name="array_distinct-arguments"></a>

 *陣列*   
指定陣列的 SUPER 表達式。

## 傳回類型
<a name="array_distinct-return-type"></a>

ARRAY\$1DISTINCT 函數會傳回 SUPER 類型。

## 範例
<a name="array_distinct-example"></a>

下列範例顯示 ARRAY\$1DISTINCT 函數。

```
SELECT ARRAY_DISTINCT(ARRAY(1, 1, 'a', 'a', NULL, NULL));
 array_distinct 
----------------
 [1,"a",null]
(1 row)

SELECT ARRAY_DISTINCT(ARRAY_CONCAT(ARRAY(1,2,3,3),ARRAY(2,3,4,4)));
 array_distinct 
----------------
 [1,2,3,4]
(1 row)
```

## 另請參閱
<a name="array_distinct-see-also"></a>
+ [ARRAY\$1UNION 函數](array_union.md)
+ [ARRAY\$1SORT 函數](array_sort.md)
+ [ARRAY\$1EXCEPT 函數](array_except.md)
+ [ARRAY\$1INTERSECTION 函數](array_intersection.md)

# ARRAY\$1EXCEPT 函數
<a name="array_except"></a>

保留來自第二個陣列中不存在之第一個陣列的元素，以傳回兩個陣列之間的差異。函數是 NULL 安全的，這表示它將 NULLs 視為已知物件。

## 語法
<a name="array_except-syntax"></a>

```
ARRAY_EXCEPT( array1, array2 [, distinct] )
```

## 引數
<a name="array_except-arguments"></a>

 *array1*   
指定第一個陣列的 SUPER 表達式。

 *array2*   
指定第二個陣列的 SUPER 表達式。

 *distinct*   
布林值，指定是否僅傳回不同的元素：  
+ *distinct* = FALSE：適用多組語意。每個在第一個陣列中出現的 元素都會與第二個陣列中的出現相符。如果第一個陣列的元素出現次數多於第二個陣列，則結果中會保留額外的出現次數。
+ *distinct* = TRUE：設定語意適用。這兩個陣列都視為集合，忽略重複的元素。如果第一個陣列中的元素存在於第二個陣列中的任何位置，則無論發生次數為何，都會將其移除。
預設值為 FALSE。

## 傳回類型
<a name="array_except-return-type"></a>

ARRAY\$1EXCEPT 函數會傳回 SUPER 類型。

## 範例
<a name="array_except-example"></a>

下列範例顯示 ARRAY\$1EXCEPT 函數。

```
SELECT ARRAY_EXCEPT(ARRAY('a','b','c'), ARRAY('b','c','d'));
 array_except
--------------
 ["a"]
(1 row)
```

多組語意：

```
SELECT ARRAY_EXCEPT(ARRAY('b','b','b','b'), ARRAY('b','b'));
 array_except
--------------
 ["b","b"]
(1 row)
```

設定語意：

```
SELECT ARRAY_EXCEPT(ARRAY('a','b','b'), ARRAY('b'), TRUE);
 array_except
--------------
 ["a"]
(1 row)
```

NULLs視為已知物件。

```
SELECT ARRAY_EXCEPT(ARRAY('a',NULL), ARRAY(NULL));
 array_except
--------------
 ["a"]
(1 row)
```

## 另請參閱
<a name="array_except-see-also"></a>
+ [ARRAY\$1INTERSECTION 函數](array_intersection.md)
+ [ARRAY\$1UNION 函數](array_union.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)
+ [ARRAYS\$1OVERLAP 函數](arrays_overlap.md)

# ARRAY\$1FLATTEN 函數
<a name="array_flatten"></a>

將多個陣列合併成 SUPER 類型的單個陣列。第一個內部陣列的元素會先出現，後面接著後續內部陣列的元素。NULLs視為已知物件。

## 語法
<a name="array_flatten-syntax"></a>

```
ARRAY_FLATTEN( array )
```

## 引數
<a name="array_flatten-arguments"></a>

 *陣列*   
陣列形式的 SUPER 表達式。

## 傳回類型
<a name="array_flatten-returm-type"></a>

ARRAY\$1FLATTEN 函數會傳回 SUPER 類型。

## 範例
<a name="array_flatten-example"></a>

下列範例顯示 ARRAY\$1FLATTEN 函數。

```
SELECT ARRAY_FLATTEN(ARRAY(ARRAY(1,2,3,4),ARRAY(5,6,7,8),ARRAY(9,10)));
     array_flatten
------------------------
 [1,2,3,4,5,6,7,8,9,10]
(1 row)
```

## 另請參閱
<a name="array_flatten-see-also"></a>
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)
+ [SUBARRAY 函數](r_subarray.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)

# ARRAY\$1INTERSECTION 函數
<a name="array_intersection"></a>

傳回新陣列，只包含兩個輸入陣列中存在的元素。函數是 NULL 安全的，這表示它將 NULLs 視為已知物件。不保證結果中的元素順序。

## 語法
<a name="array_intersection-syntax"></a>

```
ARRAY_INTERSECTION( array1, array2 [, distinct] )
```

## 引數
<a name="array_intersection-arguments"></a>

 *array1*   
指定陣列的 SUPER 表達式。

 *array2*   
指定陣列的 SUPER 表達式。

 *distinct*   
布林值，指定是否僅傳回不同的元素：  
+ *distinct* = FALSE：適用多組語意。會保留重複的元素，且結果中每個元素的頻率等於兩個輸入陣列中其頻率的最小值。
+ *distinct* = TRUE：設定語意適用。只會傳回兩個陣列通用的唯一元素，不會重複。
預設值為 FALSE。

## 傳回類型
<a name="array_intersection-return-type"></a>

ARRAY\$1INTERSECTION 函數會傳回 SUPER 類型。

## 範例
<a name="array_intersection-example"></a>

下列範例顯示 ARRAY\$1INTERSECTION 函數。

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','c'), ARRAY('b','c','d'));
 array_intersection 
--------------------
 ["b","c"]
(1 row)
```

多組語意：

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','b'), ARRAY('b','b','b'));
 array_intersection 
--------------------
 ["b","b"]
(1 row)
```

設定語意：

```
SELECT ARRAY_INTERSECTION(ARRAY('a','b','b'), ARRAY('b','b','b'), TRUE);
 array_intersection 
--------------------
 ["b"]
(1 row)
```

NULLs視為已知物件。

```
SELECT ARRAY_INTERSECTION(ARRAY('a',NULL), ARRAY('b',NULL));
 array_intersection 
--------------------
 [null]
(1 row)
```

## 另請參閱
<a name="array_intersection-see-also"></a>
+ [ARRAY\$1EXCEPT 函數](array_except.md)
+ [ARRAYS\$1OVERLAP 函數](arrays_overlap.md)
+ [ARRAY\$1UNION 函數](array_union.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)

# ARRAY\$1POSITION 函數
<a name="array_position"></a>

傳回陣列中第一次出現指定元素的位置 （索引）。索引以 0 為基礎，其中 0 表示第一個元素，1 表示第二個元素，以此類推。如果在陣列中找不到 元素，則傳回 -1。

函數只會傳回第一次出現的位置。若要尋找所有出現的項目，請考慮使用 [ARRAY\$1POSITIONS 函數](array_positions.md)函數。

## 語法
<a name="array_position-syntax"></a>

```
ARRAY_POSITION( array, value [, null_match] )
```

## 引數
<a name="array_position-arguments"></a>

 *陣列*   
SUPER 表達式，指定要在其中搜尋的陣列。

 *value*   
指定要搜尋之元素的值。

 *null\$1match*   
布林值，指定 NULL 值的處理方式：  
+ *null\$1match* = FALSE：搜尋 NULL 會傳回 NULL。如果陣列包含 NULL 值，且找不到非 NULL 搜尋值的相符項目，則 會傳回 NULL。
+ *null\$1match* = TRUE：NULLs 視為有效的可搜尋元素。如果陣列包含 NULL 值，但找不到非 NULL 搜尋值的相符項目，則會傳回 -1。
預設值為 TRUE。  
組態選項也可以指定預設 NULL 處理：  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 傳回類型
<a name="array_position-return-type"></a>

ARRAY\$1POSITION 函數會傳回 INT 類型。

## 範例
<a name="array_position-example"></a>

下列範例顯示 ARRAY\$1POSITION 函數。

```
SELECT ARRAY_POSITION(ARRAY('red', 'green'), 'red');
 array_position 
----------------
              0
(1 row)

SELECT ARRAY_POSITION(ARRAY(1, 2, 3), 4);
 array_position 
----------------
             -1
(1 row)

-- only the position of the first occurrence is returned
SELECT ARRAY_POSITION(ARRAY('red', 'green', 'red'), 'red');
 array_position 
----------------
              0
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 TRUE 的函數行為。

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), NULL);
 array_position 
----------------
              1
(1 row)

-- The array can contain NULLs
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'blue', TRUE);
 array_position 
----------------
             -1
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 FALSE 的函數行為。請注意，在函數中指定 *null\$1match* 行為會覆寫預設組態設定。

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_POSITION(ARRAY('red', 'green'), NULL, FALSE);
 array_position 
----------------
               
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'green');
 array_position 
----------------
              2
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_POSITION(ARRAY('red', NULL, 'green'), 'blue');
 array_position 
----------------
               
(1 row)
```

## 另請參閱
<a name="array_position-see-also"></a>
+ [ARRAY\$1POSITIONS 函數](array_positions.md)
+ [ARRAY\$1CONTAINS 函數](array_contains.md)
+ [SUBARRAY 函數](r_subarray.md)

# ARRAY\$1POSITIONS 函數
<a name="array_positions"></a>

傳回位置 （索引） 的陣列，其中指定的元素會出現在輸入陣列中。索引以 0 為基礎，其中 0 表示第一個元素，1 表示第二個元素，以此類推。如果找不到 元素，則傳回空陣列。

## 語法
<a name="array_positions-syntax"></a>

```
ARRAY_POSITIONS( array, value [, null_match] )
```

## 引數
<a name="array_positions-arguments"></a>

 *陣列*   
SUPER 表達式，指定要在其中搜尋的陣列。

 *value*   
指定要搜尋之元素的值。

 *null\$1match*   
布林值，指定 NULL 值的處理方式：  
+ *null\$1match* = FALSE：搜尋 NULL 會傳回 NULL。如果陣列包含 NULL 值，且找不到非 NULL 搜尋值的相符項目，則 會傳回 NULL。
+ *null\$1match* = TRUE：NULLs 視為有效的可搜尋元素。如果陣列包含 NULL 值，且找不到非 NULL 搜尋值的相符項目，則會傳回空的陣列。
預設值為 TRUE。  
組態選項也可以指定預設 NULL 處理：  

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;
```

## 傳回類型
<a name="array_positions-return-type"></a>

ARRAY\$1POSITIONS 函數會傳回 SUPER 類型。

## 範例
<a name="array_positions-example"></a>

下列範例顯示 ARRAY\$1POSITIONS 函數。

```
SELECT ARRAY_POSITIONS(ARRAY('red', 'green', 'red'), 'red');
 array_positions 
-----------------
 [0,2]
(1 row)

SELECT ARRAY_POSITIONS(ARRAY(1, 2, 3), 4);
 array_positions 
-----------------
 []
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 TRUE 的函數行為。

```
SET default_array_search_null_handling to TRUE;

-- NULL search is enabled
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green', NULL), NULL);
 array_positions 
-----------------
 [1,3]
(1 row)

-- The array can contain NULLs
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'blue', TRUE);
 array_positions 
-----------------
 []
(1 row)
```

下列範例顯示將 *null\$1match* 設定為 FALSE 的函數行為。請注意，在函數中指定 *null\$1match* 行為會覆寫預設組態設定。

```
-- same as null_match = TRUE
SET default_array_search_null_handling to TRUE;

-- NULL search is disabled. The default behavior is overridden
SELECT ARRAY_POSITIONS(ARRAY('red', 'green'), NULL, FALSE);
 array_positions 
-----------------
 
(1 row)

-- same as null_match = FALSE
SET default_array_search_null_handling to FALSE;

-- The array contains NULL and a match is found
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'green');
 array_positions 
-----------------
 [2]
(1 row)

-- The array contains NULL but no match is found
SELECT ARRAY_POSITIONS(ARRAY('red', NULL, 'green'), 'blue');
 array_positions 
-----------------
 
(1 row)
```

## 另請參閱
<a name="array_positions-see-also"></a>
+ [ARRAY\$1POSITION 函數](array_position.md)
+ [ARRAY\$1CONTAINS 函數](array_contains.md)
+ [SUBARRAY 函數](r_subarray.md)

# ARRAY\$1SORT 函數
<a name="array_sort"></a>

以遞增或遞減順序建立輸入陣列的排序版本。您可以指定 NULL 值應出現在結果中的位置。函數是 NULL 安全的，這表示它會將 NULLs 視為已知物件。

## 語法
<a name="array_sort-syntax"></a>

```
ARRAY_SORT( array [, sort_ascending [, nulls_first]] )
```

## 引數
<a name="array_sort-arguments"></a>

 *陣列*   
SUPER 表達式，指定要排序的陣列。

 *sort\$1ascending*   
布林值，指定要以遞增或遞減順序排序陣列：  
+ 指定 TRUE 以遞增順序排序元素。
+ 指定 FALSE 以遞減順序排序元素。
預設值為 TRUE。

 *nulls\$1first*   
指定 NULL 定位的布林值：  
+ 指定 TRUE，將 NULLs放在已排序陣列的開頭。
+ 指定 FALSE，將 NULLs放在已排序陣列的結尾。

## 傳回類型
<a name="array_sort-return-type"></a>

ARRAY\$1SORT 函數會傳回 SUPER 類型。

## 注意
<a name="array_sort-note"></a>

排序包含混合資料類型的陣列時，元素會根據下列類型優先順序排序：
+ 布林值
+ 數值
+ 字串值
+ 陣列
+ 物件/字典

在每個類型類別中，元素會根據其自然順序排序 （例如，數字按數字排序，字串按字母順序排序）。

## 範例
<a name="array_sort-example"></a>

下列範例顯示 ARRAY\$1SORT 函數。

```
-- Ascending order (default)
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false));
        array_sort        
--------------------------
 [false,0,1,"a","b",null]
(1 row)

-- Descending order
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false), False);
        array_sort        
--------------------------
 [null,"b","a",1,0,false]
(1 row)

-- Descending order with NULLs at the end of the sorted array
SELECT ARRAY_SORT(ARRAY('b', 'a', 0, NULL, 1, false), False, False);
        array_sort        
--------------------------
 ["b","a",1,0,false,null]
(1 row)
```

## 另請參閱
<a name="array_sort-see-also"></a>
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)
+ [SUBARRAY 函數](r_subarray.md)

# ARRAY\$1UNION 函數
<a name="array_union"></a>

結合兩個陣列，並傳回包含所有唯一值的單一陣列，移除任何重複項目。函數是 NULL 安全的，這表示它會將 NULLs 視為已知物件。不保證結果中的元素順序。

## 語法
<a name="array_union-syntax"></a>

```
ARRAY_UNION( array1, array2 )
```

## 引數
<a name="array_union-arguments"></a>

 *array1*   
指定第一個陣列的 SUPER 表達式。

 *array2*   
指定第二個陣列的 SUPER 表達式。

## 傳回類型
<a name="array_union-return-type"></a>

ARRAY\$1UNION 函數會傳回 SUPER 類型。

## 範例
<a name="array_union-example"></a>

下列範例顯示 ARRAY\$1UNION 函數。

```
SELECT ARRAY_UNION(ARRAY('a','b','b'), ARRAY('b','c','c'));
  array_union  
---------------
 ["a","b","c"]
(1 row)
```

不保證元素的順序：

```
SELECT ARRAY_UNION(ARRAY('b','a','b'), ARRAY(NULL,'b',NULL));
  array_union   
----------------
 ["b","a",null]
(1 row)
```

## 另請參閱
<a name="array_union-see-also"></a>
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)
+ [ARRAY\$1DISTINCT 函數](array_distinct.md)
+ [ARRAY\$1INTERSECTION 函數](array_intersection.md)
+ [ARRAY\$1EXCEPT 函數](array_except.md)

# ARRAYS\$1OVERLAP 函數
<a name="arrays_overlap"></a>

檢查兩個陣列是否有任何常見元素。如果陣列共用至少一個元素，則傳回 TRUE，如果沒有常見元素，則傳回 FALSE。函數是 NULL 安全的，這表示它會將 NULLs 視為已知物件。

## 語法
<a name="arrays_overlap-syntax"></a>

```
ARRAYS_OVERLAP( array1, array2 )
```

## 引數
<a name="arrays_overlap-arguments"></a>

 *array1*   
指定陣列的 SUPER 表達式。

 *array2*   
指定陣列的 SUPER 表達式。

## 傳回類型
<a name="arrays_overlap-return-type"></a>

ARRAYS\$1OVERLAP 函數會傳回布林值類型。

## 範例
<a name="arrays_overlap-example"></a>

下列範例顯示 ARRAYS\$1OVERLAP 函數。

```
SELECT ARRAYS_OVERLAP(ARRAY('blue', 'green'), ARRAY('red', 'green'));
 arrays_overlap 
----------------
 t
(1 row)
```

下列範例顯示 NULLs 被視為有效的元素。

```
SELECT ARRAYS_OVERLAP(ARRAY('red', NULL, 'blue'), ARRAY('green', NULL));
 arrays_overlap 
----------------
 t
(1 row)

SELECT ARRAYS_OVERLAP(ARRAY('red', NULL, 'blue'), ARRAY('green'));
 arrays_overlap 
----------------
 f
(1 row)

SELECT ARRAYS_OVERLAP(JSON_PARSE('[null]'), ARRAY(NULL));
 arrays_overlap 
----------------
 t
(1 row)
```

## 另請參閱
<a name="arrays_overlap-see-also"></a>
+ [ARRAY\$1INTERSECTION 函數](array_intersection.md)
+ [ARRAY\$1CONTAINS 函數](array_contains.md)
+ [ARRAY\$1EXCEPT 函數](array_except.md)

# GET\$1ARRAY\$1LENGTH 函數
<a name="get_array_length"></a>

傳回指定物件或陣列路徑的 SUPER 陣列長度。

## 語法
<a name="get_array_length-syntax"></a>

```
GET_ARRAY_LENGTH( super_expr )
```

## 引數
<a name="get_array_length-arguments"></a>

 *super\$1expr*   
陣列形式的有效 SUPER 運算式。

## 傳回類型
<a name="get_array_length-returm-type"></a>

GET\$1ARRAY\$1LENGTH 函數會傳回 INT。

## 範例
<a name="get_array_length-example"></a>

下列範例顯示 GET\$1ARRAY\$1LENGTH 函數。

```
SELECT GET_ARRAY_LENGTH(ARRAY(1,2,3,4,5,6,7,8,9,10));
 get_array_length
----------------------
            10
(1 row)
```

# SPLIT\$1TO\$1ARRAY 函數
<a name="split_to_array"></a>

使用分隔符號做為選擇性的參數。如果沒有分隔符號，則預設值為逗號。

## 語法
<a name="split_to_array-syntax"></a>

```
SPLIT_TO_ARRAY( string, delimiter )
```

## 引數
<a name="split_to_array-arguments"></a>

 **string**   
要分割的輸入字串。

 **delimiter**   
將根據其分割輸入字串的選用值。預設為逗號。

## 傳回類型
<a name="split_to_array-return-type"></a>

SPLIT\$1TO\$1ARRAY 函數會傳回 SUPER 資料值。

## 範例
<a name="split_to_array-example"></a>

下列範例顯示 SPLIT\$1TO\$1ARRAY 函數。

```
SELECT SPLIT_TO_ARRAY('12|345|6789', '|');
     split_to_array
-------------------------
 ["12","345","6789"]
(1 row)
```

## 另請參閱
<a name="split_to_array-see-also"></a>
+ [ARRAY 函數](r_array.md)
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)
+ [SUBARRAY 函數](r_subarray.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)

# SUBARRAY 函數
<a name="r_subarray"></a>

從指定位置開始擷取陣列的一部分。傳回新的陣列，其中包含輸入陣列中指定數量的元素。

## 語法
<a name="r_subarray-syntax"></a>

```
SUBARRAY( super_expr, start_position, length )
```

## 引數
<a name="r_subarray-arguments"></a>

*super\$1expr*  
陣列形式的有效 SUPER 運算式。

*start\$1position*  
整數，指定要擷取的開始位置。索引以 0 為基礎，其中 0 表示第一個元素。如果 start\$1position 超過陣列長度，則會傳回空陣列。

*長度*  
選用整數，指定要擷取的元素數目。如果省略，則會傳回從開始位置到陣列結尾的所有元素。

## 傳回類型
<a name="r_subarray-return-type"></a>

SUBARRAY 函數會傳回 SUPER 資料值。

## 範例
<a name="r_subarray-examples"></a>

以下是 SUBARRAY 函數的範例。

```
 SELECT SUBARRAY(ARRAY('a', 'b', 'c', 'd', 'e', 'f'), 2, 3);
   subarray
---------------
 ["c","d","e"]
(1 row)
```

## 另請參閱
<a name="r_subarray-see-also"></a>
+ [ARRAY\$1POSITION 函數](array_position.md)
+ [ARRAY\$1POSITIONS 函數](array_positions.md)
+ [ARRAY\$1FLATTEN 函數](array_flatten.md)
+ [ARRAY\$1CONCAT 函數](r_array_concat.md)

# 位元彙整函數
<a name="c_bitwise_aggregate_functions"></a>

位元彙總函數會運算位元操作，以執行整數欄以及可轉換或四捨五入為整數值的彙總。

**Topics**
+ [在位元彙整中使用 NULL](#c_bitwise_aggregate_functions-nulls-in-bit-wise-aggregations)
+ [位元彙整的 DISTINCT 支援](#distinct-support-for-bit-wise-aggregations)
+ [位元函數的概述範例](#r_bitwise_example)
+ [BIT\$1AND 函數](r_BIT_AND.md)
+ [BIT\$1OR 函數](r_BIT_OR.md)
+ [BOOL\$1AND 函數](r_BOOL_AND.md)
+ [BOOL\$1OR 函數](r_BOOL_OR.md)

## 在位元彙整中使用 NULL
<a name="c_bitwise_aggregate_functions-nulls-in-bit-wise-aggregations"></a>

對可為 Null 的欄套用位元函數時，計算函數結果之前會消除任何 NULL 值。如果沒有任何列符合彙總的資格，位元函數會傳回 Null。同樣行為適用於一般彙總函數。以下是範例。

```
select sum(venueseats), bit_and(venueseats) from venue
where venueseats is null;

sum  | bit_and
------+---------
null |    null
(1 row)
```

## 位元彙整的 DISTINCT 支援
<a name="distinct-support-for-bit-wise-aggregations"></a>

如同其他彙總函數，位元函數也支援 DISTINCT 關鍵字。

不過，DISTINCT 與這些函數一起使用不影響結果。值的第一個實例足以滿足位元 AND 或 OR 運算。如果正在評估的運算式中存在重複值，則沒有任何區別。

因為 DISTINCT 處理很可能引起某些查詢執行負荷，因此我們建議您不要將 DISTINCT 與位元函數一起使用。

## 位元函數的概述範例
<a name="r_bitwise_example"></a>

在下文中，您可以找到一些概述範例，展示如何使用位元函數。您還可以找到具有每個函數描述的特定代碼範例。

位元函數的範例是以 TICKIT 範例資料庫為基礎。TICKIT 範例資料庫中的 USERS 資料表包含幾個布林值欄，指出是否已知每一個使用者喜歡的各種類型活動，例如運動、戲劇、歌劇等。範例如下。

```
select userid, username, lastname, city, state, 
likesports, liketheatre
from users limit 10;

userid | username | lastname  |     city     | state | likesports | liketheatre
-------+----------+-----------+--------------+-------+------------+-------------
1 | JSG99FHE | Taylor    | Kent         | WA    | t          | t
9 | MSD36KVR | Watkins   | Port Orford  | MD    | t          | f
```

假設 USERS 表格的新版本是以不同的方式建置的。在此新版本中，單一整數欄定義 (以二進位格式) 每一個使用者喜歡或不喜歡的八種活動。在這種設計中，每個位置代表一種類型的事件。喜歡所有八種類型的使用者將全部八位設定為 1 (如下表的第一列)。如果使用者不喜歡任何活動，則八個位元全部設為 0 (請看第二列)。接下來的第三列表示只喜歡運動和爵士樂的使用者。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_bitwise_aggregate_functions.html)

在資料庫資料表中，這些二進位值可以作為整數儲存在單一 LIKES 欄中，如下所示。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_bitwise_aggregate_functions.html)

# BIT\$1AND 函數
<a name="r_BIT_AND"></a>

BIT\$1AND 函數會對單一整數欄或表達式中的所有值執行位元 AND 操作。此函數會彙總每一個二進位值 (對應於表達式中的每一個整數值) 的每一個位元。

如果所有值之中沒有任何位元設為 1，BIT\$1AND 函數會傳回結果 `0`。如果所有值之中有一或多個位元設為 1，此函數會傳回整數值。此整數是對應於那些位元的二進位值的數字。

例如，資料表有一欄包含四個整數值：3、7、10 及 22。這些整數以二進位格式表示如下：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_BIT_AND.html)

此資料集的 BIT\$1AND 操作發現所有位元只在倒數第二個位置設為 `1`。結果為 `00000010` 的二進位值，代表整數值 `2`。因此，BIT\$1AND 函數會傳回 `2`。

## 語法
<a name="r_BIT_AND-synopsis"></a>

```
BIT_AND ( [DISTINCT | ALL] expression )
```

## 引數
<a name="r_BIT_AND-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。此表達式必須為 INT、INT2 或 INT8 資料類型。此函數會傳回同等的 INT、INT2 或 INT8 資料類型。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算結果之前，將消除指定之表達式的所有重複值。如果指定引數 ALL，則函數會保留所有重複值。ALL 為預設值。如需詳細資訊，請參閱[位元彙整的 DISTINCT 支援](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations)。

## 範例
<a name="r_bit_end_example"></a>

由於整數欄中儲存有意義的商業資訊，您可以使用位元函數來擷取和彙總該資訊。下列查詢將 BIT\$1AND 函數套用至名為 USERLIKES 之資料表中的 LIKES 欄，並依 CITY 欄將結果分組。

```
select city, bit_and(likes) from userlikes group by city 
order by city;
city          | bit_and
--------------+---------
Los Angeles   |       0
Sacramento    |       0
San Francisco |       0
San Jose      |      64
Santa Barbara |     192
(5 rows)
```

您可將這些結果解釋如下：
+ Santa Barbara 的整數值 `192` 轉換為二進位值 `11000000`。換言之，此城市的所有使用者都喜歡運動和戲劇，但並非所有使用者還喜歡其他任何一種活動。
+ 整數 `64` 轉換為 `01000000`。因此，對於 San Jose 中的使用者而言，他們全部都喜歡的一種活動只有戲劇。
+ 其他三個城市的值為 `0`，表示那些城市的所有使用者沒有共同的「愛好」。

# BIT\$1OR 函數
<a name="r_BIT_OR"></a>

BIT\$1OR 函數會對單一整數欄或表達式中的所有值執行位元 OR 操作。此函數會彙總每一個二進位值 (對應於表達式中的每一個整數值) 的每一個位元。

例如，假設資料表有一欄包含四個整數值：3、7、10 及 22。這些整數以二進位格式表示如下：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_BIT_OR.html)

如果您將 BIT\$1OR 函數套用至整數值集，則作業會尋找在每個位置中找到 `1` 的任何值。在此案例中，至少一個值的最後五個位置有 `1`，於是產生二進位結果 `00011111`；因此，函數傳回 `31` (亦即 `16 + 8 + 4 + 2 + 1`)。

## 語法
<a name="r_BIT_OR-synopsis"></a>

```
BIT_OR ( [DISTINCT | ALL] expression )
```

## 引數
<a name="r_BIT_OR-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。此表達式必須為 INT、INT2 或 INT8 資料類型。此函數會傳回同等的 INT、INT2 或 INT8 資料類型。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算結果之前，將消除指定之表達式的所有重複值。如果指定引數 ALL，則函數會保留所有重複值。ALL 為預設值。如需詳細資訊，請參閱[位元彙整的 DISTINCT 支援](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations)。

## 範例
<a name="r_bit_or_example"></a>

下列查詢將 BIT\$1OR 函數套用至名為 USERLIKES 之資料表中的 LIKES 欄，並依 CITY 欄將結果分組。

```
select city, bit_or(likes) from userlikes group by city
order by city;
city          | bit_or
--------------+--------
Los Angeles   |    127
Sacramento    |    255
San Francisco |    255
San Jose      |    255
Santa Barbara |    255
(5 rows)
```

對於列出的其中四個城市，至少有一個使用者喜歡所有活動類型 (`255=11111111`)。以 Los Angeles 來說，至少有一個使用者喜歡所有活動類型，但運動除外 (`127=01111111`)。

# BOOL\$1AND 函數
<a name="r_BOOL_AND"></a>

BOOL\$1AND 函數會對單一布林值或整數欄或表達式執行操作。此函數會將類似邏輯套用至 BIT\$1AND 和 BIT\$1OR 函數。此函數的傳回類型為布林值 (`true` 或 `false`)。

如果一組值全部為 true，BOOL\$1AND 函數會傳回 `true` (`t`)。如果任何值為 false，此函數會傳回 `false` (`f`)。

## 語法
<a name="r_BOOL_AND-synopsis"></a>

```
BOOL_AND ( [DISTINCT | ALL] expression )
```

## 引數
<a name="r_BOOL_AND-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。此表達式必須為 BOOLEAN 或整數資料類型。函數的傳回類型為 BOOLEAN。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算結果之前，將消除指定之表達式的所有重複值。如果指定引數 ALL，則函數會保留所有重複值。ALL 為預設值。如需詳細資訊，請參閱[位元彙整的 DISTINCT 支援](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations)。

## 範例
<a name="r_bool_and_example"></a>

您可以對布林值表達式或整數表達式使用布林值函數。例如，下列查詢從 TICKET 資料庫中的標準 USERS 資料表 (其中有幾個布林值欄) 傳回結果。

BOOL\$1AND 函數在全部五列中傳回 `false`。其中每個州並非所有使用者都喜歡運動。

```
select state, bool_and(likesports) from users 
group by state order by state limit 5;

state | bool_and
------+---------
AB    | f
AK    | f
AL    | f
AZ    | f
BC    | f
(5 rows)
```

# BOOL\$1OR 函數
<a name="r_BOOL_OR"></a>

BOOL\$1OR 函數會對單一布林值或整數欄或表達式執行操作。此函數會將類似邏輯套用至 BIT\$1AND 和 BIT\$1OR 函數。此函數的傳回類型為布林值 (`true`、`false` 或 `NULL`)。

如果一組值之中有一或多個值為 `true`，則 BOOL\$1OR 函式會傳回 `true` (`t`)。如果一組值全部為 `false`，則函式是傳回 `false` (`f`)。如果該值未知，則可以傳回 NULL。

## 語法
<a name="r_BOOL_OR-synopsis"></a>

```
BOOL_OR ( [DISTINCT | ALL] expression )
```

## 引數
<a name="r_BOOL_OR-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。此表達式必須為 BOOLEAN 或整數資料類型。函數的傳回類型為 BOOLEAN。

DISTINCT \$1 ALL  
如果指定引數 DISTINCT，則函數在計算結果之前，將消除指定之表達式的所有重複值。如果指定引數 ALL，則函數會保留所有重複值。ALL 為預設值。請參閱 [位元彙整的 DISTINCT 支援](c_bitwise_aggregate_functions.md#distinct-support-for-bit-wise-aggregations)。

## 範例
<a name="r_bool_or_example"></a>

您可以對布林值運算式或整數運算式使用布林值函數。例如，下列查詢從 TICKET 資料庫中的標準 USERS 資料表 (其中有幾個布林值欄) 傳回結果。

BOOL\$1OR 函數在全部五列中傳回 `true`。其中每個州至少有一個使用者喜歡運動。

```
select state, bool_or(likesports) from users 
group by state order by state limit 5;

state | bool_or 
------+--------
AB    | t      
AK    | t      
AL    | t       
AZ    | t       
BC    | t       
(5 rows)
```

以下範例傳回 NULL。

```
SELECT BOOL_OR(NULL = '123')
               bool_or
------                  
NULL
```

# 條件式運算式
<a name="c_conditional_expressions"></a>

**Topics**
+ [CASE 條件式運算式](r_CASE_function.md)
+ [DECODE 函數](r_DECODE_expression.md)
+ [GREATEST 和 LEAST 函數](r_GREATEST_LEAST.md)
+ [NVL 和 COALESCE 函數](r_NVL_function.md)
+ [NVL2 函數](r_NVL2.md)
+ [NULLIF 函數](r_NULLIF_function.md)

Amazon Redshift 支援從 SQL 標準延伸的一些條件式運算式。

# CASE 條件式運算式
<a name="r_CASE_function"></a>

CASE 表達式是條件式運算式，類似於其他語言中的 if/then/else 陳述式。有多個條件時會使用 CASE 來指定結果。在 SQL 運算式有效的情況下使用 CASE，例如在 SELECT 命令中。

CASE 表達式有兩種類型：簡單和搜尋。
+ 在簡單 CASE 表達式中，表達式與值相比較。發現相符時，就套用 THEN 子句中指定的動作。未發現相符時，就套用 ELSE 子句中的動作。
+ 在搜尋 CASE 表達式中，每一個 CASE 的評估根據為布林值表達式，而 CASE 陳述式會傳回第一個相符的 CASE。如果在 WHEN 子句之間找不到相符項目，就傳回 ELSE 子句中的動作。

## 語法
<a name="r_CASE_function-syntax"></a>

用來比對條件的簡單 CASE 陳述式：

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

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

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

## 引數
<a name="r_CASE_function-arguments"></a>

 *表達式*   
欄名或任何有效表達式。

 *value*   
與表達式相比較的值，例如數值常數或字元字串。

 *result*   
評估表達式或布林值條件時傳回的目標值或表達式。所有結果運算式的資料類型必須轉換為單個輸出類型。

 *condition*   
評估 true 或 false 的布林值運算式。如果 *condition* 為真，CASE 運算式的值是遵循條件的結果，而 CASE 運算式的其餘部分則不會處理。如果 *condition* 為假，則評估任何後續 WHEN 子句。如果沒有 WHEN 條件結果為真，CASE 運算式的值是 ELSE 子句的結果。如果省略 ELSE 子句且沒有條件為 true，則結果為 Null。

## 範例
<a name="r_CASE_function-examples"></a>

下列範例會使用範例 TICKIT 資料中的 VENUE 表格和 SALES 表格。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

在針對 VENUE 資料表的查詢中，使用簡單 CASE 表達式以 `New York City` 取代 `Big Apple`。以 `other` 取代其他所有城市名稱。

```
select venuecity,
  case venuecity
    when 'New York City'
    then 'Big Apple' else 'other'
  end 
from venue
order by venueid desc;

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

使用搜尋 CASE 表達式以根據個別門票銷售的 PRICEPAID 值來指派群組號碼：

```
select pricepaid,
  case when pricepaid <10000 then 'group 1'
    when pricepaid >10000 then 'group 2'
    else 'group 3'
  end 
from sales
order by 1 desc;

pricepaid |  case
----------+---------
12624     | group 2
10000     | group 3
10000     | group 3
9996      | group 1
9988      | group 1
...
```

# DECODE 函數
<a name="r_DECODE_expression"></a>

DECODE 表達式將特定值取代為另一個特定值或預設值，視等式條件的結果而定。此運算相當於簡單 CASE 表達式或 IF-THEN-ELSE 陳述式的運算。

## 語法
<a name="r_DECODE_expression-synopsis"></a>

```
DECODE ( expression, search, result [, search, result ]... [ ,default ] )
```

這種表達式有助於將儲存於資料表中的縮寫或代碼，取代為報告所需的有意義商業值。

## Parameters
<a name="r_DECODE_expression-parameters"></a>

 *表達式*   
您要比較之值的來源，例如資料表中的欄。

 *search*   
與來源表達式相比較的目標值，例如數值或字元字串。搜尋表達式必須評估為單一固定值。您不能指定會評估為一系列值的表達式，例如 `age between 20 and 29`；對於您要取代的每一個值，您需要指定個別的搜尋/結果對。  
搜尋表達式的所有實例必須是相同或相容的資料類型。*expression* 和 *search* 參數也必須相容。

 *result*   
當表達式符合搜尋值時，查詢所傳回的替換值。DECODE 表達式必須包含至少一對搜尋/結果。  
結果表達式的所有實例必須是相同或相容的資料類型。*result* 和 *default* 參數也必須相容。

 *default*   
搜尋條件失敗時用於案例的選用預設值。如果您未指定預設值，DECODE 表達式會傳回 Null。

## 使用須知
<a name="decode-expression-usage-notes"></a>

如果 *expression* 值和 *search* 值都是 Null，則 DECODE 結果是對應的 *result* 值。如需這樣使用函數的相關說明，請參閱「範例」一節。

這樣使用時，DECODE 就類似於 [NVL2 函數](r_NVL2.md)，但有些差異。如需這些差異的描述，請參閱 NVL2 使用須知。

## 範例
<a name="r_DECODE_expression-examples"></a>

當 datetable 的 caldate 欄中存在值 `2008-06-01` 時，下列範例會以 `June 1st, 2008` 取代此值。範例以 NULL 取代其他所有 caldate 值。

```
select decode(caldate, '2008-06-01', 'June 1st, 2008')
from datetable where month='JUN' order by caldate;

case
----------------
June 1st, 2008

...
(30 rows)
```

下列範例使用 DECODE 表達式，將 CATEGORY 資料表中五個縮寫的 CATNAME 欄轉換為全名，並將此欄中的其他值轉換為 `Unknown`。

```
select catid, decode(catname,
'NHL', 'National Hockey League',
'MLB', 'Major League Baseball',
'MLS', 'Major League Soccer',
'NFL', 'National Football League',
'NBA', 'National Basketball Association',
'Unknown')
from category
order by catid;

catid  |	case
-------+---------------------------------
1      | Major League Baseball
2      | National Hockey League
3      | National Football League
4      | National Basketball Association
5      | Major League Soccer
6      | Unknown
7      | Unknown
8      | Unknown
9      | Unknown
10     | Unknown
11     | Unknown
(11 rows)
```

使用 DECODE 表達式來尋找科羅拉多州和內華達州在 VENUESEATS 欄為 NULL 的會場；將 NULL 轉換為零。如果 VENUESEATS 欄不是 NULL，則傳回 1 做為結果。

```
select venuename, venuestate, decode(venueseats,null,0,1)
from venue
where venuestate in('NV','CO')
order by 2,3,1;

venuename	              | venuestate     | case
------------------------------+----------------+-----------
Coors Field                   |	CO	       |   1
Dick's Sporting Goods Park    |	CO	       |   1
Ellie Caulkins Opera House    |	CO	       |   1
INVESCO Field		      |	CO	       |   1
Pepsi Center		      |	CO	       |   1
Ballys Hotel		      |	NV	       |   0
Bellagio Hotel                |	NV	       |   0
Caesars Palace                |	NV	       |   0
Harrahs Hotel                 |	NV	       |   0
Hilton Hotel                  |	NV	       |   0
...						
(20 rows)
```

# GREATEST 和 LEAST 函數
<a name="r_GREATEST_LEAST"></a>

從含有任何數量的表達式清單中傳回最大值或最小值。

## 語法
<a name="r_GREATEST_LEAST-synopsis"></a>

```
GREATEST (value [, ...])
LEAST (value [, ...])
```

## Parameters
<a name="r_GREATEST_LEAST-arguments"></a>

*expression\$1list*  
逗號分隔的表達式清單，例如欄名。表達式必須全部可轉換為常見資料類型。忽略清單中的 NULL 值。如果所有表達式都評估為 NULL，則結果為 NULL。

## 傳回值
<a name="r_GREATEST_LEAST-returns"></a>

從提供的運算式清單中傳回最大值 (對於 GREATEST) 或最小值 (對於 LEAST)。

## 範例
<a name="r_GREATEST_LEAST-examples"></a>

下列範例按字母順序傳回 `firstname` 或 `lastname` 的最高值。

```
select firstname, lastname, greatest(firstname,lastname) from users
where userid < 10
order by 3;

 firstname | lastname  | greatest
-----------+-----------+-----------
 Lars      | Ratliff   | Ratliff
 Reagan    | Hodge     | Reagan
 Colton    | Roy       | Roy
 Barry     | Roy       | Roy
 Tamekah   | Juarez    | Tamekah
 Rafael    | Taylor    | Taylor
 Victor    | Hernandez | Victor
 Vladimir  | Humphrey  | Vladimir
 Mufutau   | Watkins   | Watkins
(9 rows)
```

# NVL 和 COALESCE 函數
<a name="r_NVL_function"></a>

傳回一系列運算式中不為 null 的第一個運算式的值。找到非 Null 值時，就不會評估清單中剩餘的運算式。

NVL 與 COALESCE 相同。它們是同義詞。本主題說明語法，並包含兩者的範例。

## 語法
<a name="r_NVL_function-synopsis"></a>

```
NVL( expression, expression, ... )
```

COALESCE 的語法是相同的：

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

如果所有表達式都是 Null，則結果為 Null。

當您想要在主要值遺失或為​​ null 時傳回次要值，這些函數非常有用。例如，查詢可能會傳回三個可用電話號碼中的第一個：行動電話號碼、住家或公司。函數中運算式的順序決定評估的順序。

## 引數
<a name="r_NVL_function-arguments"></a>

 *表達式*   
要評估 Null 狀態的表達式，例如欄名。

## 傳回類型
<a name="r_NVL_function-returntype"></a>

Amazon Redshift 會根據輸入運算式判斷傳回值的資料類型。如果輸入運算式的資料類型沒有一般類型，則會傳回錯誤。

## 範例
<a name="r_NVL_function-examples"></a>

如果清單包含整數運算式，該函數傳回一個整數。

```
SELECT COALESCE(NULL, 12, NULL);

coalesce
--------------
12
```

這個範例與前面的範例相同，不同之處在於它使用 NVL，會傳回相同的結果。

```
SELECT NVL(NULL, 12, NULL);

coalesce
--------------
12
```

下列範例會傳回字串類型。

```
SELECT COALESCE(NULL, 'Amazon Redshift', NULL);

coalesce
--------------
Amazon Redshift
```

下列範例會導致錯誤，因為運算式清單中的資料類型不同。在這種情況下，清單中同時存在字串類型和數字類型。

```
SELECT COALESCE(NULL, 'Amazon Redshift', 12);
ERROR: invalid input syntax for integer: "Amazon Redshift"
```

在此範例中，您建立具有 START\$1DATE 和 END\$1DATE 欄的資料表、插入包含 Null 值的列，然後將 NVL 運算式套用至這兩欄。

```
create table datetable (start_date date, end_date date);           
insert into datetable values ('2008-06-01','2008-12-31');
insert into datetable values (null,'2008-12-31');
insert into datetable values ('2008-12-31',null);
```

```
select nvl(start_date, end_date)
from datetable
order by 1;
               
coalesce
------------
2008-06-01
2008-12-31
2008-12-31
```

NVL 表達式的預設欄名為 COALESCE。下列查詢會傳回相同的結果：

```
select coalesce(start_date, end_date)
from datetable
order by 1;
```

對於下列範例查詢，您可以建立包含飯店預訂範例資訊的表格，並插入數列。有些記錄包含 null 值。

```
create table booking_info (booking_id int, booking_code character(8), check_in date, check_out date, funds_collected numeric(12,2));
```

插入下列範例資料。有些記錄沒有 `check_out` 日期或 `funds_collected` 金額。

```
insert into booking_info values (1, 'OCEAN_WV', '2023-02-01','2023-02-03',100.00);
insert into booking_info values (2, 'OCEAN_WV', '2023-04-22','2023-04-26',120.00);
insert into booking_info values (3, 'DSRT_SUN', '2023-03-13','2023-03-16',125.00);
insert into booking_info values (4, 'DSRT_SUN', '2023-06-01','2023-06-03',140.00);
insert into booking_info values (5, 'DSRT_SUN', '2023-07-10',null,null);
insert into booking_info values (6, 'OCEAN_WV', '2023-08-15',null,null);
```

下列查詢會傳回日期清單。如果 `check_out` 日期不可用，它會列出 `check_in` 日期。

```
select coalesce(check_out, check_in)
from booking_info
order by booking_id;
```

結果如下。請注意，最後兩則記錄顯示 `check_in` 日期。

```
coalesce
------------
2023-02-03
2023-04-26	
2023-03-16	
2023-06-03	
2023-07-10	
2023-08-15
```

如果您預期查詢的某些函數或欄會傳回 Null 值，您可以使用 NVL 表達式以其他值取代 Null。例如，彙總函數 (例如 SUM) 在沒有可評估的列時會傳回 Null 值，而不是零。您可以使用 NVL 運算式，以 `700.0` 取代這些 Null 值：加總 `funds_collected` 的結果不是 `485` 而是 `1885`，因為兩個有 null 的列被替換為 `700`。

```
select sum(nvl(funds_collected, 700.0)) as sumresult from booking_info;
               
sumresult
------
 1885
```

# NVL2 函數
<a name="r_NVL2"></a>

根據指定的表達式評估為 NULL 還是 NOT NULL，傳回兩個值中的一個。

## 語法
<a name="r_NVL2-synopsis"></a>

```
NVL2 ( expression, not_null_return_value, null_return_value )
```

## 引數
<a name="r_NVL2-arguments"></a>

 *表達式*   
要評估 Null 狀態的表達式，例如欄名。

 *not\$1null\$1return\$1value*   
*expression* 評估為 NOT NULL 時所傳回的值。*not\$1null\$1return\$1value* 值的資料類型必須與 *expression* 相同，或可隱含地轉換為該資料類型。

 *null\$1return\$1value*   
*expression* 評估為 NULL 時所傳回的值。*null\$1return\$1value* 值的資料類型必須與 *expression* 相同，或可隱含地轉換為該資料類型。

## 傳回類型
<a name="r_NVL2-return-type"></a>

NVL2 傳回類型的決定方式如下：
+ 如果 *not\$1null\$1return\$1value* 或 *null\$1return\$1value* 為 Null，則傳回 not-null 表達式的資料類型。

如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 都不是 Null：
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有相同的資料類型，則傳回該資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的數值資料類型，則傳回最小可相容的數值資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的日期時間資料類型，則傳回時間戳記資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有不同的字元資料類型，則傳回 *not\$1null\$1return\$1value* 的資料類型。
+ 如果 *not\$1null\$1return\$1value* 和 *null\$1return\$1value* 有混合的數值和非數值資料類型，則傳回 *not\$1null\$1return\$1value* 的資料類型。

**重要**  
前兩個案例中傳回 *not\$1null\$1return\$1value* 的資料類型，而 *null\$1return\$1value* 會隱含地轉換為該資料類型。如果資料類型不相容，函數會失敗。

## 使用須知
<a name="nvl2-usage-notes"></a>

當 *expression* 和 *search* 參數都為 null 時，可以用類似於 NVL2 的方式來使用 [DECODE 函數](r_DECODE_expression.md)。差別在於 DECODE 會同時傳回 *result* 參數的值和資料類型。反之，NVL2 會傳回 *not\$1null\$1return\$1value* 或 *null\$1return\$1value* 參數的值 (視函數選取何者而定)，但傳回值會有 *not\$1null\$1return\$1value* 的資料類型。

例如，假設 column1 是 NULL，下列查詢會傳回相同的值。不過，DECODE 傳回值的資料類型為 INTEGER，而 NVL2 傳回值的資料類型為 VARCHAR。

```
select decode(column1, null, 1234, '2345');
select nvl2(column1, '2345', 1234);
```

## 範例
<a name="r_NVL2-examples"></a>

下列範例修改一些範例資料，然後評估兩個欄位來提供使用者的適當聯絡資訊：

```
update users set email = null where firstname = 'Aphrodite' and lastname = 'Acevedo';

select (firstname + ' ' + lastname) as name, 
nvl2(email, email, phone) AS contact_info
from users 
where state = 'WA'
and lastname  like 'A%'
order by lastname, firstname;

name			     contact_info	
--------------------+-------------------------------------------
Aphrodite Acevedo	(906) 632-4407
Caldwell Acevedo 	Nunc.sollicitudin@Duisac.ca
Quinn Adams		  vel@adipiscingligulaAenean.com
Kamal Aguilar		quis@vulputaterisusa.com
Samson Alexander	 hendrerit.neque@indolorFusce.ca
Hall Alford		  ac.mattis@vitaediamProin.edu
Lane Allen		   et.netus@risusDonec.org
Xander Allison	   ac.facilisis.facilisis@Infaucibus.com
Amaya Alvarado	   dui.nec.tempus@eudui.edu
Vera Alvarez		 at.arcu.Vestibulum@pellentesque.edu
Yetta Anthony		enim.sit@risus.org
Violet Arnold		ad.litora@at.com
August Ashley		consectetuer.euismod@Phasellus.com
Karyn Austin		 ipsum.primis.in@Maurisblanditenim.org
Lucas Ayers		  at@elitpretiumet.com
```

# NULLIF 函數
<a name="r_NULLIF_function"></a>

## 語法
<a name="r_NULLIF_function-synopsis"></a>

NULLIF 表達式比較兩個引數，如果引數相等，則傳回 Null。如果不相等，則傳回第一個引數。此表達式與 NVL 或 COALESCE 表達式相反。

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

## 引數
<a name="r_NULLIF_function-arguments"></a>

 *expression1、expression2*   
比較的目標欄或表達式。傳回類型與第一個表達式的類型相同。NULLIF 結果的預設欄名為第一個表達式的欄名。

## 範例
<a name="r_NULLIF_function-examples"></a>

在下列範例中，查詢會傳回字串 `first`，因為引數不相等。

```
SELECT NULLIF('first', 'second');

case
-------
first
```

在下列範例中，查詢會傳回 `NULL`，因為字串常值引數相等。

```
SELECT NULLIF('first', 'first');

case
-------
NULL
```

在下列範例中，查詢會傳回 `1`，因為整數引數不相等。

```
SELECT NULLIF(1, 2);

case
-------
1
```

在下列範例中，查詢會傳回 `NULL`，因為整數引數相等。

```
SELECT NULLIF(1, 1);

case
-------
NULL
```

在下列範例中，當 LISTID 和 SALESID 值相符時，查詢會傳回 Null：

```
select nullif(listid,salesid), salesid
from sales where salesid<10 order by 1, 2 desc;

listid  | salesid
--------+---------
     4  |       2
     5  |       4
     5  |       3
     6  |       5
     10 |       9
     10 |       8
     10 |       7
     10 |       6
        |       1
(9 rows)
```

您可以使用 NULLIF 來確保空字串一律以 Null 傳回。在下列範例中，NULLIF 表達式傳回 Null 值或至少包含一個字元的字串。

```
insert into category
values(0,'','Special','Special');

select nullif(catgroup,'') from category
where catdesc='Special';

catgroup
----------
null
(1 row)
```

NULLIF 會忽略結尾空格。如果字串不是空的但包含空格，NULLIF 仍會傳回 Null：

```
create table nulliftest(c1 char(2), c2 char(2));

insert into nulliftest values ('a','a ');

insert into nulliftest values ('b','b');


select nullif(c1,c2) from nulliftest;
c1
------
null
null
(2 rows)
```

# 資料類型格式化函數
<a name="r_Data_type_formatting"></a>

**Topics**
+ [CAST 函數](r_CAST_function.md)
+ [CONVERT 函數](r_CONVERT_function.md)
+ [TEXT\$1TO\$1INT\$1ALT](r_TEXT_TO_INT_ALT.md)
+ [TEXT\$1TO\$1NUMERIC\$1ALT](r_TEXT_TO_NUMERIC_ALT.md)
+ [TO\$1CHAR](r_TO_CHAR.md)
+ [TO\$1DATE 陣列](r_TO_DATE_function.md)
+ [TO\$1NUMBER](r_TO_NUMBER.md)
+ [TRY\$1CAST 函式](r_TRY_CAST.md)
+ [日期時間格式字串](r_FORMAT_strings.md)
+ [數值格式字串](r_Numeric_formating.md)
+ [數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)

資料類型格式化函數可讓您輕鬆轉換值的資料類型。範本對於其中每一個函數，第一個引數一律為要格式化的值，第二個引數包含新格式的範本。Amazon Redshift 支援多種資料類型格式化函數。

# CAST 函數
<a name="r_CAST_function"></a>

CAST 函數會將一種資料類型轉換為另一個相容的資料類型。例如，您可以將字串轉換為日期，或將數值類型轉換為字串。CAST 會執行執行期轉換，這表示轉換不會變更來源資料表中值的資料類型。它僅在查詢的上下文中進行更改。

CAST 函數非常類似 [CONVERT 函數](r_CONVERT_function.md)，因為它們都將一種資料類型轉換為另一種資料類型，但它們的呼叫方式不同。

某些資料類型需要使用 CAST 或 CONVERT 函數來明確轉換為其他資料類型。其他資料類型可在另一個命令中隱含地轉換，而不需要使用 CAST 或 CONVERT。請參閱 [類型相容性與轉換](c_Supported_data_types.md#r_Type_conversion)。

## 語法
<a name="r_CAST_function-syntax"></a>

使用兩種同等的語法格式中的任何一種，將運算式從一種資料類型轉換為另一種資料類型。

```
CAST ( expression AS type )
expression :: type
```

## 引數
<a name="r_CAST_function-arguments"></a>

 *表達式*   
任何評估為一或多個值的表達式，例如欄名或常值。轉換 Null 值會傳回 Null。表達式不能包含空格或空字串。

 *type*   
其中一個支援的[資料類型](c_Supported_data_types.md)。

## 傳回類型
<a name="r_CAST_function-return-type"></a>

CAST 傳回 *type* 引數指定的資料類型。

**注意**  
如果您嘗試執行有問題的轉換，例如 DECIMAL 轉換導致精確度降低，Amazon Redshift 會傳回錯誤：  

```
select 123.456::decimal(2,1);
```
或造成溢位的 INTEGER 轉換：  

```
select 12345678::smallint;
```

## 範例
<a name="r_CAST_function-examples"></a>

一些範例使用範例 [TICKIT 資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。如需設定範例資料的詳細資訊，請參閱[載入資料](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html)。

下列兩個查詢相同。都是將小數值轉換為整數：

```
select cast(pricepaid as integer)
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

```
select pricepaid::integer
from sales where salesid=100;

pricepaid
-----------
162
(1 row)
```

以下產生類似的結果。它不需要執行範例資料：

```
select cast(162.00 as integer) as pricepaid;

pricepaid
-----------
162
(1 row)
```

在此範例中，時間戳記資料欄中的值會轉換為日期，因此會從每個結果中移除時間：

```
select cast(saletime as date), salesid
from sales order by salesid limit 10;

 saletime  | salesid
-----------+---------
2008-02-18 |       1
2008-06-06 |       2
2008-06-06 |       3
2008-06-09 |       4
2008-08-31 |       5
2008-07-16 |       6
2008-06-26 |       7
2008-07-10 |       8
2008-07-22 |       9
2008-08-06 |      10
(10 rows)
```

如果您沒有按照上一個範例中所示使用 CAST，則結果將包括時間：*2008-02-18 02:36:48*。

下列查詢會將可變字元資料轉換為日期。它不需要執行範例資料。

```
select cast('2008-02-18 02:36:48' as date) as mysaletime;

mysaletime    
--------------------
2008-02-18  
(1 row)
```

在此範例中，日期欄中的值轉換為時間戳記：

```
select cast(caldate as timestamp), dateid
from date order by dateid limit 10;

      caldate       | dateid
--------------------+--------
2008-01-01 00:00:00 |   1827
2008-01-02 00:00:00 |   1828
2008-01-03 00:00:00 |   1829
2008-01-04 00:00:00 |   1830
2008-01-05 00:00:00 |   1831
2008-01-06 00:00:00 |   1832
2008-01-07 00:00:00 |   1833
2008-01-08 00:00:00 |   1834
2008-01-09 00:00:00 |   1835
2008-01-10 00:00:00 |   1836
(10 rows)
```

在類似前面範例的情況下，您可以使用 [TO\$1CHAR](https://docs.aws.amazon.com/redshift/latest/dg/r_TO_CHAR.html) 來獲得輸出格式的額外控制。

在此範例中，整數轉換為字元字串：

```
select cast(2008 as char(4));

bpchar
--------
2008
```

在此範例中，DECIMAL(6,3) 值轉換為 DECIMAL(4,1) 值：

```
select cast(109.652 as decimal(4,1));

numeric
---------
109.7
```

此範例顯示更複雜的運算式。SALES 資料表中的 PRICEPAID 欄 (DECIMAL(8,2) 欄) 轉換為 DECIMAL(38,2) 欄，並將值乘以 100000000000000000000：

```
select salesid, pricepaid::decimal(38,2)*100000000000000000000
as value from sales where salesid<10 order by salesid;


 salesid |           value
---------+----------------------------
       1 | 72800000000000000000000.00
       2 |  7600000000000000000000.00
       3 | 35000000000000000000000.00
       4 | 17500000000000000000000.00
       5 | 15400000000000000000000.00
       6 | 39400000000000000000000.00
       7 | 78800000000000000000000.00
       8 | 19700000000000000000000.00
       9 | 59100000000000000000000.00
(9 rows)
```

**注意**  
您無法在 `GEOMETRY` 資料類型上執行 CAST 或 CONVERT 操作，將其變更為其他資料類型。但是，您可以為接受 `GEOMETRY` 引數的函數提供擴充已知二進位 (EWKB) 格式的字串常值十六進位表示法做為輸入。例如，以下 `ST_AsText` 函數預期 `GEOMETRY` 資料類型。  

```
SELECT ST_AsText('01010000000000000000001C400000000000002040');
```

```
st_astext  
------------
 POINT(7 8)
```
您也可以明確指定 `GEOMETRY` 資料類型。  

```
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
```

```
st_astext  
------------
 POINT(5 6)
```

# CONVERT 函數
<a name="r_CONVERT_function"></a>

與 [CAST 函數](https://docs.aws.amazon.com/redshift/latest/dg/r_CAST_function.html)一樣，CONVERT 函數可將一種資料類型轉換為另一個相容的資料類型。例如，您可以將字串轉換為日期，或將數字類型轉換為字串。CONVERT 會執行執行期轉換，這表示轉換不會變更來源資料表中值的資料類型。它僅在查詢的上下文中進行更改。

某些資料類型需要使用 CONVERT 函數來明確轉換為其他資料類型。其他資料類型可在另一個命令中隱含地轉換，而不需要使用 CAST 或 CONVERT。請參閱 [類型相容性與轉換](c_Supported_data_types.md#r_Type_conversion)。

## 語法
<a name="r_CONVERT-syntax"></a>

```
CONVERT ( type, expression )
```

## 引數
<a name="r_CONVERT-arguments"></a>

 *type*   
其中一個支援的[資料類型](c_Supported_data_types.md)。

 *表達式*   
任何評估為一或多個值的表達式，例如欄名或常值。轉換 Null 值會傳回 Null。表達式不能包含空格或空字串。

## 傳回類型
<a name="r_CONVERT-return-type"></a>

CONVERT 傳回 *type* 引數指定的資料類型。

**注意**  
如果您嘗試執行有問題的轉換，例如 DECIMAL 轉換導致精確度降低，Amazon Redshift 會傳回錯誤：  

```
SELECT CONVERT(decimal(2,1), 123.456);
```
或造成溢位的 INTEGER 轉換：  

```
SELECT CONVERT(smallint, 12345678);
```

## 範例
<a name="r_CONVERT-examples"></a>

一些範例使用範例 [TICKIT 資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。如需設定範例資料的詳細資訊，請參閱[載入資料](https://docs.aws.amazon.com/redshift/latest/gsg/cm-dev-t-load-sample-data.html)。

下列查詢使用 CONVERT 函數將一欄小數轉換為整數

```
SELECT CONVERT(integer, pricepaid)
FROM sales WHERE salesid=100;
```

這個範例會將整數轉換為字元字串。

```
SELECT CONVERT(char(4), 2008);
```

此範例會將目前日期和時間轉換為可變字元資料類型：

```
SELECT CONVERT(VARCHAR(30), GETDATE());

getdate
---------
2023-02-02 04:31:16
```

這個範例會將 saletime 欄轉換成僅限時間，並從每一列移除日期。

```
SELECT CONVERT(time, saletime), salesid
FROM sales order by salesid limit 10;
```

如需將時間戳記從某個時區轉換為另一個時區的詳細資訊，請參閱[CONVERT\$1TIMEZONE 函數](CONVERT_TIMEZONE.md)。如需其他日期和時間函數，請參閱[日期和時間函數](Date_functions_header.md)。

下列範例會將可變字元資料轉換成日期時間物件。

```
SELECT CONVERT(datetime, '2008-02-18 02:36:48') as mysaletime;
```

**注意**  
您無法在 `GEOMETRY` 資料類型上執行 CAST 或 CONVERT 操作，將其變更為其他資料類型。但是，您可以為接受 `GEOMETRY` 引數的函數提供擴充已知二進位 (EWKB) 格式的字串常值十六進位表示法做為輸入。例如，以下 `ST_AsText` 函數預期 `GEOMETRY` 資料類型。  

```
SELECT ST_AsText('01010000000000000000001C400000000000002040');
```

```
st_astext  
------------
 POINT(7 8)
```
您也可以明確指定 `GEOMETRY` 資料類型。  

```
SELECT ST_AsText('010100000000000000000014400000000000001840'::geometry);
```

```
st_astext  
------------
 POINT(5 6)
```

# TEXT\$1TO\$1INT\$1ALT
<a name="r_TEXT_TO_INT_ALT"></a>

TEXT\$1TO\$1INT\$1ALT 會將字元字串轉換為使用 Teradata 樣式格式的整數。結果中的分數數字會被截斷。

## 語法
<a name="r_TEXT_TO_INT_ALT-synopsis"></a>

```
TEXT_TO_INT_ALT (expression [ , 'format'])
```

## 引數
<a name="r_TEXT_TO_INT_ALT-arguments"></a>

 *表達式*   
產生一個或多個 CHAR 或 VARCHAR 值的運算式，例如欄名稱或常值字串。轉換 Null 值會傳回 Null。該函數將空白或空字串轉換為 0。

 *format*   
字串常值，定義輸入運算式的格式。如需您可以指定之格式化字元的相關資訊，請參閱[數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

## 傳回類型
<a name="r_TEXT_TO_INT_ALT-return-type"></a>

TEXT\$1TO\$1INT\$1ALT 會傳回 INTEGER 值。

轉換結果的小數部分被截斷。

如果轉換成您指定的 *format* 詞語不成功，Amazon Redshift 就會傳回錯誤訊息。

## 範例
<a name="r_TEXT_TO_INT_ALT-examples"></a>

下列範例會將輸入 *expression* 字串 '123-' 轉換為整數 -123。

```
select text_to_int_alt('123-');
```

```
text_to_int_alt
----------
      -123
```

下列範例會將輸入 *expression* 字串 '2147483647\$1' 轉換成整數 2147483647。

```
select text_to_int_alt('2147483647+');
```

```
text_to_int_alt
----------
2147483647
```

下列範例會將指數輸入 *expression* 字串 '-123E-2' 轉換為整數 -1。

```
select text_to_int_alt('-123E-2');
```

```
text_to_int_alt
----------
        -1
```

下列範例會將輸入 *expression* 字串 '2147483647\$1' 轉換成整數 2147483647。

```
select text_to_int_alt('2147483647+');
```

```
text_to_int_alt
----------
2147483647
```

以下範例會將 *format* 詞語 '999S' 的輸入 *expression* 字串 '123\$1' 轉換為整數 1230。S 字元表示帶符號的分區十進位值。如需詳細資訊，請參閱[數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

```
select text_to_int_alt('123{', '999S');
```

```
text_to_int_alt
----------
      1230
```

以下範例會將 *format* 詞語 'C9(I)' 的輸入 *expression* 字串 'USD123' 轉換為整數 123。請參閱 [數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

```
select text_to_int_alt('USD123', 'C9(I)');
```

```
text_to_int_alt
----------
       123
```

下列範例會指定資料表欄做為輸入 *expression*。

```
select text_to_int_alt(a), text_to_int_alt(b) from t_text2int order by 1;
```

```
 text_to_int_alt | text_to_int_alt
-----------------+-----------------
            -123 |            -123
            -123 |            -123
             123 |             123
             123 |             123
```

以下是此範例的表格定義和插入陳述式。

```
create table t_text2int (a varchar(200), b char(200));
```

```
insert into t_text2int VALUES('123', '123'),('123.123', '123.123'), ('-123', '-123'), ('123-', '123-');
```

# TEXT\$1TO\$1NUMERIC\$1ALT
<a name="r_TEXT_TO_NUMERIC_ALT"></a>

TEXT\$1TO\$1NUMERIC\$1ALT 會執行 Teradata 樣式的轉換操作，將字元字串轉換為數字資料格式。

## 語法
<a name="r_TEXT_TO_NUMERIC_ALT-synopsis"></a>

```
TEXT_TO_NUMERIC_ALT (expression [, 'format'] [, precision, scale])
```

## 引數
<a name="r_TEXT_TO_NUMERIC_ALT-arguments"></a>

 *表達式*   
任何評估為一或多個 CHAR 或 VARCHAR 值的運算式，例如欄名稱或常值。轉換 Null 值會傳回 Null。空白或空字串會轉換為 0。

 *format*   
字串常值，定義輸入運算式的格式。如需詳細資訊，請參閱[數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

 *precision*   
數字結果中的位數。預設值為 38。

 *scale*   
數值結果中小數點右邊的位數。預設值為 0。

## 傳回類型
<a name="r_TEXT_TO_NUMERIC_ALT-return-type"></a>

TEXT\$1TO\$1NUMERIC\$1ALT 會傳回 DECIMAL 數字。

如果轉換成您指定的 *format* 詞語不成功，Amazon Redshift 就會傳回錯誤訊息。

Amazon Redshift 會將輸入 *expression* 字串轉換為數值類型，並以您在精確度選項中為該類型指定的最高 *precision*。如果數值的長度超過您為 *precision* 指定的值，Amazon Redshift 會根據下列規則四捨五入數值：
+ 如果轉換結果的長度超過您在 *format* 詞語中指定的長度，Amazon Redshift 會傳回錯誤訊息。
+ 如果將結果轉換為數值，則結果會四捨五入為最接近的值。如果小數部分剛好位於上部和下部轉換結果的中間，則結果將四捨五入到最接近的偶數。

## 範例
<a name="r_TEXT_TO_NUMERIC_ALT-examples"></a>

下列範例會將輸入 *expression* 字串 '1.5' 轉換為數值 '2'。因為陳述式未指定 *scale*，所以 *scale* 預設為 0，而轉換結果不包含分數結果。由於 0.5 位於 1 和 2 之間，因此轉換結果將四捨五入為偶數值 2。

```
select text_to_numeric_alt('1.5');
```

```
 text_to_numeric_alt
---------------------
                   2
```

下列範例會將輸入 *expression* 字串 '2.51' 轉換為數值 3。因為陳述式未指定 *scale* 值，所以 *scale* 預設為 0，而轉換結果不包含分數結果。由於 0.51 比 2 更接近 3，因此轉換結果將四捨五入為值 3。

```
select text_to_numeric_alt('2.51');
```

```
 text_to_numeric_alt
---------------------
                   3
```

下列範例會將 *precision* 為 10 且 *scale* 為 2 的輸入 *expression* 字串 123.52501 轉換為數值 123.53。

```
select text_to_numeric_alt('123.52501', 10, 2);
```

```
 text_to_numeric_alt
---------------------
               123.53
```

以下範例會將 *format* 詞語 '999S' 的輸入 *expression* 字串 '123\$1' 轉換為數值 1230。S 字元表示帶符號的分區十進位值。如需詳細資訊，請參閱[數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

```
select text_to_numeric_alt('123{', '999S');
```

```
text_to_int_alt
----------
      1230
```

以下範例會將 *format* 詞語 'C9(I)' 的輸入 *expression* 字串 'USD123' 轉換為數值 124。請參閱 [數值資料的 Teradata 樣式格式化字元](r_Numeric-format-teradata.md)。

```
select text_to_numeric_alt('USD123.9', 'C9(I)');
```

```
text_to_numeric_alt
----------
       124
```

下列範例會指定資料表欄做為輸入 *expression*。

```
select text_to_numeric_alt(a), text_to_numeric_alt(b) from t_text2numeric order by 1;
```

```
           text_to_numeric_alt           |           text_to_numeric_alt
-----------------------------------------+-----------------------------------------
 -99999999999999999999999999999999999999 | -99999999999999999999999999999999999999
                                  -12300 |                                  -12300
                                     123 |                                     123
                                     123 |                                     123
  99999999999999999999999999999999999999 |  99999999999999999999999999999999999999
```

以下是此範例的表格定義和插入陳述式。

```
create table  t_text2numeric (a varchar(200), b char(200));
```

```
insert into  t_text2numeric values
('123', '123'),
('+123.456', '+123.456'),
('-' || repeat('9', 38), '-' || repeat('9', 38)),
(repeat('9', 38) || '+', repeat('9', 38) || '+'),
('-123E2', '-123E2');
```

# TO\$1CHAR
<a name="r_TO_CHAR"></a>

TO\$1CHAR 將時間戳記或數值運算式轉換為字元字串資料格式。

## 語法
<a name="r_TO_CHAR-synopsis"></a>

```
TO_CHAR (timestamp_expression | numeric_expression , 'format')
```

## 引數
<a name="r_TO_CHAR-arguments"></a>

 *timestamp\$1expression*   
此運算式產生 TIMESTAMP 或 TIMESTAMPTZ 類型值，或可隱含地強制轉換為時間戳記的值。

 *numeric\$1expression*   
此表達式產生數值資料類型的值，或可隱含地強制轉換為數值類型的值。如需詳細資訊，請參閱[數值類型](r_Numeric_types201.md)。TO\$1CHAR 在數值字串左側插入空格。  
TO\$1CHAR 不支援 128 位元 DECIMAL 值。

 *format*   
新值的格式。關於有效的格式，請參閱[日期時間格式字串](r_FORMAT_strings.md)和[數值格式字串](r_Numeric_formating.md)。

## 傳回類型
<a name="r_TO_CHAR-return-type"></a>

VARCHAR

## 範例
<a name="r_TO_CHAR-examples"></a>

下列範例會將時間戳記轉換為日期和時間的值，其格式為月份名稱填滿九個字元、星期名稱以及月份的日期編號。

```
select to_char(timestamp '2009-12-31 23:15:59', 'MONTH-DY-DD-YYYY HH12:MIPM');

to_char
-------------------------
DECEMBER -THU-31-2009 11:15PM
```

下列範例會將時間戳記轉換為具有年份天數的值。

```
select to_char(timestamp '2009-12-31 23:15:59', 'DDD');

to_char
-------------------------
365
```

下列範例會將時間戳記轉換為一週的 ISO 天數。

```
select to_char(timestamp '2022-05-16 23:15:59', 'ID');

to_char
-------------------------
1
```

以下範例會從日期擷取月份名稱。

```
select to_char(date '2009-12-31', 'MONTH');

to_char
-------------------------
DECEMBER
```

下列範例將 EVENT 資料表中的每一個 STARTTIME 值，轉換為由時、分、秒組成的字串。

```
select to_char(starttime, 'HH12:MI:SS')
from event where eventid between 1 and 5
order by eventid;

to_char
----------
02:30:00
08:00:00
02:30:00
02:30:00
07:00:00
```

下列範例將整個時間戳記值轉換成另一種格式。

```
select starttime, to_char(starttime, 'MON-DD-YYYY HH12:MIPM')
from event where eventid=1;

      starttime      |       to_char
---------------------+---------------------
 2008-01-25 14:30:00 | JAN-25-2008 02:30PM
```

下列範例將時間戳記常值轉換為字元字串。

```
select to_char(timestamp '2009-12-31 23:15:59','HH24:MI:SS');

to_char
----------
23:15:59
```

下列範例會將十進位數字轉換為字元字串。

```
select to_char(125.8, '999.99');

to_char
---------
125.80
```

下列範例會將十進位數字轉換為字元字串。

```
select to_char(125.8, '999D99');

to_char
---------
125.80
```

下列範例會將數字轉換為開頭為零的字元字串。

```
select to_char(125.8, '0999D99');

to_char
---------
0125.80
```

下列範例將數字轉換為結尾帶負號的字元字串。

```
select to_char(-125.8, '999D99S');

to_char
---------
125.80-
```

下列範例會將數字轉換為指定位置帶負號的字元字串。

```
select to_char(125.8, '999D99SG');

to_char
---------
125.80+
```

下列範例會將數字轉換為指定位置帶正號的字元字串。

```
select to_char(125.8, 'PL999D99');

to_char
---------
+ 125.80
```

下列範例將數字轉換為帶有貨幣符號的字元字串。

```
select to_char(-125.88, '$S999D99');

to_char
---------
$-125.88
```

下列範例會將數字轉換為指定位置帶有貨幣符號的字元字串。

```
select to_char(-125.88, 'S999D99L');

to_char
---------
-125.88$
```

下列範例會將數字轉換為使用千分位分隔符號 (逗號) 的字元字串。

```
select to_char(1125.8, '9,999.99');

to_char
---------
1,125.80
```

下列範例將數字轉換為字元字串，並使用角括號代表負數。

```
select to_char(-125.88, '$999D99PR');

to_char
---------
$<125.88>
```

下列範例將數字轉換為 Roman 數值字串。

```
select to_char(125, 'RN');

to_char
---------
   CXXV
```

下列範例會將日期轉換為世紀代碼。

```
select to_char(date '2020-12-31', 'CC');

to_char
---------
21
```

下列範例會顯示星期幾。

```
SELECT to_char(current_timestamp, 'FMDay, FMDD HH12:MI:SS');

to_char
-----------------------
Wednesday, 31 09:34:26
```

下列範例顯示數字的序號字尾。

```
SELECT to_char(482, '999th');

to_char
-----------------------
 482nd
```

下列範例將 sales 資料表中的支付價格減去佣金。然後，將差額捨進並轉換為羅馬數字，並顯示於 to\$1char 欄：

```
select salesid, pricepaid, commission, (pricepaid - commission)
as difference, to_char(pricepaid - commission, 'rn') from sales
group by sales.pricepaid, sales.commission, salesid
order by salesid limit 10;

 salesid | pricepaid | commission | difference |     to_char
---------+-----------+------------+------------+-----------------
       1 |    728.00 |     109.20 |     618.80 |           dcxix
       2 |     76.00 |      11.40 |      64.60 |             lxv
       3 |    350.00 |      52.50 |     297.50 |        ccxcviii
       4 |    175.00 |      26.25 |     148.75 |           cxlix
       5 |    154.00 |      23.10 |     130.90 |           cxxxi
       6 |    394.00 |      59.10 |     334.90 |         cccxxxv
       7 |    788.00 |     118.20 |     669.80 |           dclxx
       8 |    197.00 |      29.55 |     167.45 |          clxvii
       9 |    591.00 |      88.65 |     502.35 |             dii
      10 |     65.00 |       9.75 |      55.25 |              lv
```

下列範例將 to\$1char 欄所顯示的差額值加上貨幣符號：

```
select salesid, pricepaid, commission, (pricepaid - commission)
as difference, to_char(pricepaid - commission, 'l99999D99') from sales
group by sales.pricepaid, sales.commission, salesid
order by salesid limit 10;

salesid | pricepaid | commission | difference |  to_char
--------+-----------+------------+------------+------------
      1 |    728.00 |     109.20 |     618.80 | $   618.80
      2 |     76.00 |      11.40 |      64.60 | $    64.60
      3 |    350.00 |      52.50 |     297.50 | $   297.50
      4 |    175.00 |      26.25 |     148.75 | $   148.75
      5 |    154.00 |      23.10 |     130.90 | $   130.90
      6 |    394.00 |      59.10 |     334.90 | $   334.90
      7 |    788.00 |     118.20 |     669.80 | $   669.80
      8 |    197.00 |      29.55 |     167.45 | $   167.45
      9 |    591.00 |      88.65 |     502.35 | $   502.35
     10 |     65.00 |       9.75 |      55.25 | $    55.25
```

下列範例列出每一筆銷售完成的世紀。

```
select salesid, saletime, to_char(saletime, 'cc') from sales
order by salesid limit 10;

 salesid |      saletime       | to_char
---------+---------------------+---------
       1 | 2008-02-18 02:36:48 | 21
       2 | 2008-06-06 05:00:16 | 21
       3 | 2008-06-06 08:26:17 | 21
       4 | 2008-06-09 08:38:52 | 21
       5 | 2008-08-31 09:17:02 | 21
       6 | 2008-07-16 11:59:24 | 21
       7 | 2008-06-26 12:56:06 | 21
       8 | 2008-07-10 02:12:36 | 21
       9 | 2008-07-22 02:23:17 | 21
      10 | 2008-08-06 02:51:55 | 21
```

下列範例將 EVENT 資料表中的每一個 STARTTIME 值，轉換為由時、分、秒及時區組成的字串。

```
select to_char(starttime, 'HH12:MI:SS TZ')
from event where eventid between 1 and 5
order by eventid;

to_char
----------
02:30:00 UTC
08:00:00 UTC
02:30:00 UTC
02:30:00 UTC
07:00:00 UTC
```

下列範例顯示秒、毫秒和微秒的格式。

```
select sysdate,
to_char(sysdate, 'HH24:MI:SS') as seconds,
to_char(sysdate, 'HH24:MI:SS.MS') as milliseconds,
to_char(sysdate, 'HH24:MI:SS:US') as microseconds;

timestamp           | seconds  | milliseconds | microseconds   
--------------------+----------+--------------+----------------
2015-04-10 18:45:09 | 18:45:09 | 18:45:09.325 | 18:45:09:325143
```

# TO\$1DATE 陣列
<a name="r_TO_DATE_function"></a>

TO\$1DATE 將字元字串所表示的日期轉換為 DATE 資料類型。

**注意**  
TO\$1DATE 不支援帶有 Q 的格式字串 (季編號)。

## 語法
<a name="r_TO_DATE_function-synopsis"></a>

```
TO_DATE(string, format)
```

```
TO_DATE(string, format, is_strict)
```

## 引數
<a name="r_TO_DATE_function-arguments"></a>

 *string*   
要轉換的字串。

 *format*   
字串常值，定義輸出 *string* 的日期部分格式。如需有效日、月和年格式的清單，請參閱[日期時間格式字串](r_FORMAT_strings.md)。

 *is\$1strict*   
選用的布林值，指定如果輸入日期值超出範圍，是否會傳回錯誤。當 *is\$1strict* 設定為 `TRUE` 時，如果有超出範圍的值，就會傳回錯誤。當 *is\$1strict* 設定為 `FALSE` (預設值) 時，就會接受溢位值。

## 傳回類型
<a name="r_TO_DATE_function-return-type"></a>

TO\$1DATE 傳回 DATE，視 *format* 值而定。

如果轉換成 *format* 失敗，則會傳回錯誤。

## 範例
<a name="r_TO_DATE_function-example"></a>

 下列 SQL 陳述式會將日期 `02 Oct 2001` 轉換為日期資料類型。

```
select to_date('02 Oct 2001', 'DD Mon YYYY');

to_date
------------
2001-10-02
(1 row)
```

 下列 SQL 陳述式會將字串 `20010631` 轉換為日期。

```
select to_date('20010631', 'YYYYMMDD', FALSE);
```

結果是 2001 年 7 月 1 日，因為 6 月只有 30 天。

```
to_date
------------
2001-07-01
```

 下列 SQL 陳述式會將字串 `20010631` 轉換為日期：

```
to_date('20010631', 'YYYYMMDD', TRUE);
```

結果是錯誤，因為六月只有 30 天。

```
ERROR:  date/time field date value out of range: 2001-6-31
```

# TO\$1NUMBER
<a name="r_TO_NUMBER"></a>

TO\$1NUMBER 將字串轉換為數值 (十進位)。

**注意**  
建議您在格式字串中使用 `FM` 來隱藏填補空白和零。如需有效格式的清單，請參閱[數值格式字串](r_Numeric_formating.md)。

## 語法
<a name="r_TO_NUMBER-synopsis"></a>

```
to_number(string, format)
```

## 引數
<a name="r_TO_NUMBER-arguments"></a>

 *string*   
要轉換的字串。格式必須是文字值。

 *format*   
第二個引數是格式字串，指出如何剖析字元字串來建立數值。例如，格式 `'FM99D999'` 指定要轉換的字串包含五位數，且第三個位置是小數點。例如，`to_number('12.345','FM99D999')` 會將以數值傳回 `12.345`。如需有效格式的清單，請參閱[數值格式字串](r_Numeric_formating.md)。

## 傳回類型
<a name="r_TO_NUMBER-return-type"></a>

TO\$1NUMBER 傳回 DECIMAL 數字。

如果轉換成 *format* 失敗，則會傳回錯誤。

## 範例
<a name="r_TO_NUMBER-examples"></a>

下列範例將字串 `12,454.8-` 轉換為數字：

```
select to_number('12,454.8-', 'FM99G999D9S');

to_number
-----------
-12454.8
```

下列範例將字串 `$ 12,454.88` 轉換為數字：

```
select to_number('$ 12,454.88', 'FML99G999D99');

to_number
-----------
12454.88
```

下列範例將字串 `$ 2,012,454.88` 轉換為數字：

```
select to_number('$ 2,012,454.88', 'FML9,999,999.99');

to_number
-----------
2012454.88
```

# TRY\$1CAST 函式
<a name="r_TRY_CAST"></a>

與 CAST 函式相比，TRY\$1CAST 會先嘗試將表達式轉換為指定的類型。如果因轉換錯誤而導致轉換失敗，操作會傳回 null。如果未明確允許轉換，操作會傳回錯誤。您可以在以下使用須知中找到可能的轉換清單。例如，不允許嘗試將布林值轉換為時間戳記。

## 語法
<a name="r_TRY_CAST-syntax"></a>

```
TRY_CAST(expression AS type)
```

## 引數
<a name="r_TRY_CAST-arguments"></a>

 *表達式*   
任何評估為一或多個值的表達式，例如欄名或常值。轉換 Null 值會傳回 Null。表達式不能包含空格或空字串。

 *type*   
 其中一種支援的資料類型。如需資料類型的完整清單，請參閱 [資料類型](c_Supported_data_types.md)。如需支援的來源資料類型和目標資料類型配對清單，請參閱下列使用須知。

## 傳回類型
<a name="r_TRY_CAST-return-type"></a>

TRY\$1CAST 會傳回 *type* 引數所指定資料類型的值。如果轉換失敗，操作會傳回 null。

## 使用須知
<a name="r_TRY_CAST-usage-notes"></a>

以下是 Amazon Redshift 針對 TRY\$1CAST 支援的來源資料類型和目標資料類型配對清單。

 *BOOL*   
 SMALLINT、INT、BIGINT、SUPER 

 *SMALLINT*   
 BOOL、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER 

 *INT*   
 BOOL、SMALLINT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER 

 *BIGINT*   
 BOOL、SMALLINT、INT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER 

 *DECIMAL*   
 SMALLINT、INT、BIGINT、REAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER 

 *REAL*   
 SMALLINT、INT、BIGINT、DECIMAL、FLOAT、BPCHAR、TEXT、VARCHAR、SUPER 

 *FLOAT*   
 SMALLINT、INT、BIGINT、DECIMAL、REAL、BPCHAR、TEXT、VARCHAR、SUPER 

 *BPCHAR*   
 SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER 

 *TEXT*   
 SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、VARCHAR、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER 

 *VARCHAR*   
 SMALLINT、INT、BIGINT、DECIMAL、REAL、FLOAT、BPCHAR、TEXT、TIMESTAMP、TIMESTAMPTZ、DATE、TIME、TIMETZ、SUPER 

 * TIMESTAMP *   
 BPCHAR、TEXT、VARCHAR、TIMESTAMPTZ、DATE、TIME 

 *TIMESTAMPTZ*   
 BPCHAR、TEXT、VARCHAR、TIMESTAMP、DATE、TIME、TIMETZ 

 *DATE*   
 BPCHAR、TEXT、VARCHAR、TIMESTAMP、TIMESTAMPTZ 

 *TIME*   
 BPCHAR、TEXT、VARCHAR 

 *TIMETZ*   
 BPCHAR、TEXT、VARCHAR 

 *SUPER*   
 SUPER 可以轉換為任何其他資料類型，但 DATE、TIME、TIMETZ、TIMESTAMP 和 TIMESTAMPTZ 除外。

## 範例
<a name="r_TRY_CAST-examples"></a>

下列範例會將 STRING 轉換為 INTEGER。

```
SELECT TRY_CAST('123' AS INT);

int
----
123
```

以下範例傳回 NULL。允許將 STRING 轉換為 INTEGER，因此 TRY\$1CAST 不會傳回錯誤，但 'foo' 不是整數，因此函式會傳回 null。

```
SELECT TRY_CAST('foo' AS INT)
```

下列範例會傳回錯誤，因為不允許將 BOOLEAN 轉換為 TIMESTAMP。

```
SELECT TRY_CAST(true as timestamp);
```

由於 TRY\$1CAST 傳回 null，而不是在轉換失敗時立即傳回錯誤，因此您可以使用 TRY\$1CAST 來篩選出無效的資料。請考慮以下範例，其中由於 Akua Mansa 的年齡欄轉換失敗，因而篩選出無效的列。

```
CREATE TABLE IF NOT EXISTS student_data(
name VARCHAR(100) NOT NULL,
age VARCHAR(3) NOT NULL,
enrollment_date DATE NOT NULL);

INSERT INTO student_data (name, age, enrollment_date)
VALUES
('Alejandro Rosalez', '10', '01/01/2000'),
('Akua Mansa', 'Ten', '01/01/2000');

SELECT * FROM student_data WHERE TRY_CAST(age AS INT) IS NOT NULL;

--Akua is not returned.
 name              | age | enrollment_date
-------------------+-----+-----------------
 Alejandro Rosalez | 10  | 01/01/2000
```

# 日期時間格式字串
<a name="r_FORMAT_strings"></a>

以下提供日期時間格式字串的參考。

下列格式字串適用於 TO\$1CHAR 之類的函數。這些字串可以包含日期時間分隔符號 (例如 '`-`'、'`/`' 或 '`:`') 及下列「日期部分」和「時間部分」。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_FORMAT_strings.html)

**注意**  
您必須以單引號括住日期時間分隔符號 (例如 '-'、'/' 或 ':')，但必須以雙引號括住上表所列的「日期部分」和「時間部分」。

## 範例
<a name="r_FORMAT_strings-examples"></a>

如需將日期格式化為字串的範例，請參閱[TO\$1CHAR](r_TO_CHAR.md)。

# 數值格式字串
<a name="r_Numeric_formating"></a>

您可以在下面找到數字格式字串的參考。

下列格式字串適用於 TO\$1NUMBER 和 TO\$1CHAR 之類的函數。
+ 如需將字串格式化為數字的範例，請參閱[TO\$1NUMBER](r_TO_NUMBER.md)。
+ 如需將數字格式化為字串的範例，請參閱[TO\$1CHAR](r_TO_CHAR.md)。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Numeric_formating.html)

# 數值資料的 Teradata 樣式格式化字元
<a name="r_Numeric-format-teradata"></a>

接下來，您可以了解 TEXT\$1TO\$1INT\$1ALT 和 TEXT\$1TO\$1NUMERIC\$1ALT 函數如何解釋輸入*運算式*字串中的字元。您還可以找到可在 *format* 詞語中指定的字元清單。此外，您還可以找到 Teradata 樣式格式化和 Amazon Redshift *格式*選項之間差異的說明。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Numeric-format-teradata.html)

## 用於有符號區十進位、Teradata 樣式數值資料格式的資料格式字元
<a name="r_Numeric-format-teradata-signed-zone"></a>

您可以在 TEXT\$1TO\$1INT\$1ALT 和 TEXT\$1TO\$1NUMERIC\$1ALT 函數的 *format* 詞語中使用以下字元來表示帶符號的分區十進位值。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Numeric-format-teradata.html)

# 日期和時間函數
<a name="Date_functions_header"></a>

在此節中，您可以找到 Amazon Redshift 支援的日期和時間 scalar 函數之相關資訊。

**Topics**
+ [日期和時間函數的摘要](#date-functions-summary)
+ [交易中日期與時間函數](#date-functions-transactions)
+ [已取代的僅限領導節點函數](#date-functions-deprecated)
+ [\$1 (串連) 運算子](r_DATE-CONCATENATE_function.md)
+ [ADD\$1MONTHS 函數](r_ADD_MONTHS.md)
+ [AT TIME ZONE 函數](r_AT_TIME_ZONE.md)
+ [CONVERT\$1TIMEZONE 函數](CONVERT_TIMEZONE.md)
+ [CURRENT\$1DATE 函數](r_CURRENT_DATE_function.md)
+ [DATE\$1CMP 函數](r_DATE_CMP.md)
+ [DATE\$1CMP\$1TIMESTAMP 函數](r_DATE_CMP_TIMESTAMP.md)
+ [DATE\$1CMP\$1TIMESTAMPTZ 函數](r_DATE_CMP_TIMESTAMPTZ.md)
+ [DATEADD 函數](r_DATEADD_function.md)
+ [DATEDIFF 函數](r_DATEDIFF_function.md)
+ [DATE\$1PART 函數](r_DATE_PART_function.md)
+ [DATE\$1PART\$1YEAR 函數](r_DATE_PART_YEAR.md)
+ [DATE\$1TRUNC 函數](r_DATE_TRUNC.md)
+ [EXTRACT 函數](r_EXTRACT_function.md)
+ [GETDATE 函數](r_GETDATE.md)
+ [INTERVAL\$1CMP 函數](r_INTERVAL_CMP.md)
+ [LAST\$1DAY 函數](r_LAST_DAY.md)
+ [MONTHS\$1BETWEEN 函數](r_MONTHS_BETWEEN_function.md)
+ [NEXT\$1DAY 函數](r_NEXT_DAY.md)
+ [SYSDATE 函數](r_SYSDATE.md)
+ [TIMEOFDAY 函數](r_TIMEOFDAY_function.md)
+ [TIMESTAMP\$1CMP 函數](r_TIMESTAMP_CMP.md)
+ [TIMESTAMP\$1CMP\$1DATE 函數](r_TIMESTAMP_CMP_DATE.md)
+ [TIMESTAMP\$1CMP\$1TIMESTAMPTZ 函數](r_TIMESTAMP_CMP_TIMESTAMPTZ.md)
+ [TIMESTAMPTZ\$1CMP 函數](r_TIMESTAMPTZ_CMP.md)
+ [TIMESTAMPTZ\$1CMP\$1DATE 函數](r_TIMESTAMPTZ_CMP_DATE.md)
+ [TIMESTAMPTZ\$1CMP\$1TIMESTAMP 函數](r_TIMESTAMPTZ_CMP_TIMESTAMP.md)
+ [TIMEZONE 函數](r_TIMEZONE.md)
+ [TO\$1TIMESTAMP 函數](r_TO_TIMESTAMP.md)
+ [TRUNC 函數](r_TRUNC_date.md)
+ [日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)

## 日期和時間函數的摘要
<a name="date-functions-summary"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/Date_functions_header.html)

**注意**  
不會將閏秒視為歷經時間的計算中。

## 交易中日期與時間函數
<a name="date-functions-transactions"></a>

當您在交易區塊 (BEGIN … END) 中執行下列函數時，函數會傳回目前交易的開始時間，而不是目前陳述式的開始。
+ SYSDATE
+ TIMESTAMP
+ CURRENT\$1DATE

下列函數一律會傳回目前陳述式的開始日期或時間 (即使他們在交易區塊中)。
+ GETDATE
+ TIMEOFDAY

## 已取代的僅限領導節點函數
<a name="date-functions-deprecated"></a>

下列日期函數已棄用，因為他們僅在領導節點上執行。如需詳細資訊，請參閱[僅限領導節點函數](c_SQL_functions_leader_node_only.md)。
+ AGE。請改用 [DATEDIFF 函數](r_DATEDIFF_function.md)。
+ CURRENT\$1TIME。請改用 [GETDATE 函數](r_GETDATE.md) 或 [SYSDATE](r_SYSDATE.md)。
+ CURRENT\$1TIMESTAMP。請改用 [GETDATE 函數](r_GETDATE.md) 或 [SYSDATE](r_SYSDATE.md)。
+ LOCALTIME。請改用 [GETDATE 函數](r_GETDATE.md) 或 [SYSDATE](r_SYSDATE.md)。
+ LOCALTIMESTAMP。請改用 [GETDATE 函數](r_GETDATE.md) 或 [SYSDATE](r_SYSDATE.md)。
+ ISFINITE 
+ NOW。請改用 [GETDATE 函數](r_GETDATE.md) 或 [SYSDATE](r_SYSDATE.md)。如果您在具體化視觀表內使用 NOW 函式，其會設定為具體化視觀表建立時的時間戳記，而不是目前時間戳記。

# \$1 (串連) 運算子
<a name="r_DATE-CONCATENATE_function"></a>

將 DATE 串連到 \$1 符號兩側的 TIME 或 TIMETZ，並傳回 TIMESTAMP 或 TIMESTAMPTZ。

## 語法
<a name="r_DATE-CONCATENATE_function-synopsis"></a>

```
date + {time | timetz}
```

引數的順序可以反轉。例如，*time* \$1 *date*。

## 引數
<a name="r_DATE-CONCATENATE_function-arguments"></a>

 *date*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。。

 *time*   
`TIME` 資料類型的欄，或是隱含評估為 `TIME` 類型的運算式。

 *timetz*   
`TIMETZ` 資料類型的欄，或是隱含評估為 `TIMETZ` 類型的運算式。

## 傳回類型
<a name="r_DATE-CONCATENATE_function-return-type"></a>

TIMESTAMP，如果輸入是 *date* \$1 *time*。

TIMESTAMPTZ，如果輸入是 *date* \$1 *timetz*。

## 範例
<a name="r_DATE-CONCATENATE_function-examples"></a>

### 範例設定
<a name="r_DATE-CONCATENATE_function-example-setup"></a>

若要設定範例中使用的 TIME\$1TEST 和 TIMTZ\$1TEST 資料表，請使用下列命令。

```
create table time_test(time_val time);

insert into time_test values
('20:00:00'),
('00:00:00.5550'),
('00:58:00');
   
create table timetz_test(timetz_val timetz);
   
insert into timetz_test values
('04:00:00+00'),
('00:00:00.5550+00'),
('05:58:00+00');
```

### 具有時間欄的範例
<a name="r_DATE-CONCATENATE_function-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會串連日期常值和 TIME\$1VAL 欄。

```
select date '2000-01-02' + time_val as ts from time_test;
            
ts
---------------------
2000-01-02 20:00:00
2000-01-02 00:00:00.5550
2000-01-02 00:58:00
```

下列範例會串連日期常值和時間常值。

```
select date '2000-01-01' + time '20:00:00' as ts;
            
         ts
---------------------
 2000-01-01 20:00:00
```

下列範例會串連時間常值和日期常值。

```
select time '20:00:00' + date '2000-01-01' as ts;
            
         ts
---------------------
 2000-01-01 20:00:00
```

### 具有 TIMTZ 欄的範例
<a name="r_DATE-CONCATENATE_function-examples-timetz"></a>

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例會串連日期常值和 TIMETZ\$1VAL 欄。

```
select date '2000-01-01' + timetz_val as ts from timetz_test;
ts
---------------------
2000-01-01 04:00:00+00
2000-01-01 00:00:00.5550+00
2000-01-01 05:58:00+00
```

下列範例會串連 TIMETZ\$1VAL 欄和日期常值。

```
select timetz_val + date '2000-01-01' as ts from timetz_test;
ts
---------------------
2000-01-01 04:00:00+00
2000-01-01 00:00:00.5550+00
2000-01-01 05:58:00+00
```

下列範例會串連 DATE 常值和 TIMETZ 常值。此範例會傳回預設為 UTC 時區的 TIMESTAMPTZ。UTC 比 PST 早 8 小時，因此結果比輸入時間早 8 小時。

```
select date '2000-01-01' + timetz '20:00:00 PST' as ts;
            
           ts
------------------------
 2000-01-02 04:00:00+00
```

# ADD\$1MONTHS 函數
<a name="r_ADD_MONTHS"></a>

ADD\$1MONTHS 會將指定幾個月新增至日期或時間戳記值或運算式。[DATEADD](r_DATEADD_function.md) 函數提供類似功能。

## 語法
<a name="r_ADD_MONTHS-synopsis"></a>

```
ADD_MONTHS( {date | timestamp}, integer)
```

## 引數
<a name="r_ADD_MONTHS-arguments"></a>

 *date* \$1 *timestamp*   
`DATE` 或 `TIMESTAMP` 資料類型的欄，或是隱含評估為 `DATE` 或 `TIMESTAMP` 類型的運算式。如果日期是某個月的最後一天，或者如果產生的月份是較短的月份，則函數會在結果中傳回該月的最後一天。若是其他日期，結果會包含與日期表達式一樣的相同天數。

 *integer*   
`INTEGER` 資料類型的值。使用負數可減少日期中的月份。

## 傳回類型
<a name="r_ADD_MONTHS-return-type"></a>

TIMESTAMP

## 範例
<a name="r_ADD_MONTHS-example"></a>

以下查詢會使用 TRUNC 函數中的 ADD\$1MONTHS 函數。TRUNC 函數會從 ADD\$1MONTHS 結果移除某日時間。ADD\$1MONTHS 函數會從 CALDATE 欄中新增 12 個月至每個值。在 CALDATE 欄中的值是日期。

```
select distinct trunc(add_months(caldate, 12)) as calplus12,
trunc(caldate) as cal
from date
order by 1 asc;

 calplus12  |    cal
------------+------------
 2009-01-01 | 2008-01-01
 2009-01-02 | 2008-01-02
 2009-01-03 | 2008-01-03
...
(365 rows)
```

*下列範例會使用 ADD\$1MONTHS 函數，將 1 個月加到 timestamp*。

```
select add_months('2008-01-01 05:07:30', 1); 

add_months
---------------------
2008-02-01 05:07:30
```

下列範例示範當 ADD\$1MONTHS 函數對含有月份的日期進行操作的行為，而這些月份的天數皆不同時。此範例顯示函數如何處理在 3 月 31 日增加 1 個月，以及在 4 月 30 日增加 1 個月。4 月有 30 天，因此在 3 月 31 日的基礎上加上 1 個月就得到 4 月 30 日。5 月有 31 天，因此在 4 月 30 日的基礎上加上 1 個月就得到 5 月 31 日。

```
select add_months('2008-03-31',1);

add_months
---------------------
2008-04-30 00:00:00

select add_months('2008-04-30',1); 

add_months
---------------------
2008-05-31 00:00:00
```

# AT TIME ZONE 函數
<a name="r_AT_TIME_ZONE"></a>

AT TIME ZONE 指定要透過 TIMESTAMP 或 TIMESTAMPTZ 表達式來使用哪一個時區。

## 語法
<a name="r_AT_TIME_ZONE-syntax"></a>

```
AT TIME ZONE 'timezone'
```

## 引數
<a name="r_AT_TIME_ZONE-arguments"></a>

*timezone*  
傳回值的 `TIMEZONE`。您可以將時區指定為時區名稱 (例如 **'Africa/Kampala'** 或 **'Singapore'**) 或做為時區縮寫 (例如 **'UTC'** 或 **'PDT'**)。  
若要查看受支援時區名稱的清單，請執行下列命令。  

```
select pg_timezone_names();
```
 若要查看受支援時區縮寫的清單，請執行下列命令。  

```
select pg_timezone_abbrevs();
```
 如需詳細資訊和範例，請參閱 [時區使用須知](CONVERT_TIMEZONE.md#CONVERT_TIMEZONE-usage-notes)。

## 傳回類型
<a name="r_AT_TIME_ZONE-return-type"></a>

與 TIMESTAMP 表達式搭配使用時的 TIMESTAMPTZ。與 TIMESTAMPTZ 表達式搭配使用時的 TIMESTAMP。

## 範例
<a name="r_AT_TIME_ZONE-examples"></a>

下列範例會轉換不含時區的時間戳記值，並將其解譯為 MST 時間 (POSIX 中的 UTC\$17)。此範例會傳回 UTC 時區的 TIMESTAMPTZ 資料類型值。如果您將預設時區設定為 UTC 以外的時區，可能會看到不同的結果。

```
SELECT TIMESTAMP '2001-02-16 20:38:40' AT TIME ZONE 'MST';

timezone
------------------------
2001-02-17 03:38:40+00
```

下列範例會使用含時區值的輸入時間戳記，其中指定的時區是 EST (POSIX 中的 UTC\$15) 且會將其轉換為 MST (POSIX 中的 UTC\$17)。此範例會傳回 TIMESTAMP 資料類型的值。

```
SELECT TIMESTAMPTZ '2001-02-16 20:38:40-05' AT TIME ZONE 'MST';

timezone
------------------------
2001-02-16 18:38:40
```

# CONVERT\$1TIMEZONE 函數
<a name="CONVERT_TIMEZONE"></a>

CONVERT\$1TIMEZONE 可將時間戳記從一個時區轉換為另一個時區。此函式會根據日光節約時間自動調整。

## 語法
<a name="CONVERT_TIMEZONE-syntax"></a>

```
CONVERT_TIMEZONE( ['source_timezone',] 'target_timezone', 'timestamp')
```

## 引數
<a name="CONVERT_TIMEZONE-arguments"></a>

*source\$1timezone*  
(選用) 目前時間戳記的時區。預設值為 UTC。如需詳細資訊，請參閱[時區使用須知](#CONVERT_TIMEZONE-usage-notes)。

*target\$1timezone*   
新時間戳記的時區。如需詳細資訊，請參閱[時區使用須知](#CONVERT_TIMEZONE-usage-notes)。

*timestamp*   
時間戳記欄或運算式會隱性轉換為時間戳記。

## 傳回類型
<a name="CONVERT_TIMEZONE-return-type"></a>

TIMESTAMP

## 時區使用須知
<a name="CONVERT_TIMEZONE-usage-notes"></a>

您可以將 *source\$1timezone* 或 *target\$1timezone* 指定為時區名稱 (例如 'Africa/Kampala' 或 'Singapore') 或做為時區縮寫 (例如 'UTC' 或 'PDT')。您不需要將時區名稱轉換為名稱，或將縮寫轉換為縮寫。例如，您可以從來源時區名稱 'Singapore' 選擇時間戳記，並將其轉換為時區縮寫 'PDT' 的時間戳記。

**注意**  
使用時區名稱或時區縮寫時，可能會因為當地季節性時間而有不同結果，例如日光節約時間。

### 使用時區名稱
<a name="CONVERT_TIMEZONE-using-name"></a>

若要查看最新且完整的時區名稱清單，請執行下列命令。

```
select pg_timezone_names();
```

每一列都包含一個逗號分隔的字串，其中包含時區名稱、縮寫、UTC 時差，以及時區是否會遵循日光節約時間 (`t` 或 `f`) 的指標。以下列程式碼片段為例，其將顯示兩個產生的資料列。第一列是時區 `Antarctica/South Pole`、縮寫 `NZDT` (與 UTC 的時差為 `13:00:00`)，以及 `f`，用於表示其不會遵循日光節約時間。第二列是時區 `Europe/Paris`、縮寫 `CET` (與 UTC 的時差為 `01:00:00`)，以及 `f`，用於表示其不會遵循日光節約時間。

```
pg_timezone_names
------------------
(Antarctica/South_Pole,NZDT,13:00:00,t)	
(Europe/Paris,CET,01:00:00,f)
```

執行 SQL 陳述式以取得整個清單並尋找時區名稱。大約會傳回 600 個資料列。雖然部分傳回的時區名稱為大寫首字母或縮寫 (例如，GB、PRC、ROK)，CONVERT\$1TIMEZONE 功能仍會將其視為時區名稱，而非時區縮寫。

如果您使用時區名稱指定時區，CONVERT\$1TIMEZONE 會為日光節約時間 (DST)，或在由 '*timestamp*' 指定的日期和時間期間為該時區強制執行的任何當地季節協定 (例如夏天時間、標準時間或冬天時間) 自動調整。例如，'Europe/London' 在冬天代表 UTC，在夏天增加一小時。請注意，Amazon Redshift 使用 [IANA 時區資料庫](https://www.iana.org/time-zones)作為時區規格的授權來源。

### 使用時區縮寫
<a name="CONVERT_TIMEZONE-using-abbrev"></a>

 若要查看最新且完整的時區縮寫清單，請執行下列命令。

```
select pg_timezone_abbrevs();
```

結果都會包含一個逗號分隔的字串，其中包含時區縮寫、UTC 時差，以及時區是否會遵循日光節約時間的指標 (`t` 或 `f`)。以下列程式碼片段為例，其將顯示兩個產生的資料列。第一列包含太平洋夏令時間的縮寫 (`PDT`)，與 UTC 的時差為 `-07:00:00`，以及表示其遵循日光節約時間的 `t`。第二列包含太平洋標準時間的縮寫 (`PST`)，與 UTC 的時差為 `-08:00:00`，以及表示其不遵循日光節約時間的 `f`。

```
pg_timezone_abbrevs
--------------------
(PDT,-07:00:00,t)	
(PST,-08:00:00,f)
```

執行 SQL 陳述式以取得整個清單，並根據其時差和日光節約時間指標來尋找縮寫。大約會傳回 200 個資料列。

時區縮寫代表與 UTC 的固定偏差。如果您使用時區縮寫來指定時區，CONVERT\$1TIMEZONE 會使用與 UTC 固定的偏差且不會為任何當地季節協定進行調整。

### 使用 POSIX 樣式格式
<a name="CONVERT_TIMEZONE-using-posix"></a>

POSIX 樣式時區規格的格式是 *STDoffset* 或 *STDoffsetDST*，其中 *STD* 是時區縮寫，*offset* 是 UTC 以西的小時偏移量，*DST* 是選用的日光節約時區縮寫。日光節約時間假設為比所指時差早一小時。

POSIX 樣式時區格式使用格林威治以西的正偏移，與 ISO-8601 慣例不同，此是使用格林威治以東的正偏移。

以下是 POSIX 樣式時區的範例：
+  PST8
+  PST8PDT
+  EST5
+  EST5EDT

**注意**  
Amazon Redshift 不會驗證 POSIX 樣式時區規格，所以可能會將時區設為無效值。例如，即使將時區設為無效值，下列命令不會傳回錯誤。  

```
set timezone to ‘xxx36’;
```

## 範例
<a name="CONVERT_TIMEZONE-examples"></a>

許多範例都使用 TICKIT 範例資料集。如需詳細資訊， 請參閱[範本資料庫](https://docs.aws.amazon.com/redshift/latest/dg/c_sampledb.html)。

以下範例會將時間戳記值從預設 UTC 時區轉換為 PST。

```
select convert_timezone('PST', '2008-08-21 07:23:54');
                     
 convert_timezone
------------------------
2008-08-20 23:23:54
```

以下範例會將 LISTTIME 欄位中的時間戳記值從預設 UTC 時區轉換為 PST。即使時間戳記是在日光節約時間期間，其會轉換為標準時間，因為目標時區是指定為縮寫 (PST)。

```
select listtime, convert_timezone('PST', listtime) from listing
where listid = 16;
                     
     listtime       |   convert_timezone
--------------------+-------------------
2008-08-24 09:36:12     2008-08-24 01:36:12
```

以下範例會將時間戳記 LISTTIME 欄位從預設 UTC 時區轉換為 US/Pacific 時區。目標時區使用時區名稱，且時間戳記是在日光節約時間期間，因此函數會傳回日光時間。

```
select listtime, convert_timezone('US/Pacific', listtime) from listing
where listid = 16;
                     
     listtime       |   convert_timezone
--------------------+---------------------
2008-08-24 09:36:12 | 2008-08-24 02:36:12
```

以下範例會將時間戳記字串從 EST 轉換為 PST：

```
select convert_timezone('EST', 'PST', '20080305 12:25:29');
                     
 convert_timezone
-------------------
2008-03-05 09:25:29
```

以下範例會將時間戳記轉換為美國東部標準時間，因為目標時區使用時區名稱 (America/New\$1York) 且時間戳記是在標準時間期間。

```
select convert_timezone('America/New_York', '2013-02-01 08:00:00');

 convert_timezone
---------------------
2013-02-01 03:00:00
(1 row)
```

以下範例會將時間戳記轉換為美國東部日光時間，因為目標時區使用時區名稱 (America/New\$1York) 且時間戳記是在日光時間期間。

```
select convert_timezone('America/New_York', '2013-06-01 08:00:00');

 convert_timezone
---------------------
2013-06-01 04:00:00
(1 row)
```

以下範例示範的是偏移的使用。

```
SELECT CONVERT_TIMEZONE('GMT','NEWZONE +2','2014-05-17 12:00:00') as newzone_plus_2, 
CONVERT_TIMEZONE('GMT','NEWZONE-2:15','2014-05-17 12:00:00') as newzone_minus_2_15, 
CONVERT_TIMEZONE('GMT','America/Los_Angeles+2','2014-05-17 12:00:00') as la_plus_2,
CONVERT_TIMEZONE('GMT','GMT+2','2014-05-17 12:00:00') as gmt_plus_2;
 
   newzone_plus_2    | newzone_minus_2_15  |      la_plus_2      |     gmt_plus_2
---------------------+---------------------+---------------------+---------------------
2014-05-17 10:00:00 | 2014-05-17 14:15:00 | 2014-05-17 10:00:00 | 2014-05-17 10:00:00
(1 row)
```

# CURRENT\$1DATE 函數
<a name="r_CURRENT_DATE_function"></a>

CURRENT\$1DATE 傳回目前工作階段時區中的日期 (預設為 UTC)，使用預設格式：YYYY-MM-DD。

**注意**  
CURRENT\$1DATE 傳回目前交易的日期 (而不是目前陳述式的開始)。考慮以下場景：您在 10/01/08 23:59 啟動包含多個陳述式的交易，而包含 CURRENT\$1DATE 的陳述式在 10/02/08 00:00 執行。CURRENT\$1DATE 傳回 `10/01/08`，而不是 `10/02/08`。

## 語法
<a name="r_CURRENT_DATE_function-syntax"></a>

```
CURRENT_DATE
```

## 傳回類型
<a name="r_CURRENT_DATE_function-return-type"></a>

DATE

## 範例
<a name="r_CURRENT_DATE_function-examples"></a>

下列範例會傳回目前日期 （在函數執行 AWS 區域 所在的 中）。

```
select current_date;

   date
------------
2008-10-01
```

下列範例會建立資料表，插入 `todays_date` 欄預設值為 CURRENT\$1DATE 的列，然後選取資料表中的所有列。

```
CREATE TABLE insert_dates(
    label varchar(128) NOT NULL,
    todays_date DATE DEFAULT CURRENT_DATE);

INSERT INTO insert_dates(label)
VALUES('Date row inserted');

SELECT * FROM insert_dates;
         

 label            | todays_date
------------------+-------------
Date row inserted | 2023-05-10
```

# DATE\$1CMP 函數
<a name="r_DATE_CMP"></a>

DATE\$1CMP 會比較兩個日期。如果日期相同，該函式會傳回 `0`、如果 *date1* 較晚則傳回 `1`，而如果 *date2* 較晚則傳回 `-1`。

## 語法
<a name="r_DATE_CMP-synopsis"></a>

```
DATE_CMP(date1, date2)
```

## 引數
<a name="r_DATE_CMP-arguments"></a>

 *date1*   
`DATE` 資料類型的欄，或是評估為 `DATE` 類型的運算式。

 *date2*   
`DATE` 資料類型的欄，或是評估為 `DATE` 類型的運算式。

## 傳回類型
<a name="r_DATE_CMP-return-type"></a>

INTEGER

## 範例
<a name="r_DATE_CMP-example"></a>

下列查詢會比較 CALDATE 欄位的 DATE 值與日期 2008 年 1 月 4 日，並傳回 CALDATE 中的值是早於 (`-1`)、等於 (`0`) 或晚於 (`1`) 2008 年 1 月 4 日：

```
select caldate, '2008-01-04',
date_cmp(caldate,'2008-01-04')
from date
order by dateid
limit 10;

 caldate   |  ?column?  | date_cmp
-----------+------------+----------
2008-01-01 | 2008-01-04 |       -1
2008-01-02 | 2008-01-04 |       -1
2008-01-03 | 2008-01-04 |       -1
2008-01-04 | 2008-01-04 |        0
2008-01-05 | 2008-01-04 |        1
2008-01-06 | 2008-01-04 |        1
2008-01-07 | 2008-01-04 |        1
2008-01-08 | 2008-01-04 |        1
2008-01-09 | 2008-01-04 |        1
2008-01-10 | 2008-01-04 |        1
(10 rows)
```

# DATE\$1CMP\$1TIMESTAMP 函數
<a name="r_DATE_CMP_TIMESTAMP"></a>

DATE\$1CMP\$1TIMESTAMP 會比較日期與時間戳記，如果值相同則傳回 `0`、如果 *date* 較晚則傳回 `1`，而如果 *timestamp* 較晚則傳回 `-1`。

## 語法
<a name="r_DATE_CMP_TIMESTAMP-synopsis"></a>

```
DATE_CMP_TIMESTAMP(date, timestamp)
```

## 引數
<a name="r_DATE_CMP_TIMESTAMP-arguments"></a>

 *date*   
`DATE` 資料類型的欄，或是評估為 `DATE` 類型的運算式。

 *timestamp*   
`TIMESTAMP` 資料類型的欄，或是評估為 `TIMESTAMP` 類型的運算式。

## 傳回類型
<a name="r_DATE_CMP_TIMESTAMP-return-type"></a>

INTEGER

## 範例
<a name="r_DATE_CMP_TIMESTAMP-examples"></a>

例如，下列範例會比較日期 `2008-06-18` 與 LISTTIME。LISTTIME 欄的值是時間戳記。在此日期前所做的清單會傳回 `1`，在此日期後所做的清單會傳回 `-1`。

```
select listid, '2008-06-18', listtime,
date_cmp_timestamp('2008-06-18', listtime)
from listing
order by 1, 2, 3, 4
limit 10;

 listid |  ?column?  |      listtime       | date_cmp_timestamp
--------+------------+---------------------+--------------------
      1 | 2008-06-18 | 2008-01-24 06:43:29 |                  1
      2 | 2008-06-18 | 2008-03-05 12:25:29 |                  1
      3 | 2008-06-18 | 2008-11-01 07:35:33 |                 -1
      4 | 2008-06-18 | 2008-05-24 01:18:37 |                  1
      5 | 2008-06-18 | 2008-05-17 02:29:11 |                  1
      6 | 2008-06-18 | 2008-08-15 02:08:13 |                 -1
      7 | 2008-06-18 | 2008-11-15 09:38:15 |                 -1
      8 | 2008-06-18 | 2008-11-09 05:07:30 |                 -1
      9 | 2008-06-18 | 2008-09-09 08:03:36 |                 -1
     10 | 2008-06-18 | 2008-06-17 09:44:54 |                  1
(10 rows)
```

# DATE\$1CMP\$1TIMESTAMPTZ 函數
<a name="r_DATE_CMP_TIMESTAMPTZ"></a>

DATE\$1CMP\$1TIMESTAMPTZ 會比較日期與含時區的時間戳記，如果值相同則傳回 `0`、如果 *date* 較晚則傳回 `1`，而如果 *timestamptz* 較晚則傳回 `-1`。

## 語法
<a name="r_DATE_CMP_TIMESTAMPTZ-syntax"></a>

```
DATE_CMP_TIMESTAMPTZ(date, timestamptz)
```

## 引數
<a name="r_DATE_CMP_TIMESTAMPTZ-arguments"></a>

 *date*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。。

 *timestamptz*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

## 傳回類型
<a name="r_DATE_CMP_TIMESTAMPTZ-return-type"></a>

INTEGER

## 範例
<a name="r_DATE_CMP_TIMESTAMPTZ-examples"></a>

例如，下列範例會比較日期 `2008-06-18` 與 LISTTIME。在此日期前所做的清單會傳回 `1`，在此日期後所做的清單會傳回 `-1`。

```
select listid, '2008-06-18', CAST(listtime AS timestamptz),
date_cmp_timestamptz('2008-06-18', CAST(listtime AS timestamptz))
from listing
order by 1, 2, 3, 4
limit 10;

 listid |  ?column?  |      timestamptz       | date_cmp_timestamptz
--------+------------+------------------------+----------------------
      1 | 2008-06-18 | 2008-01-24 06:43:29+00 |                  1
      2 | 2008-06-18 | 2008-03-05 12:25:29+00 |                  1
      3 | 2008-06-18 | 2008-11-01 07:35:33+00 |                 -1
      4 | 2008-06-18 | 2008-05-24 01:18:37+00 |                  1
      5 | 2008-06-18 | 2008-05-17 02:29:11+00 |                  1
      6 | 2008-06-18 | 2008-08-15 02:08:13+00 |                 -1
      7 | 2008-06-18 | 2008-11-15 09:38:15+00 |                 -1
      8 | 2008-06-18 | 2008-11-09 05:07:30+00 |                 -1
      9 | 2008-06-18 | 2008-09-09 08:03:36+00 |                 -1
     10 | 2008-06-18 | 2008-06-17 09:44:54+00 |                  1
(10 rows)
```

# DATEADD 函數
<a name="r_DATEADD_function"></a>

透過指定間隔來增量 DATE、TIME、TIMETZ 或 TIMESTAMP 值。

## 語法
<a name="r_DATEADD_function-synopsis"></a>

```
DATEADD( datepart, interval, {date|time|timetz|timestamp} )
```

## 引數
<a name="r_DATEADD_function-arguments"></a>

 *datepart*   
函數對其執行的日期部分 (例如，年、月、日或小時)。如需詳細資訊，請參閱[日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)。

 *間隔*   
指定要新增至目標表達式之間隔 (例如，天數) 的整數。負整數會減去間隔。

 *date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE、TIME、TIMETZ 或 TIMESTAMP 欄或隱含轉換為 DATE、TIME、TIMETZ 或 TIMESTAMP 的運算式。DATE、TIME、TIMETZ 或 TIMESTAMP 運算式必須包含指定的日期部分。

## 傳回類型
<a name="r_DATEADD_function-return-type"></a>

TIMESTAMP 或 TIME 或 TIMETZ 取決於輸入資料類型。

## 具有 DATE 欄的範例
<a name="r_DATEADD_function-examples"></a>

下列範例會向 DATE 資料表中存在的 11 月份的每個日期增加 30 天。

```
select dateadd(day,30,caldate) as novplus30
from date
where month='NOV'
order by dateid;

novplus30
---------------------
2008-12-01 00:00:00
2008-12-02 00:00:00
2008-12-03 00:00:00
...
(30 rows)
```

 下列範例會將 18 個月增加至常值日期值。

```
select dateadd(month,18,'2008-02-28');

date_add
---------------------
2009-08-28 00:00:00
(1 row)
```

DATEADD 函數的預設欄名稱為 DATE\$1ADD。日期值的預設時間戳記為 `00:00:00`。

下列範例會將 30 分鐘增加至未指定時間戳記的日期值。

```
select dateadd(m,30,'2008-02-28');

date_add
---------------------
2008-02-28 00:30:00
(1 row)
```

您可以用全名或縮寫來表示日期部分。在這種情況下，*m* 代表分鐘，而不是月。

## 具有 TIME 欄的範例
<a name="r_DATEADD_function-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會將 5 分鐘增加至 TIME\$1TEST 資料表中的每個 TIME\$1VAL。

```
select dateadd(minute,5,time_val) as minplus5 from time_test;
            
minplus5
---------------
20:05:00
00:05:00.5550
01:03:00
```

下列範例會將 8 小時增加至常值時間值。

```
select dateadd(hour, 8, time '13:24:55');
            
date_add
---------------
21:24:55
```

下列範例會顯示時間超過 24:00:00 或在 00:00:00 以下的時間。

```
select dateadd(hour, 12, time '13:24:55');
            
date_add
---------------
01:24:55
```

## 具有 TIMTZ 欄的範例
<a name="r_DATEADD_function-examples-timetz"></a>

這些範例中的輸出值是以 UTC 為預設時區。

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例會將 5 分鐘增加至 TIMETZ\$1TEST 資料表中的每個 TIMETZ\$1VAL。

```
select dateadd(minute,5,timetz_val) as minplus5_tz from timetz_test;
            
minplus5_tz
---------------
04:05:00+00
00:05:00.5550+00
06:03:00+00
```

下列範例會將 2 小時加入常值 timetz 值。

```
select dateadd(hour, 2, timetz '13:24:55 PST');
            
date_add
---------------
23:24:55+00
```

## 具有 TIMESTAMP 欄的範例
<a name="r_DATEADD_function-examples-timestamp"></a>

這些範例中的輸出值是以 UTC 為預設時區。

下列範例資料表 TIMESTAMP\$1TEST 有一個 TIMESTAMP\$1VAL 欄 (類型為 TIMESTAMP)，其中插入了三個值。

```
SELECT timestamp_val FROM timestamp_test;
            
timestamp_val
------------------
1988-05-15 10:23:31
2021-03-18 17:20:41
2023-06-02 18:11:12
```

以下範例僅將 20 年增加至 2000 年之前的 TIMESTAMP\$1TEST 中的 TIMESTAMP\$1VAL 值。

```
SELECT dateadd(year,20,timestamp_val) 
FROM timestamp_test
WHERE timestamp_val < to_timestamp('2000-01-01 00:00:00', 'YYYY-MM-DD HH:MI:SS');
            
date_add
---------------
2008-05-15 10:23:31
```

下列範例將 5 秒加入不帶秒指示器的常值時間戳記值。

```
SELECT dateadd(second, 5, timestamp '2001-06-06');
            
date_add
---------------
2001-06-06 00:00:05
```

## 使用須知
<a name="r_DATEADD_usage_notes"></a>

 DATEADD(month, ...) 和 ADD\$1MONTHS 函數處理落在月底之日期的方式會所有不同：
+ ADD\$1MONTHS：如果您要新增的日期是某個月的最後一天，則產生的月份總是產生月份的最後一天，不論該月份的長短。例如，4 月 30 號 \$1 1 個月是 5 月 31 號。

  ```
  select add_months('2008-04-30',1);
  
  add_months
  ---------------------
  2008-05-31 00:00:00
  (1 row)
  ```
+ DATEADD：如果您要新增之日期中的天數少於結果月份，則結果將會是結果月份的相對應天數，而不會是該月的最後一天。例如，4 月 30 號 \$1 1 個月是 5 月 30 號。

  ```
  select dateadd(month,1,'2008-04-30');
  
  date_add
  ---------------------
  2008-05-30 00:00:00
  (1 row)
  ```

DATEADD 函數使用 dateadd (月份，12…) 或 dateadd (年份，1…) 時，處理閏年日期 02-29 的方式會不同。

```
select dateadd(month,12,'2016-02-29');
               
date_add
---------------------
2017-02-28 00:00:00

select dateadd(year, 1, '2016-02-29');

date_add       
---------------------
2017-03-01 00:00:00
```

# DATEDIFF 函數
<a name="r_DATEDIFF_function"></a>

DATEDIFF 傳回兩個日期或時間表達式之日期部分的差異。

## 語法
<a name="r_DATEDIFF_function-synopsis"></a>

```
DATEDIFF( datepart, {date|time|timetz|timestamp}, {date|time|timetz|timestamp} )
```

## 引數
<a name="r_DATEDIFF_function-arguments"></a>

 *datepart*   
函數運作的日期或時間值 (年、月或日、小時、分鐘、秒、毫秒或微秒) 的特定部分。如需詳細資訊，請參閱[日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)。  
特別是，DATEDIFF 會決定兩個運算式間相距的日期部分邊界數。例如，假設您正在計算兩個日期 `12-31-2008` 和 `01-01-2009` 之間的年度差異。在這種情況下，函數傳回 1 年，儘管這些日期只相隔一天。如果您正在尋找兩個時間戳記間時數的差異，`01-01-2009 8:30:00` 和 `01-01-2009 10:00:00`，結果為 2 小時。如果您正在尋找兩個時間戳記間時數的差異，`8:30:00` 和 `10:00:00`，結果為 2 小時。

*date*\$1*time*\$1*timetz*\$1*timestamp*  
DATE、TIME、TIMETZ 或 TIMESTAMP 欄，或隱含轉換為 DATE、TIME、TIMETZ 或 TIMESTAMP 的運算式。運算式必須同時包含指定的日期部分或時間部分。如果第二個日期或時間晚於第一個日期或時間，結果為正值。如果第二個日期或時間早於第一個日期或時間，結果為負值。

## 傳回類型
<a name="r_DATEDIFF_function-return-type"></a>

BIGINT

## 具有 DATE 欄的範例
<a name="r_DATEDIFF_function-examples"></a>

下列範例會尋找在兩個常值日期值間週次的差異。

```
select datediff(week,'2009-01-01','2009-12-31') as numweeks;

numweeks
----------
52
(1 row)
```

下列範例會尋找兩個常值日期值之間的差異 (以小時為單位)。如果您未提供日期的時間值，則預設值為 00:00:00。

```
select datediff(hour, '2023-01-01', '2023-01-03 05:04:03');
            
date_diff
----------
53
(1 row)
```

下列範例會尋找兩個常值 TIMESTAMETZ 值之間的差異 (以天為單位)。

```
Select datediff(days, 'Jun 1,2008  09:59:59 EST', 'Jul 4,2008  09:59:59 EST')
         
date_diff
----------
33
```

以下範例找出資料表中同一列兩個日期之間的差異 (以天為單位)。

```
select * from date_table;

start_date |   end_date
-----------+-----------
2009-01-01 | 2009-03-23
2023-01-04 | 2024-05-04
(2 rows)

select datediff(day, start_date, end_date) as duration from date_table;
         
duration
---------
      81
     486
(2 rows)
```

下列範例會尋找在過去和今日日期中常值間季次的差異。此範例假設目前日期為 2008 年 6 月 5 日。您可以用全名或縮寫來表示日期部分。DATEDIFF 函數的預設欄名稱為 DATE\$1DIFF。

```
select datediff(qtr, '1998-07-01', current_date);

date_diff
-----------
40
(1 row)
```

下列範例會聯結 SALES 和 LISTING 資歷表，來計算在他們列出和門票售出後所經的天數：清單 1000 到 1005。這些清單銷售的最長等待時間是 15 天，而最短時間是不到一天 (0 天)。

```
select priceperticket,
datediff(day, listtime, saletime) as wait
from sales, listing where sales.listid = listing.listid
and sales.listid between 1000 and 1005
order by wait desc, priceperticket desc;

priceperticket | wait
---------------+------
 96.00         |   15
 123.00        |   11
 131.00        |    9
 123.00        |    6
 129.00        |    4
 96.00         |    4
 96.00         |    0
(7 rows)
```

此範例會計算賣家等待所有門票特價的平均小時數。

```
select avg(datediff(hours, listtime, saletime)) as avgwait
from sales, listing
where sales.listid = listing.listid;

avgwait
---------
465
(1 row)
```

## 具有 TIME 欄的範例
<a name="r_DATEDIFF_function-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會尋找 TIME\$1VAL 欄與時間常值之間的小時數差異。

```
select datediff(hour, time_val, time '15:24:45') from time_test;
         
 date_diff
-----------
        -5
        15
        15
```

下列範例會尋找兩個常值時間值之間的分鐘數差異。

```
select datediff(minute, time '20:00:00', time '21:00:00') as nummins;  
         
nummins 
---------- 
60
```

## 具有 TIMTZ 欄的範例
<a name="r_DATEDIFF_function-examples-timetz"></a>

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例會尋找 TIMETZ 常值與 timetz\$1val 之間的小時數差異。

```
select datediff(hours, timetz '20:00:00 PST', timetz_val) as numhours from timetz_test;

numhours 
---------- 
0
-4
1
```

下列範例會尋找兩個常值 TIMTZ 值之間的小時數差異。

```
select datediff(hours, timetz '20:00:00 PST', timetz '00:58:00 EST') as numhours;
         
numhours 
---------- 
1
```

# DATE\$1PART 函數
<a name="r_DATE_PART_function"></a>

DATE\$1PART 會從運算式擷取日期部分值。DATE\$1PART 是 PGDATE\$1PART 函數的同義詞。

## 語法
<a name="r_DATE_PART_function-synopsis"></a>

```
DATE_PART(datepart, {date|timestamp})
```

## 引數
<a name="r_DATE_PART_function-arguments"></a>

 *datepart*   
函數所操作的日期值的特定部分 (例如年、月或日) 的識別碼常值或字串。如需詳細資訊，請參閱[日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)。

\$1*date*\$1*timestamp*\$1  
日期欄、時間戳記欄，或會隱性轉換為日期或時間戳記的運算式。*Date* 或 *timestamp* 中的欄或運算式必須包含 *datepart* 中指定的日期部分。

## 傳回類型
<a name="r_DATE_PART_function-return-type"></a>

DOUBLE

## 範例
<a name="r_DATE_PART_function-examples"></a>

DATE\$1PART 函數的預設欄名稱為 `pgdate_part`。

 如需其中一些範例中所使用資料的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。

下列範例會從時間戳記常值尋找分鐘。

```
SELECT DATE_PART(minute, timestamp '20230104 04:05:06.789');
            
pgdate_part
-----------
         5
```

下列範例會從時間戳記常值中尋找週數。週數計算遵循 ISO 8601 標準。如需詳細資訊，請參閱 Wikipedia 中的 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)。

```
SELECT DATE_PART(week, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         18
```

下列範例會從時間戳記常值尋找月份中的日期。

```
SELECT DATE_PART(day, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         2
```

下列範例會從時間戳記常值尋找星期幾。週數計算是從 0-6 開始的整數，以星期日開始。

```
SELECT DATE_PART(dayofweek, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         1
```

下列範例會從時間戳記常值中尋找世紀。世紀計算遵循 ISO 8601 標準。如需詳細資訊，請參閱 Wikipedia 中的 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)。

```
SELECT DATE_PART(century, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         21
```

下列範例會從時間戳記常值中尋找千年。千年計算遵循 ISO 8601 標準。如需詳細資訊，請參閱 Wikipedia 中的 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)。

```
SELECT DATE_PART(millennium, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
         3
```

下列範例會從時間戳記常值中尋找微秒。微秒計算遵循 ISO 8601 標準。如需詳細資訊，請參閱 Wikipedia 中的 [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)。

```
SELECT DATE_PART(microsecond, timestamp '20220502 04:05:06.789');
            
pgdate_part
-----------
    789000
```

下列範例會從日期常值中尋找月份。

```
SELECT DATE_PART(month, date '20220502');
            
pgdate_part
-----------
         5
```

下列範例會將 DATE\$1PART 函數套用至資料表中的欄。

```
SELECT date_part(w, listtime) AS weeks, listtime
FROM listing 
WHERE listid=10
            

weeks |      listtime
------+---------------------
 25   | 2008-06-17 09:44:54
(1 row)
```

您可以將日期部分以全名或縮寫表示，在此情況下，*w* 代表週。

週日期部分的天會傳回從 0–6 的整數，從星期日開始。使用 DATE\$1PART 含小數點 (DAYOFWEEK)，來檢視星期六的事件。

```
SELECT date_part(dow, starttime) AS dow, starttime 
FROM event
WHERE date_part(dow, starttime)=6
ORDER BY 2,1;     

 dow |      starttime
-----+---------------------
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
   6 | 2008-01-05 14:00:00
...
(1147 rows)
```

# DATE\$1PART\$1YEAR 函數
<a name="r_DATE_PART_YEAR"></a>

DATE\$1PART\$1YEAR 函數從日期擷取年份。

## 語法
<a name="r_DATE_PART_YEAR-synopsis"></a>

```
DATE_PART_YEAR(date)
```

## 引數
<a name="r_DATE_PART_YEAR-argument"></a>

 *date*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。

## 傳回類型
<a name="r_DATE_PART_YEAR-return-type"></a>

INTEGER

## 範例
<a name="r_DATE_PART_YEAR-examples"></a>

下列範例會從日期常值中尋找年份。

```
SELECT DATE_PART_YEAR(date '20220502 04:05:06.789');

date_part_year
---------------
2022
```

下列範例從 CALDATE 欄位中擷取年份。在 CALDATE 欄中的值是日期。如需此範例中所使用資料的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。

```
select caldate, date_part_year(caldate)
from date
order by
dateid limit 10;

 caldate   | date_part_year
-----------+----------------
2008-01-01 |           2008
2008-01-02 |           2008
2008-01-03 |           2008
2008-01-04 |           2008
2008-01-05 |           2008
2008-01-06 |           2008
2008-01-07 |           2008
2008-01-08 |           2008
2008-01-09 |           2008
2008-01-10 |           2008
(10 rows)
```

# DATE\$1TRUNC 函數
<a name="r_DATE_TRUNC"></a>

DATE\$1TRUNC 函數會根據您指定的日期部分 (例如小時、天或月) 來截斷時間戳記運算式或常值。

## 語法
<a name="r_DATE_TRUNC-synopsis"></a>

```
DATE_TRUNC('datepart', timestamp)
```

## 引數
<a name="r_DATE_TRUNC-arguments"></a>

 *datepart*   
時間戳記值截斷目標的日期部分。輸入 *timestamp* 被截斷為輸入 *datepart* 的精確度。例如，`month` 截斷為每個月的第一天。有效格式如下：  
+ microsecond, microseconds
+ millisecond, milliseconds
+ second, seconds
+ minute, minutes
+ hour, hours
+ day, days
+ week, weeks
+ month, months
+ quarter, quarters
+ year, years
+ decade, decades
+ century, centuries
+ millennium, millennia
如需某些格式縮寫的相關資訊，請參閱 [日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)

 *timestamp*   
時間戳記欄或運算式會隱性轉換為時間戳記。

## 傳回類型
<a name="r_DATE_TRUNC-return-type"></a>

TIMESTAMP

## 範例
<a name="r_DATE_TRUNC-example"></a>

將輸入時間戳記截斷為秒。

```
SELECT DATE_TRUNC('second', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:05:06
```

將輸入時間戳記截斷為分鐘。

```
SELECT DATE_TRUNC('minute', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:05:00
```

將輸入時間戳記截斷為小時。

```
SELECT DATE_TRUNC('hour', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 04:00:00
```

將輸入時間戳記截斷為天。

```
SELECT DATE_TRUNC('day', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-30 00:00:00
```

將輸入時間戳記截斷為一個月的第一天。

```
SELECT DATE_TRUNC('month', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-01 00:00:00
```

將輸入時間戳記截斷為季度的第一天。

```
SELECT DATE_TRUNC('quarter', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-04-01 00:00:00
```

將輸入時間戳記截斷為一年的第一天。

```
SELECT DATE_TRUNC('year', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2020-01-01 00:00:00
```

將輸入時間戳記截斷為世紀的第一天。

```
SELECT DATE_TRUNC('millennium', TIMESTAMP '20200430 04:05:06.789');
date_trunc
2001-01-01 00:00:00
```

將輸入時間戳記截斷為一週的星期一。

```
select date_trunc('week', TIMESTAMP '20220430 04:05:06.789');
date_trunc
2022-04-25 00:00:00
```

在下列範例中，DATE\$1TRUNC 函數會使用「週」日期部分來傳回每週星期一的日期。

```
select date_trunc('week', saletime), sum(pricepaid) from sales where
saletime like '2008-09%' group by date_trunc('week', saletime) order by 1;

date_trunc  |    sum
------------+-------------
2008-09-01  | 2474899
2008-09-08  | 2412354
2008-09-15  | 2364707
2008-09-22  | 2359351
2008-09-29  |  705249
```

# EXTRACT 函數
<a name="r_EXTRACT_function"></a>

EXTRACT 函式會從 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 值傳回日期或時間部分。範例包括時間戳記中的日、月、年、時、分、秒、毫秒或微秒。

## 語法
<a name="r_EXTRACT_function-synopsis"></a>

```
EXTRACT(datepart FROM source)
```

## 引數
<a name="r_EXTRACT_function-arguments"></a>

 *datepart*   
要擷取的日期或時間的分欄，例如日、月、年、小時、分鐘、秒、毫秒或微秒。對於可能的值，請參閱 [日期或時間戳記函數的日期部分](r_Dateparts_for_datetime_functions.md)。

 *source*   
評估為 TIMESTAMP、TIMESTAMPTZ、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND 資料類型的欄或表達式。

## 傳回類型
<a name="r_EXTRACT_function-return-type"></a>

如果 *source* 值評估為資料類型 TIMESTAMP、TIME、TIMETZ、INTERVAL YEAR TO MONTH 或 INTERVAL DAY TO SECOND，則為 INTEGER。

如果 *source* 值計算為資料類型 TIMESTAMPTZ，則為 DOUBLE PRECISION。

## TIMESTAMP 範例
<a name="r_EXTRACT_function-examples"></a>

下列範例會判斷特價時，售價是 10,000 USD 或更多的週次。此範例使用 TICKIT 資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
select salesid, extract(week from saletime) as weeknum
from sales 
where pricepaid > 9999 
order by 2;

salesid | weeknum
--------+---------
 159073 |       6
 160318 |       8
 161723 |      26
```

下列範例會從常值 timestamp 值傳回分鐘值。

```
select extract(minute from timestamp '2009-09-09 12:08:43');
            
date_part
-----------
8
```

下列範例會從常值 timestamp 值傳回毫秒值。

```
select extract(ms from timestamp '2009-09-09 12:08:43.101');
            
date_part
-----------
101
```

## TIMESTAMPTZ 範例
<a name="r_EXTRACT_function-examples-timestamptz"></a>

下列範例會從常值 timestamptz 傳回年份值。

```
select extract(year from timestamptz '1.12.1997 07:37:16.00 PST');
            
date_part
-----------
1997
```

## TIME 範例
<a name="r_EXTRACT_function-examples-time"></a>

下列範例資料表 TIME\$1TEST 有一個 TIME\$1VAL 欄 (類型為 TIME)，其中插入了三個值。

```
select time_val from time_test;
            
time_val
---------------------
20:00:00
00:00:00.5550
00:58:00
```

下列範例會擷取每個 time\$1val 的分鐘。

```
select extract(minute from time_val) as minutes from time_test;
            
minutes
-----------
         0
         0
         58
```

下列範例會擷取每個 time\$1val 中的小時數。

```
select extract(hour from time_val) as hours from time_test;
            
hours
-----------
         20
         0
         0
```

下列範例會從常值值擷取毫秒。

```
select extract(ms from time '18:25:33.123456');
            
 date_part
-----------
     123
```

## TIMETZ 範例
<a name="r_EXTRACT_function-examples-timetz"></a>

下列範例資料表 TIMETZ\$1TEST 有一個 TIMETZ\$1VAL 欄 (類型為 TIMETZ)，其中插入了三個值。

```
select timetz_val from timetz_test;
            
timetz_val
------------------
04:00:00+00
00:00:00.5550+00
05:58:00+00
```

下列範例會擷取每個 timetz\$1val 的小時。

```
select extract(hour from timetz_val) as hours from time_test;
            
hours
-----------
         4
         0
         5
```

下列範例會從常值值擷取毫秒。在處理擷取之前，常值不會轉換為 UTC。

```
select extract(ms from timetz '18:25:33.123456 EST');
            
 date_part
-----------
     123
```

下列範例會從常值 timetz 值傳回 UTC 的時區偏移小時。

```
select extract(timezone_hour from timetz '1.12.1997 07:37:16.00 PDT');
            
date_part
-----------
-7
```

## INTERVAL YEAR TO MONTH 和 INTERVAL DAY TO SECOND 的範例
<a name="r_EXTRACT_function-examples-interval"></a>

下列範例會從定義 36 個小時的 INTERVAL DAY TO SECOND 擷取天部分 `1`，也就是 1 天又 12 小時。

```
select EXTRACT('days' from INTERVAL '36 hours' DAY TO SECOND)
  
 date_part
------------------
 1
```

下列範例會從定義 15 個月的 YEAR TO MONTH 擷取月部分 `3`，也就是 1 年又 3 個月。

```
select EXTRACT('month' from INTERVAL '15 months' YEAR TO MONTH)
  
 date_part
------------------
 3
```

下列範例會從 30 個月擷取月部分 `6`，也就是 2 年又 6 個月。

```
select EXTRACT('month' from INTERVAL '30' MONTH)
   
 date_part
------------------
 6
```

下列範例會從 50 個小時擷取小時部分 `2`，也就是 2 天又 2 小時。

```
select EXTRACT('hours' from INTERVAL '50' HOUR)
  
 date_part
------------------
 2
```

下列範例會從 1 小時 11 分鐘 11.123 秒擷取分鐘部分 `11`。

```
select EXTRACT('minute' from INTERVAL '70 minutes 70.123 seconds' MINUTE TO SECOND)
  
 date_part
------------------
 11
```

下列範例會從 1 天 1 小時 1 分鐘 1.11 秒擷取秒部分 `1.11`。

```
select EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 date_part
------------------
 1.11
```

下列範例會擷取 INTERVAL 中的總時數。每個部分都會擷取並新增至總計。

```
select EXTRACT('days' from INTERVAL '50' HOUR) * 24 + EXTRACT('hours' from INTERVAL '50' HOUR)
 
 ?column?
------------------
 50
```

下列範例會擷取 INTERVAL 中的總秒數。每個部分都會擷取並新增至總計。

```
select EXTRACT('days' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 86400 + 
       EXTRACT('hours' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 3600 +
       EXTRACT('minutes' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND) * 60 + 
       EXTRACT('seconds' from INTERVAL '1 day 1:1:1.11' DAY TO SECOND)
  
 ?column?
------------------
 90061.11
```

# GETDATE 函數
<a name="r_GETDATE"></a>

GETDATE 傳回目前工作階段時區中的目前日期和時間 (預設為 UTC)。它會傳回目前陳述式的開始日期或時間，即使是在交易區塊中也一樣。

## 語法
<a name="r_GETDATE-synopsis"></a>

```
GETDATE()
```

括號是必要的。

## 傳回類型
<a name="r_GETDATE-return-type"></a>

TIMESTAMP

## 範例
<a name="r_GETDATE-examples"></a>

下列範例中會使用 GETDATE 函數來傳回目前日期的完整時間戳記。

```
select getdate();

timestamp
---------------------
2008-12-04 16:10:43
```

下列範例中會使用 TRUNC 函數中的 GETDATE 函數來傳回不含時間的目前日期。

```
select trunc(getdate());

trunc
------------
2008-12-04
```

# INTERVAL\$1CMP 函數
<a name="r_INTERVAL_CMP"></a>

INTERVAL\$1CMP 會比較兩個間隔並傳回 `1` (如果第一個間隔較大)、`-1` (如果第二個間隔較大)，且 `0` (如果間隔相等)。如需詳細資訊，請參閱[未使用限定詞語法的間隔常值範例](r_interval_literals.md)。

## 語法
<a name="r_INTERVAL_CMP-syntax"></a>

```
INTERVAL_CMP(interval1, interval2)
```

## 引數
<a name="r_INTERVAL_CMP-arguments"></a>

 *interval1*   
間隔常值。

 *interval2*   
間隔常值。

## 傳回類型
<a name="r_INTERVAL_CMP-return-type"></a>

INTEGER

## 範例
<a name="r_INTERVAL_CMP-examples"></a>

下列範例會比較 `3 days` 和 `1 year` 的值。

```
select interval_cmp('3 days','1 year');

interval_cmp
--------------
-1
```

此範例會將值 `7 days` 與 `1 week` 進行比較。

```
select interval_cmp('7 days','1 week');

interval_cmp
--------------
0
```

下列範例會比較 `1 year` 和 `3 days` 的值。

```
select interval_cmp('1 year','3 days');

interval_cmp
--------------
1
```

# LAST\$1DAY 函數
<a name="r_LAST_DAY"></a>

LAST\$1DAY 會傳回某月最後一天的日期，其中包含 *date*。不論 *date* 引數的資料類型為何，傳回類型一律是 DATE。

如需擷取特定日期部分的相關資訊，請參閱[DATE\$1TRUNC 函數](r_DATE_TRUNC.md)。

## 語法
<a name="r_LAST_DAY-synopsis"></a>

```
LAST_DAY( { date | timestamp } )
```

## 引數
<a name="r_LAST_DAY-arguments"></a>

*date* \$1 *timestamp*

資料類型 `DATE` 或 `TIMESTAMP` 的欄，或是隱含評估為 `DATE` 或 `TIMESTAMP` 類型的運算式。

## 傳回類型
<a name="r_LAST_DAY-return-type"></a>

DATE

## 範例
<a name="r_LAST_DAY-examples"></a>

下列範例傳回目前月份之最後一天的日期。

```
select last_day(sysdate);

  last_day
------------
 2014-01-31
```

下列範例傳回該月份之最後 7 天每天所售的門票數。SALETIME 欄中的值是時間戳記。

```
select datediff(day, saletime, last_day(saletime)) as "Days Remaining", sum(qtysold)
from sales
where datediff(day, saletime, last_day(saletime)) < 7
group by 1
order by 1;

days remaining |  sum
---------------+-------
             0 | 10140
             1 | 11187
             2 | 11515
             3 | 11217
             4 | 11446
             5 | 11708
             6 | 10988
(7 rows)
```

# MONTHS\$1BETWEEN 函數
<a name="r_MONTHS_BETWEEN_function"></a>

MONTHS\$1BETWEEN 可判斷兩個日期之間有幾個月。

如果第一個日期晚於第二個日期，結果為正值，否則結果為負值。

如果引數為 null，則結果為 NULL。

## 語法
<a name="r_MONTHS_BETWEEN_function-synopsis"></a>

```
MONTHS_BETWEEN( date1, date2 )
```

## 引數
<a name="r_MONTHS_BETWEEN_function-arguments"></a>

 *date1*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。

 *date2*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。

## 傳回類型
<a name="r_MONTHS_BETWEEN_function-return-type"></a>

FLOAT8

結果的整個數字部分是基於日期的年份和月份值的差異。結果的小數部分是透過日期的天和時間戳記值計算而得，且一個月假設為 31 天。

如果 *date1* 和 *date2* 都含有某個月份中的相同日期 (例如，1/15/14 和 2/15/14) 或某月的最後一天 (例如，8/31/14 和 9/30/14)，則結果是根據日期之年份和月份值的整個數值，而不論時間戳記部分符合的情況 (若有)。

## 範例
<a name="r_MONTHS_BETWEEN_function-examples"></a>

下列範例傳回 1/18/1969 和 3/18/1969 的月份。

```
select months_between('1969-01-18', '1969-03-18')
as months;

months
----------
-2
```

下列範例傳回 1/18/1969 和 1/18/1969 的月份。

```
select months_between('1969-01-18', '1969-01-18')
as months;

months
----------
0
```

 下列範例傳回事件之第一個和最後一個顯示間的月份。

```
select eventname, 
min(starttime) as first_show,
max(starttime) as last_show,
months_between(max(starttime),min(starttime)) as month_diff
from event 
group by eventname
order by eventname
limit 5;

eventname         first_show             last_show              month_diff
---------------------------------------------------------------------------
.38 Special       2008-01-21 19:30:00.0  2008-12-25 15:00:00.0  11.12
3 Doors Down      2008-01-03 15:00:00.0  2008-12-01 19:30:00.0  10.94
70s Soul Jam      2008-01-16 19:30:00.0  2008-12-07 14:00:00.0  10.7
A Bronx Tale      2008-01-21 19:00:00.0  2008-12-15 15:00:00.0  10.8
A Catered Affair  2008-01-08 19:30:00.0  2008-12-19 19:00:00.0  11.35
```

# NEXT\$1DAY 函數
<a name="r_NEXT_DAY"></a>

NEXT\$1DAY 會傳回在給定日期之後的指定那天之第一個執行個體的日期。

如果 *day* 值與給定日期是一週中的同一天，則會傳回該日的下一個出現時間。

## 語法
<a name="r_NEXT_DAY-synopsis"></a>

```
NEXT_DAY( { date | timestamp }, day )
```

## 引數
<a name="r_NEXT_DAY-arguments"></a>

 *date* \$1 *timestamp*  
資料類型 `DATE` 或 `TIMESTAMP` 的欄，或是隱含評估為 `DATE` 或 `TIMESTAMP` 類型的運算式。

 *天*   
包含任何天之名稱的字串。大寫並不重要。  
有效值如下。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_NEXT_DAY.html)

## 傳回類型
<a name="r_NEXT_DAY-return-type"></a>

DATE

## 範例
<a name="r_NEXT_DAY-example"></a>

下列範例請求會傳回在 8/20/2014 後第一個星期二的日期。

```
select next_day('2014-08-20','Tuesday');

next_day
-----------
2014-08-26
```

下列範例會傳回 2008 年 1 月 1 日之後第一個星期二的 5:54:44 的日期。

```
select listtime, next_day(listtime, 'Tue') from listing limit 1;

listtime            | next_day
--------------------+-----------
2008-01-01 05:54:44 | 2008-01-08
```

以下範例會取得第三季目標行銷日期。

```
select username, (firstname ||' '|| lastname) as name,
eventname, caldate, next_day (caldate, 'Monday') as marketing_target
from sales, date, users, event
where sales.buyerid = users.userid
and sales.eventid = event.eventid
and event.dateid = date.dateid
and date.qtr = 3
order by marketing_target, eventname, name;

username  |     name          |     eventname        |    caldate   |   marketing_target
----------+-------------------+----------------------+--------------+-------------------
MBO26QSG  |   Callum Atkinson | .38 Special          |  2008-07-06  |	2008-07-07
WCR50YIU  |   Erasmus Alvarez | A Doll's House       |  2008-07-03  |	2008-07-07
CKT70OIE  |   Hadassah Adkins | Ana Gabriel          |  2008-07-06  |	2008-07-07
VVG07OUO  |   Nathan Abbott   | Armando Manzanero    |  2008-07-04  |	2008-07-07
GEW77SII  |   Scarlet Avila   | August: Osage County |  2008-07-06  |	2008-07-07
ECR71CVS  |   Caryn Adkins    | Ben Folds            |  2008-07-03  |	2008-07-07
KUW82CYU  |   Kaden Aguilar   | Bette Midler         |  2008-07-01  |	2008-07-07
WZE78DJZ  |   Kay Avila       | Bette Midler         |  2008-07-01  |	2008-07-07
HXY04NVE  |   Dante Austin    | Britney Spears       |  2008-07-02  |	2008-07-07
URY81YWF  |   Wilma Anthony   | Britney Spears       |  2008-07-02  |	2008-07-07
```

# SYSDATE 函數
<a name="r_SYSDATE"></a>

SYSDATE 傳回目前工作階段時區中的目前日期和時間 (預設為 UTC)。

**注意**  
SYSDATE 傳回目前交易的日期和時間 (而不是目前陳述式的開始)。

## 語法
<a name="r_SYSDATE-synopsis"></a>

```
SYSDATE
```

此函數不需引數。

## 傳回類型
<a name="r_SYSDATE-return-type"></a>

TIMESTAMP

## 範例
<a name="r_SYSDATE-examples"></a>

下列範例中會使用 SYSDATE 函數來傳回目前日期的完整時間戳記。

```
select sysdate;

timestamp
----------------------------
2008-12-04 16:10:43.976353
```

下列範例中會使用 TRUNC 函數中的 SYSDATE 函數來傳回不含時間的目前日期。

```
select trunc(sysdate);

trunc
------------
2008-12-04
```

在發出查詢且當日期早於 120 天時，下列查詢會傳回落於該日期間之日期的特價資訊。

```
select salesid, pricepaid, trunc(saletime) as saletime, trunc(sysdate) as now
from sales
where saletime between trunc(sysdate)-120 and trunc(sysdate)
order by saletime asc;

 salesid | pricepaid |  saletime  |    now
---------+-----------+------------+------------
91535    |    670.00 | 2008-08-07 | 2008-12-05
91635    |    365.00 | 2008-08-07 | 2008-12-05
91901    |   1002.00 | 2008-08-07 | 2008-12-05
...
```

# TIMEOFDAY 函數
<a name="r_TIMEOFDAY_function"></a>

TIMEOFDAY 是特別的別名，會用來傳回週間日、日期和時間做為字串值。它會傳回目前陳述式的當日時間字串，即使是在交易區塊中也一樣。

## 語法
<a name="r_TIMEOFDAY_function-syntax"></a>

```
TIMEOFDAY()
```

## 傳回類型
<a name="r_TIMEOFDAY_function-return-type"></a>

VARCHAR

## 範例
<a name="r_TIMEOFDAY_function-examples"></a>

下列範例會透過使用 TIMEOFDAY 函數來傳回目前日期和時間。

```
select timeofday();

timeofday
------------
Thu Sep 19 22:53:50.333525 2013 UTC
```

# TIMESTAMP\$1CMP 函數
<a name="r_TIMESTAMP_CMP"></a>

比較兩個時間戳記的值並傳回整數。如果時間戳記相同，則函數會傳回 `0`。如果第一個時間戳記較大，則函數會傳回 `1`。如果第二個時間戳記較大，則函數會傳回 `-1`。

## 語法
<a name="r_TIMESTAMP_CMP-synopsis"></a>

```
TIMESTAMP_CMP(timestamp1, timestamp2)
```

## 引數
<a name="r_TIMESTAMP_CMP-arguments"></a>

 *timestamp1*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。

 *timestamp2*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMP_CMP-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMP_CMP-examples"></a>

下列範例會比較時間戳記，並顯示比較結果。

```
SELECT TIMESTAMP_CMP('2008-01-24 06:43:29', '2008-01-24 06:43:29'), TIMESTAMP_CMP('2008-01-24 06:43:29', '2008-02-18 02:36:48'), TIMESTAMP_CMP('2008-02-18 02:36:48', '2008-01-24 06:43:29');

timestamp_cmp  | timestamp_cmp | timestamp_cmp 
---------------+---------------+---------------
             0 |            -1 |             1
```

例如，下列範例會比較清單的 LISTTIME 與 SALETIME。所有清單的 TIMESTAMP\$1CMP 的值是 `-1`，因為特價的時間戳記是在清單的時間戳記後。

```
select listing.listid, listing.listtime,
sales.saletime, timestamp_cmp(listing.listtime, sales.saletime)
from listing, sales
where listing.listid=sales.listid
order by 1, 2, 3, 4
limit 10;

 listid |      listtime       |      saletime       | timestamp_cmp
--------+---------------------+---------------------+---------------
      1 | 2008-01-24 06:43:29 | 2008-02-18 02:36:48 |            -1
      4 | 2008-05-24 01:18:37 | 2008-06-06 05:00:16 |            -1
      5 | 2008-05-17 02:29:11 | 2008-06-06 08:26:17 |            -1
      5 | 2008-05-17 02:29:11 | 2008-06-09 08:38:52 |            -1
      6 | 2008-08-15 02:08:13 | 2008-08-31 09:17:02 |            -1
     10 | 2008-06-17 09:44:54 | 2008-06-26 12:56:06 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-10 02:12:36 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-16 11:59:24 |            -1
     10 | 2008-06-17 09:44:54 | 2008-07-22 02:23:17 |            -1
     12 | 2008-07-25 01:45:49 | 2008-08-04 03:06:36 |            -1
(10 rows)
```

此範例顯示若是在相同的時間戳記時，TIMESTAMP\$1CMP 會傳回 0：

```
select listid, timestamp_cmp(listtime, listtime)
from listing
order by 1 , 2
limit 10;

 listid | timestamp_cmp
--------+---------------
      1 |             0
      2 |             0
      3 |             0
      4 |             0
      5 |             0
      6 |             0
      7 |             0
      8 |             0
      9 |             0
     10 |             0
(10 rows)
```

# TIMESTAMP\$1CMP\$1DATE 函數
<a name="r_TIMESTAMP_CMP_DATE"></a>

TIMESTAMP\$1CMP\$1DATE 會比較時間戳記值和日期。如果時間戳記和日期值相同，則函數會傳回 `0`。如果時間戳記依時間順序較大，則函數會傳回 `1`。如果日期較大，則函數會傳回 `-1`。

## 語法
<a name="r_TIMESTAMP_CMP_DATE-syntax"></a>

```
TIMESTAMP_CMP_DATE(timestamp, date)
```

## 引數
<a name="r_TIMESTAMP_CMP_DATE-arguments"></a>

 *timestamp*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。

 *date*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMP_CMP_DATE-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMP_CMP_DATE-examples"></a>

例如，下列範例會比較日期 `2008-06-18` 與 LISTTIME。在此日期後所做的清單會傳回 `1`，在此日期前所做的清單會傳回 `-1`。LISTTIME 值是時間戳記。

```
select listid, listtime,
timestamp_cmp_date(listtime, '2008-06-18')
from listing
order by 1, 2, 3
limit 10;


 listid |      listtime       | timestamp_cmp_date
--------+---------------------+--------------------
      1 | 2008-01-24 06:43:29 |              -1
      2 | 2008-03-05 12:25:29 |              -1
      3 | 2008-11-01 07:35:33 |               1
      4 | 2008-05-24 01:18:37 |              -1
      5 | 2008-05-17 02:29:11 |              -1
      6 | 2008-08-15 02:08:13 |               1
      7 | 2008-11-15 09:38:15 |               1
      8 | 2008-11-09 05:07:30 |               1
      9 | 2008-09-09 08:03:36 |               1
     10 | 2008-06-17 09:44:54 |              -1
(10 rows)
```

# TIMESTAMP\$1CMP\$1TIMESTAMPTZ 函數
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ"></a>

TIMESTAMP\$1CMP\$1TIMESTAMPTZ 將時間戳記運算式值與含時區運算式的時間戳記比較。如果時間戳記和含時區值的時間戳記相同，則函數會傳回 `0`。如果時間戳記依時間順序較大，則函數會傳回 `1`。如果含時區的時間戳記較大，則函數會傳回 `–1`。

## 語法
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-syntax"></a>

```
TIMESTAMP_CMP_TIMESTAMPTZ(timestamp, timestamptz)
```

## 引數
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-arguments"></a>

 *timestamp*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。

 *timestamptz*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMP_CMP_TIMESTAMPTZ-examples"></a>

下列範例會比較時間戳記與含時區的時間戳記，並顯示比較結果。

```
SELECT TIMESTAMP_CMP_TIMESTAMPTZ('2008-01-24 06:43:29', '2008-01-24 06:43:29+00'), TIMESTAMP_CMP_TIMESTAMPTZ('2008-01-24 06:43:29', '2008-02-18 02:36:48+00'), TIMESTAMP_CMP_TIMESTAMPTZ('2008-02-18 02:36:48', '2008-01-24 06:43:29+00');

timestamp_cmp_timestamptz  | timestamp_cmp_timestamptz | timestamp_cmp_timestamptz 
---------------------------+---------------------------+--------------------------
             0             |            -1             |             1
```

# TIMESTAMPTZ\$1CMP 函數
<a name="r_TIMESTAMPTZ_CMP"></a>

TIMESTAMPTZ\$1CMP 會比較含時區值的兩個時間戳記值並傳回整數。如果時間戳記相同，則函數會傳回 `0`。如果第一個時間戳記依時間順序較大，則函數會傳回 `1`。如果第二個時間戳記較大，則函數會傳回 `–1`。

## 語法
<a name="r_TIMESTAMPTZ_CMP-synopsis"></a>

```
TIMESTAMPTZ_CMP(timestamptz1, timestamptz2)
```

## 引數
<a name="r_TIMESTAMPTZ_CMP-arguments"></a>

 *timestamptz1*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

 *timestamptz2*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMPTZ_CMP-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMPTZ_CMP-examples"></a>

下列範例會比較含時區的時間戳記，並顯示比較結果。

```
SELECT TIMESTAMPTZ_CMP('2008-01-24 06:43:29+00', '2008-01-24 06:43:29+00'), TIMESTAMPTZ_CMP('2008-01-24 06:43:29+00', '2008-02-18 02:36:48+00'), TIMESTAMPTZ_CMP('2008-02-18 02:36:48+00', '2008-01-24 06:43:29+00');

timestamptz_cmp  | timestamptz_cmp | timestamptz_cmp
-----------------+-----------------+----------------
        0        |       -1        |       1
```

# TIMESTAMPTZ\$1CMP\$1DATE 函數
<a name="r_TIMESTAMPTZ_CMP_DATE"></a>

TIMESTAMPTZ\$1CMP\$1DATE 會比較時間戳記值和日期的值。如果時間戳記和日期值相同，則函數會傳回 `0`。如果時間戳記依時間順序較大，則函數會傳回 `1`。如果日期較大，則函數會傳回 `–1`。

## 語法
<a name="r_TIMESTAMPTZ_CMP_DATE-syntax"></a>

```
TIMESTAMPTZ_CMP_DATE(timestamptz, date)
```

## 引數
<a name="r_TIMESTAMPTZ_CMP_DATE-arguments"></a>

 *timestamptz*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

 *date*   
`DATE` 資料類型的欄，或是隱含評估為 `DATE` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMPTZ_CMP_DATE-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMPTZ_CMP_DATE-examples"></a>

下列範例會比較做為含時區之時間戳記的 LISTTIME 與日期 `2008-06-18`。在此日期後所做的清單會傳回 `1`，在此日期前所做的清單會傳回 `-1`。

```
select listid, CAST(listtime as timestamptz) as tstz,
timestamp_cmp_date(tstz, '2008-06-18')
from listing
order by 1, 2, 3
limit 10;


 listid |          tstz          | timestamptz_cmp_date
--------+------------------------+----------------------
      1 | 2008-01-24 06:43:29+00 |              -1
      2 | 2008-03-05 12:25:29+00 |              -1
      3 | 2008-11-01 07:35:33+00 |               1
      4 | 2008-05-24 01:18:37+00 |              -1
      5 | 2008-05-17 02:29:11+00 |              -1
      6 | 2008-08-15 02:08:13+00 |               1
      7 | 2008-11-15 09:38:15+00 |               1
      8 | 2008-11-09 05:07:30+00 |               1
      9 | 2008-09-09 08:03:36+00 |               1
     10 | 2008-06-17 09:44:54+00 |              -1
(10 rows)
```

# TIMESTAMPTZ\$1CMP\$1TIMESTAMP 函數
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP"></a>

TIMESTAMPTZ\$1CMP\$1TIMESTAMP 將含時區運算式的時間戳記值與時間戳記運算式比較。如果含時區的時間戳記和時間戳記值相同，則函數會傳回 `0`。如果含時區的時間戳記依時間順序較大，則函數會傳回 `1`。如果時間戳記較大，則函數會傳回 `–1`。

## 語法
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-syntax"></a>

```
TIMESTAMPTZ_CMP_TIMESTAMP(timestamptz, timestamp)
```

## 引數
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-arguments"></a>

 *timestamptz*   
`TIMESTAMPTZ` 資料類型的欄，或是隱含評估為 `TIMESTAMPTZ` 類型的運算式。

 *timestamp*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。

## 傳回類型
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-return-type"></a>

INTEGER

## 範例
<a name="r_TIMESTAMPTZ_CMP_TIMESTAMP-examples"></a>

下列範例會將含時區的時間戳記與時間戳進行比較並顯示比較結果。

```
SELECT TIMESTAMPTZ_CMP_TIMESTAMP('2008-01-24 06:43:29+00', '2008-01-24 06:43:29'), TIMESTAMPTZ_CMP_TIMESTAMP('2008-01-24 06:43:29+00', '2008-02-18 02:36:48'), TIMESTAMPTZ_CMP_TIMESTAMP('2008-02-18 02:36:48+00', '2008-01-24 06:43:29');

timestamptz_cmp_timestamp  | timestamptz_cmp_timestamp | timestamptz_cmp_timestamp
---------------------------+---------------------------+---------------------------
              0            |            -1             |             1
```

# TIMEZONE 函數
<a name="r_TIMEZONE"></a>

TIMEZONE 傳回時間戳記，做為指定時區和時間戳記值。

如需有關如何設定時區的資訊和範例，請參閱 [timezone](r_timezone_config.md)。

如需有關如何轉換時區的資訊和範例，請參閱 [CONVERT\$1TIMEZONE](CONVERT_TIMEZONE.md)。

## 語法
<a name="r_TIMEZONE-syntax"></a>

```
TIMEZONE('timezone', { timestamp | timestamptz })
```

## 引數
<a name="r_TIMEZONE-arguments"></a>

*timezone*  
傳回值的時區。您可以將時區指定為時區名稱 (例如 **'Africa/Kampala'** 或 **'Singapore'**) 或做為時區縮寫 (例如 **'UTC'** 或 **'PDT'**)。若要查看受支援時區名稱的清單，請執行下列命令。  

```
select pg_timezone_names();
```
 若要查看受支援時區縮寫的清單，請執行下列命令。  

```
select pg_timezone_abbrevs();
```
請注意，Amazon Redshift 使用 [IANA 時區資料庫](https://www.iana.org/time-zones)作為時區規格的授權來源。如需詳細資訊和範例，請參閱 [時區使用須知](CONVERT_TIMEZONE.md#CONVERT_TIMEZONE-usage-notes)。

*timestamp* \$1 *timestamptz*  
造成 TIMESTAMP 或 TIMESTAMPTZ 類型的運算式會隱含地強制轉換為時間戳記或含時區的時間戳記。

## 傳回類型
<a name="r_TIMEZONE-return-type"></a>

與 TIMESTAMP 表達式搭配使用時的 TIMESTAMPTZ。

與 TIMESTAMPTZ 表達式搭配使用時的 TIMESTAMP。

## 範例
<a name="r_TIMEZONE-examples"></a>

以下使用 PST 時區的時間戳記 `2008-06-17 09:44:54` 傳回 UTC 時區的時間戳記。

```
SELECT TIMEZONE('PST', '2008-06-17 09:44:54');

timezone
-----------------------
2008-06-17 17:44:54+00
```

以下使用 UTC 時區的時間戳記 `2008-06-17 09:44:54+00` 傳回 PST 時區的時間戳記。

```
SELECT TIMEZONE('PST', timestamptz('2008-06-17 09:44:54+00'));

timezone
-----------------------
2008-06-17 01:44:54
```

# TO\$1TIMESTAMP 函數
<a name="r_TO_TIMESTAMP"></a>

TO\$1TIMESTAMP 會將 TIMESTAMP 字串轉換為 TIMESTAMPTZ。如需 Amazon Redshift 的其他日期和時間函數清單，請參閱[日期和時間函數](Date_functions_header.md)。

## 語法
<a name="r_TO_TIMESTAMP-syntax"></a>

```
to_timestamp(timestamp, format)
```

```
to_timestamp (timestamp, format, is_strict)
```

## 引數
<a name="r_TO_TIMESTAMP-arguments"></a>

*timestamp*  
字串，代表 *format* 指定的格式中的時間戳記值。如果此引數保留為空白，則時間戳記值預設為 `0001-01-01 00:00:00`。

*format*  
字串常值，定義 *timestamp* 值的格式。不支援包含時區 (**TZ**、**tz** 或 **OF**) 的格式做為輸出。請參閱 [日期時間格式字串](r_FORMAT_strings.md) 以取得有效的時間戳記格式。

*is\$1strict*  
選用的 Boolean 值，指定如果輸入時間戳值超出範圍是否回傳錯誤。當 *is\$1strict* 設定為 TRUE 時，如果有超出範圍的值，就會傳回錯誤。當 *is\$1strict* 設定為 FALSE (預設值) 時，會接受溢位值。

## 傳回類型
<a name="r_TO_TIMESTAMP-return-type"></a>

TIMESTAMPTZ

## 範例
<a name="r_TO_TIMESTAMP-examples"></a>

以下範例示範如何使用 TO\$1TIMESTAMP 函數，將 TIMESTAMP 字串轉換成 TIMESTAMPTZ。

```
select sysdate, to_timestamp(sysdate, 'YYYY-MM-DD HH24:MI:SS') as second;

timestamp                  | second
--------------------------   ----------------------
2021-04-05 19:27:53.281812 | 2021-04-05 19:27:53+00
```

可以傳遞日期的 TO\$1TIMESTAMP 部分。其餘日期部分設定為預設值。時間包含在輸出中：

```
SELECT TO_TIMESTAMP('2017','YYYY');

to_timestamp
--------------------------
2017-01-01 00:00:00+00
```

以下 SQL 陳述式將字串 '2011-12-18 24:38:15' 轉換為 TIMESTAMPTZ。結果是 TIMESTAMPTZ 落在第二天，因為小時數超過 24 小時：

```
SELECT TO_TIMESTAMP('2011-12-18 24:38:15', 'YYYY-MM-DD HH24:MI:SS');
         
to_timestamp
----------------------
2011-12-19 00:38:15+00
```

下列 SQL 陳述式會將字串「2011-12-18 24:38:15」轉換為 TIMESTAMPTZ。結果會產生錯誤，因為時間戳記中的時間值超過 24 小時：

```
SELECT TO_TIMESTAMP('2011-12-18 24:38:15', 'YYYY-MM-DD HH24:MI:SS', TRUE);
         
ERROR:  date/time field time value out of range: 24:38:15.0
```

# TRUNC 函數
<a name="r_TRUNC_date"></a>

截斷 `TIMESTAMP` 並傳回 `DATE`。

 這個函數也可以截斷數字。如需詳細資訊，請參閱[TRUNC 函數](r_TRUNC.md)。

## 語法
<a name="r_TRUNC_date-synopsis"></a>

```
TRUNC(timestamp)
```

## 引數
<a name="r_TRUNC_date-arguments"></a>

 *timestamp*   
`TIMESTAMP` 資料類型的欄，或是隱含評估為 `TIMESTAMP` 類型的運算式。  
若要傳回以 `00:00:00` 為時間的時間戳記值，請將函數結果轉換為 `TIMESTAMP`。

## 傳回類型
<a name="r_TRUNC_date-return-type"></a>

DATE

## 範例
<a name="r_TRUNC_date-examples"></a>

以下範例從 SYSDATE 函數的結果傳回日期部分 (其會傳回時間戳記)。

```
SELECT SYSDATE;

+----------------------------+
|         timestamp          |
+----------------------------+
| 2011-07-21 10:32:38.248109 |
+----------------------------+

SELECT TRUNC(SYSDATE);

+------------+
|   trunc    |
+------------+
| 2011-07-21 |
+------------+
```

下列範例會將 TRUNC 函數套用至 `TIMESTAMP` 欄。傳回類型為日期。

```
SELECT TRUNC(starttime) FROM event
ORDER BY eventid LIMIT 1;

+------------+
|   trunc    |
+------------+
| 2008-01-25 |
+------------+
```

下列範例會傳回時間為 `00:00:00` 的時間戳記值，方法是將 TRUNC 函數結果轉換 `TIMESTAMP`。

```
SELECT CAST((TRUNC(SYSDATE)) AS TIMESTAMP);

+---------------------+
|        trunc        |
+---------------------+
| 2011-07-21 00:00:00 |
+---------------------+
```

# 日期或時間戳記函數的日期部分
<a name="r_Dateparts_for_datetime_functions"></a>

下表識別日期部分和時間部分名稱和縮寫，系統接受它們做為以下函數的引數：
+ DATEADD 
+ DATEDIFF 
+ DATE\$1PART 
+ EXTRACT 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_Dateparts_for_datetime_functions.html)

## 含秒、毫秒和微秒結果的差異
<a name="r_Dateparts_for_datetime_functions-variations-in-results"></a>

當不同日期函數指定秒、毫秒或微秒做為日期部分時，減去查詢結果的差異：
+ EXTRACT 函數會傳回整數僅做為指定日期部分，而忽略更高或更低層級的日期部分。若指定的日期部分為秒，則毫秒或微秒不會包含在結果中。若指定的日期部分為豪秒，則秒或微秒不會包含在內。若指定的日期部分為微秒，則秒或豪秒不會包含在內。
+ DATE\$1PART 函數會傳回時間戳記的完整秒部分，不論指定的日期部分為何，視需要傳回十進位值或整數。

例如，比較以下查詢的結果：

```
create table seconds(micro timestamp);

insert into seconds values('2009-09-21 11:10:03.189717');

select extract(sec from micro) from seconds;
               
date_part
-----------
3
               
select date_part(sec, micro) from seconds;
   
pgdate_part
-------------
3.189717
```

## CENTURY、EPOCH、DECADE 和 MIL 備註
<a name="r_Dateparts_for_datetime_functions-century"></a>

CENTURY 或 CENTURIES   
Amazon Redshift 會解釋 CENTURY 來以年 *\$1\$1\$11* 開始並以年 `###0` 結束：  

```
select extract (century from timestamp '2000-12-16 12:21:13');
date_part
-----------
20

select extract (century from timestamp '2001-12-16 12:21:13');
date_part
-----------
21
```

EPOCH   
EPOCH 的 Amazon Redshift 實作相對於 1970-01-01 00:00:00.000000，與叢集所在的時區無關。您可能想要根據叢集所在的時區，彌補結果的時數差異。  
 下列範例示範以下方法：  

1.  建立名為 EVENT\$1EXAMPLE 且根據 EVENT 資料欄的資料表。此 CREATE AS 命令會使用 DATE\$1PART 函數來建立日期欄 (依預設，名為 PGDATE\$1PART)，以儲存每個事件的 epoch 值。

1.  從 PG\$1TABLE\$1DEF 選取 EVENT\$1EXAMPLE 的欄和資料類型。

1.  從 EVENT\$1EXAMPLE 資料表選取 EVENTNAME、STARTTIME 和 PGDATE\$1PART，來檢視不同的日期和時間格式。

1.  從 EVENT EXAMPLE 中按現狀選取 EVENTNAME 和 STARTTIME。使用 1 秒間隔將 PGDATE\$1PART 中的 epoch 值轉換為不含時區的時間戳記，並在名為 CONVERTED\$1TIMESTAMP 的欄位中傳回結果。

```
create table event_example
as select eventname, starttime, date_part(epoch, starttime) from event;

select "column", type from pg_table_def where tablename='event_example';

     column    |            type
---------------+-----------------------------
 eventname     | character varying(200)
 starttime     | timestamp without time zone
 pgdate_part   | double precision
(3 rows)
```

```
select eventname, starttime, pgdate_part from event_example;

   eventname          |      starttime      | pgdate_part
----------------------+---------------------+-------------
 Mamma Mia!           | 2008-01-01 20:00:00 |  1199217600
 Spring Awakening     | 2008-01-01 15:00:00 |  1199199600
 Nas                  | 2008-01-01 14:30:00 |  1199197800
 Hannah Montana       | 2008-01-01 19:30:00 |  1199215800
 K.D. Lang            | 2008-01-01 15:00:00 |  1199199600
 Spamalot             | 2008-01-02 20:00:00 |  1199304000
 Macbeth              | 2008-01-02 15:00:00 |  1199286000
 The Cherry Orchard   | 2008-01-02 14:30:00 |  1199284200
 Macbeth              | 2008-01-02 19:30:00 |  1199302200
 Demi Lovato          | 2008-01-02 19:30:00 |  1199302200

   
select eventname, 
starttime, 
timestamp with time zone 'epoch' + pgdate_part * interval '1 second' AS converted_timestamp 
from event_example;

       eventname      |      starttime      | converted_timestamp
----------------------+---------------------+---------------------
 Mamma Mia!           | 2008-01-01 20:00:00 | 2008-01-01 20:00:00
 Spring Awakening     | 2008-01-01 15:00:00 | 2008-01-01 15:00:00
 Nas                  | 2008-01-01 14:30:00 | 2008-01-01 14:30:00
 Hannah Montana       | 2008-01-01 19:30:00 | 2008-01-01 19:30:00
 K.D. Lang            | 2008-01-01 15:00:00 | 2008-01-01 15:00:00
 Spamalot             | 2008-01-02 20:00:00 | 2008-01-02 20:00:00
 Macbeth              | 2008-01-02 15:00:00 | 2008-01-02 15:00:00
 The Cherry Orchard   | 2008-01-02 14:30:00 | 2008-01-02 14:30:00
 Macbeth              | 2008-01-02 19:30:00 | 2008-01-02 19:30:00
 Demi Lovato          | 2008-01-02 19:30:00 | 2008-01-02 19:30:00
 ...
```

DECADE 或 DECADES   
Amazon Redshift 會根據一般日曆解釋 DECADE 或 DECADES DATEPART。例如，因為一般日曆是從年份 1 開始，第一個十年 (十年 1) 為 0001-01-01 至 0009-12-31，而第二個十年 (十年 2) 為 0010-01-01 到 0019-12-31。例如，十年 201 橫跨 2000-01-01 到 2009-12-31：  

```
select extract(decade from timestamp '1999-02-16 20:38:40');
date_part
-----------
200

select extract(decade from timestamp '2000-02-16 20:38:40');
date_part
-----------
201

select extract(decade from timestamp '2010-02-16 20:38:40');
date_part
-----------
202
```

MIL 或 MILS   
Amazon Redshift 會解釋 MIL 來以年 *\$1001* 的第一天開始並以年 `#000` 的最後一天結束：  

```
select extract (mil from timestamp '2000-12-16 12:21:13');
date_part
-----------
2

select extract (mil from timestamp '2001-12-16 12:21:13');
date_part
-----------
3
```

# 雜湊函數
<a name="hash-functions"></a>

**Topics**
+ [CHECKSUM 函數](r_CHECKSUM.md)
+ [farmFingerprint64 函數](r_FARMFINGERPRINT64.md)
+ [FUNC\$1SHA1 函數](FUNC_SHA1.md)
+ [FNV\$1HASH 函數](r_FNV_HASH.md)
+ [MD5 函數](r_MD5.md)
+ [SHA 函數](SHA.md)
+ [SHA1 函數](SHA1.md)
+ [SHA2 函數](SHA2.md)
+ [MURMUR3\$132\$1HASH](MURMUR3_32_HASH.md)

雜湊函數是一種數學函數，可將數字輸入值轉換成另一個值。

# CHECKSUM 函數
<a name="r_CHECKSUM"></a>

計算用來建立雜湊索引的檢查總和值。

## 語法
<a name="r_CHECKSUM-synopsis"></a>

```
CHECKSUM(expression)
```

## 引數
<a name="r_CHECKSUM-argument"></a>

 *表達式*   
輸入表達式必須為 VARCHAR、INTEGER 或 DECIMAL 資料類型。

## 傳回類型
<a name="r_CHECKSUM-return-type"></a>

CHECKSUM 函數傳回整數。

## 範例
<a name="r_CHECKSUM-example"></a>

下列範例計算 COMMISSION 欄的檢查總和值：

```
select checksum(commission)
from sales
order by salesid
limit 10;

checksum
----------
10920
1140
5250
2625
2310
5910
11820
2955
8865
975
(10 rows)
```

# farmFingerprint64 函數
<a name="r_FARMFINGERPRINT64"></a>

使用 `Fingerprint64` 函數計算輸入引數的 farmhash 值。

## 語法
<a name="r_FARMFINGERPRINT64-synopsis"></a>

```
farmFingerprint64(expression)
```

## 引數
<a name="r_FARMFINGERPRINT64-argument"></a>

 *表達式*   
輸入運算式必須是 `VARCHAR` 或 `VARBYTE` 資料類型。

## 傳回類型
<a name="r_FARMFINGERPRINT64-return-type"></a>

`farmFingerprint64` 函數會傳回 `BIGINT`。

## 範例
<a name="r_FARMFINGERPRINT64-example"></a>

下列範例會傳回輸入 `Amazon Redshift` 為 `VARCHAR` 資料類型之 的 `farmFingerprint64` 值。

```
SELECT farmFingerprint64('Amazon Redshift');
```

```
  
  farmfingerprint64
---------------------
 8085098817162212970
```

下列範例會傳回輸入 `Amazon Redshift` 為 `VARBYTE` 資料類型之 的 `farmFingerprint64` 值。

```
SELECT farmFingerprint64('Amazon Redshift'::varbyte);
```

```
  
  farmfingerprint64
---------------------
 8085098817162212970
```

# FUNC\$1SHA1 函數
<a name="FUNC_SHA1"></a>

SHA1 函數的同義詞。

請參閱 [SHA1 函數](SHA1.md)。

# FNV\$1HASH 函數
<a name="r_FNV_HASH"></a>

針對所有基本資料類型運算 64 位元 FNV-1a 非密碼編譯雜湊函數。

## 語法
<a name="r_FNV_HASH-synopsis"></a>

```
FNV_HASH(value [, seed])
```

## 引數
<a name="r_FNV_HASH-argument-arguments"></a>

 *value*  
要進行雜湊的輸入值。Amazon Redshift 使用值的二進位表示法來雜湊輸入值；例如：INTEGER 值會使用 4 位元組雜湊，BIGINT 值則會使用 8 位元組雜湊。此外，CHAR 和 VARCHAR 輸入不會忽略結尾空格。

 *seed*  
雜湊函數的 BIGINT 種子是選用的。如果沒有指定，Amazon Redshift 會使用預設 FNV 種子。這會允許組合多個欄位的雜湊，而無須進行轉換或串連。

## 傳回類型
<a name="r_FNV_HASH-return-type"></a>

BIGINT

## 範例
<a name="r_FNV_HASH-example"></a>

下列範例會分別傳回數字、字串 'Amazon Redshift' 及兩個值串連之後的 FNV 雜湊。

```
select fnv_hash(1);
        fnv_hash
----------------------
 -5968735742475085980
(1 row)
```

```
select fnv_hash('Amazon Redshift');
      fnv_hash
---------------------
 7783490368944507294
(1 row)
```

```
select fnv_hash('Amazon Redshift', fnv_hash(1));
       fnv_hash
----------------------
 -2202602717770968555
(1 row)
```

## 使用須知
<a name="r_FNV_HASH-usage-notes"></a>
+ 如要運算包含多個欄位資料表的雜湊，您可以運算第一個欄位的 FNV 雜湊，然後將其做為種子傳遞給第二個欄位的雜湊。然後，其會將第二個欄位的雜湊做為種子傳遞至第三個欄位的雜湊。

  以下範例會建立種子來雜湊包含多個欄位的資料表。

  ```
  select fnv_hash(column_3, fnv_hash(column_2, fnv_hash(column_1))) from sample_table;
  ```
+ 相同屬性可以用來運算字串串連的雜湊。

  ```
  select fnv_hash('abcd');
         fnv_hash
  ---------------------
   -281581062704388899
  (1 row)
  ```

  ```
  select fnv_hash('cd', fnv_hash('ab'));
        fnv_hash
  ---------------------
   -281581062704388899
  (1 row)
  ```
+ 雜湊函數會使用輸入的類型來判斷要雜湊的位元組數。如有必要，其會使用轉換來強制使用特定類型。

  以下範例使用不同的輸入類型來產生不同結果。

  ```
  select fnv_hash(1::smallint);
        fnv_hash
  --------------------
   589727492704079044
  (1 row)
  ```

  ```
  select fnv_hash(1);
         fnv_hash
  ----------------------
   -5968735742475085980
  (1 row)
  ```

  ```
  select fnv_hash(1::bigint);
         fnv_hash
  ----------------------
   -8517097267634966620
  (1 row)
  ```

# MD5 函數
<a name="r_MD5"></a>

使用 MD5 加密雜湊函數，將可變長度字串轉換為 32 的字元的字串，此為 128 位元檢查總和之十六進位值的文字表示法。

## 語法
<a name="r_MD5-syntax"></a>

```
MD5(string)
```

## 引數
<a name="r_MD5-arguments"></a>

 *string*   
可變長度字串。

## 傳回類型
<a name="r_MD5-return-type"></a>

MD5 函數傳回 32 個字元的字串，此為 128 位元檢查總和之十六進位值的文字表示法。

## 範例
<a name="r_MD5-examples"></a>

下列範例顯示字串 'Amazon Redshift' 的 128 位元值：

```
select md5('Amazon Redshift');
md5
----------------------------------
f7415e33f972c03abd4f3fed36748f7a
(1 row)
```

# SHA 函數
<a name="SHA"></a>

SHA1 函數的同義詞。

請參閱 [SHA1 函數](SHA1.md)。

# SHA1 函數
<a name="SHA1"></a>

SHA1 函數使用 SHA1 加密雜湊函數，將可變長度字串轉換為 40 之字元的字串，即 160 位元檢查總和之十六進位值的文字表示法。

## 語法
<a name="SHA1-syntax"></a>

SHA1 是 [SHA 函數](SHA.md) 及 [FUNC\$1SHA1 函數](FUNC_SHA1.md) 的同義詞。

```
SHA1(string)
```

## 引數
<a name="SHA1-arguments"></a>

 *string*   
可變長度字串。

## 傳回類型
<a name="SHA1-returm-type"></a>

SHA1 函數傳回 40 個字元的字串，此為 160 位元檢查總和之十六進位值的文字表示法。

## 範例
<a name="SHA1-example"></a>

下列範例傳回字詞 'Amazon Redshift' 的 160 位元值：

```
select sha1('Amazon Redshift');
```

# SHA2 函數
<a name="SHA2"></a>

SHA2 函數使用 SHA2 加密雜湊函數，將可變長度字串轉換為一個字元的字串。字串是檢查總和之十六進位值的文字表示法，具有指定的位元數。

## 語法
<a name="SHA2-syntax"></a>

```
SHA2(string, bits)
```

## 引數
<a name="SHA2-arguments"></a>

 *string*   
可變長度字串。

 *integer*   
雜湊函數中的位元數。有效值為 0 (與 256 相同)、224、256、384 和 512。

## 傳回類型
<a name="SHA2-returm-type"></a>

SHA2 函數傳回一個字元的字串，它是檢查總和之十六進位值的文字表示法，或是空字串 (如果位元數無效)。

## 範例
<a name="SHA2-example"></a>

下列範例傳回字詞 'Amazon Redshift' 的 256 位元值：

```
select sha2('Amazon Redshift', 256);
```

# MURMUR3\$132\$1HASH
<a name="MURMUR3_32_HASH"></a>

MURMUR3\$132\$1HASH 函數會計算所有常見資料類型 (包括數字和字串類型) 的 32 位元 Murmur3A 非加密雜湊。

## 語法
<a name="MURMUR3_32_HASH-syntax"></a>

```
MURMUR3_32_HASH(value [, seed])
```

## 引數
<a name="MURMUR3_32_HASH-arguments"></a>

 *value*   
要進行雜湊的輸入值。Amazon Redshift 雜湊輸入值的二進位表示。這種行為類似於 [FNV\$1HASH 函數](r_FNV_HASH.md)，但該值被轉換為 [Apache Iceberg 32 位元 Murmur3 雜湊規格](https://iceberg.apache.org/spec/#appendix-b-32-bit-hash-requirements)指定的二進位表示。

 *seed*   
雜湊函數的 INT 種子。此為選用引數。如果未指定，Amazon Redshift 將使用預設種子 0。這會允許組合多個欄位的雜湊，而無須進行轉換或串連。

## 傳回類型
<a name="MURMUR3_32_HASH-return-type"></a>

函數會傳回 INT。

## 範例
<a name="MURMUR3_32_HASH-example"></a>

下列範例會分別傳回數字、字串 'Amazon Redshift' 及兩個值串連之後的 Murmur3 雜湊。

```
select MURMUR3_32_HASH(1);
    
    MURMUR3_32_HASH
----------------------
 1392991556
(1 row)
```

```
select MURMUR3_32_HASH('Amazon Redshift');
    
    MURMUR3_32_HASH
----------------------
 -1563580564
(1 row)
```

```
select MURMUR3_32_HASH('Amazon Redshift', MURMUR3_32_HASH(1));
    
    MURMUR3_32_HASH
----------------------
 -1346554171
(1 row)
```

## 使用須知
<a name="MURMUR3_32_HASH-usage-notes"></a>

如要運算包含多個欄位資料表的雜湊，您可以運算第一個欄位的 Murmur3 雜湊，然後將其做為種子傳遞給第二個欄位的雜湊。然後，其會將第二個欄位的 Murmur3 雜湊做為種子傳遞至第三個欄位的雜湊。

以下範例會建立種子來雜湊包含多個欄位的資料表。

```
select MURMUR3_32_HASH(column_3, MURMUR3_32_HASH(column_2, MURMUR3_32_HASH(column_1))) from sample_table;
```

相同屬性可以用來運算字串串連的雜湊。

```
select MURMUR3_32_HASH('abcd');
   
   MURMUR3_32_HASH
---------------------
 1139631978
(1 row)
```

```
select MURMUR3_32_HASH('cd', MURMUR3_32_HASH('ab'));
   
   MURMUR3_32_HASH
---------------------
 1711522338
(1 row)
```

雜湊函數會使用輸入的類型來判斷要雜湊的位元組數。如有必要，其會使用轉換來強制使用特定類型。

以下範例使用不同的輸入類型來產生不同結果。

```
select MURMUR3_32_HASH(1, MURMUR3_32_HASH(1));
   
   MURMUR3_32_HASH
--------------------
 -1193428387
(1 row)
```

```
select MURMUR3_32_HASH(1);
   
   MURMUR3_32_HASH
----------------------
 1392991556
(1 row)
```

```
select MURMUR3_32_HASH(1, MURMUR3_32_HASH(2));
   
   MURMUR3_32_HASH
----------------------
 1179621905
(1 row)
```

# HyperLogLog 檔函數
<a name="hyperloglog-functions"></a>

接下來，您可以找到 Amazon Redshift 支援的 SQL HyperLogLog 函數的說明。

**Topics**
+ [HLL 函數](r_HLL_function.md)
+ [HLL\$1CREATE\$1SKETCH 函數](r_HLL_CREATE_SKETCH.md)
+ [HLL\$1CARDINALITY 函數](r_HLL_CARDINALITY.md)
+ [HLL\$1COMBINE 函數](r_HLL_COMBINE.md)
+ [HLL\$1COMBINE\$1SKETCHES 函數](r_HLL_COMBINE_SKETCHES.md)

# HLL 函數
<a name="r_HLL_function"></a>

HLL 函數傳回輸入運算式值的 HyperLogLog 基數。HLL 函數適用於除 HLLSKETCH 資料類型以外的任何資料類型。HLL 函數忽略 NULL 值。當資料表中沒有資料列或所有資料列都是 NULL 時，產生的基數為 0。

## 語法
<a name="r_HLL_function-synopsis"></a>

```
HLL (aggregate_expression)
```

## 引數
<a name="r_HLL_function-argument"></a>

 *aggregate\$1expression*   
提供要彙總之值的任何有效運算式，例如欄名。此函數支援除 HLLSKETCH、GEOMETRY、GEOGRAPHY 和 VARBYTE 以外的任何資料類型作為輸入。

## 傳回類型
<a name="r_HLL_function-return-type"></a>

HLL 函數會傳回 BIGINT 或 INT8 值。

## 範例
<a name="r_HLL_function-examples"></a>

下列範例會傳回資料表 `a_table` 中資料欄 `an_int` 的基數。

```
CREATE TABLE a_table(an_int INT);
INSERT INTO a_table VALUES (1), (2), (3), (4);

SELECT hll(an_int) AS cardinality FROM a_table;
cardinality
-------------
4
```

# HLL\$1CREATE\$1SKETCH 函數
<a name="r_HLL_CREATE_SKETCH"></a>

HLL\$1CREATE\$1SKETCH 函數傳回封裝輸入運算式值的 HLLSKETCH 資料類型。HLL\$1CREATE\$1SKETCH 函數適用於任何資料類型，並忽略 NULL 值。如果表格中沒有列或所有列都為 NULL，則產生的草圖沒有索引-值對，例如 `{"version":1,"logm":15,"sparse":{"indices":[],"values":[]}}`。

## 語法
<a name="r_HLL_CREATE_SKETCH-synopsis"></a>

```
HLL_CREATE_SKETCH (aggregate_expression)
```

## 引數
<a name="r_HLL_CREATE_SKETCH-argument"></a>

 *aggregate\$1expression*   
提供要彙總之值的任何有效運算式，例如欄名。NULL 值將被忽略。此函數支援除 HLLSKETCH、GEOMETRY、GEOGRAPHY 和 VARBYTE 以外的任何資料類型作為輸入。

## 傳回類型
<a name="r_HLL_CREATE_SKETCH-return-type"></a>

HLL\$1CREATE\$1SKETCH 函數會傳回 HLLSKETCH 值。

## 範例
<a name="r_HLL_CREATE_SKETCH-examples"></a>

下列範例會傳回資料表 `a_table` 中資料欄 `an_int` 的 HLLSKETCH 類型。JSON 物件用於匯入、匯出或列印草圖時表示稀疏的 HyperLogLog 草圖。字串表示 (Base64 格式) 用於表示密集的 HyperLogLog 草圖。

```
CREATE TABLE a_table(an_int INT);
INSERT INTO a_table VALUES (1), (2), (3), (4);

SELECT hll_create_sketch(an_int) AS sketch FROM a_table;
sketch
-------------------------------------------------------------------------------------------------------
{"version":1,"logm":15,"sparse":{"indices":[20812342,20850007,22362299,47158030],"values":[1,2,1,1]}}
(1 row)
```

# HLL\$1CARDINALITY 函數
<a name="r_HLL_CARDINALITY"></a>

HLL\$1CARDINALITY 函數會傳回輸入 HLLSKETCH 資料類型的基數。

## 語法
<a name="r_HLL_CARDINALITY-synopsis"></a>

```
HLL_CARDINALITY (hllsketch_expression)
```

## 引數
<a name="r_HLL_CARDINALITY-argument"></a>

 *hllsketch\$1expression*   
任何演算為 HLLSKETCH 類型的有效運算式，例如欄名稱。輸入值是 HLLSKETCH 資料類型。

## 傳回類型
<a name="r_HLL_CARDINALITY-return-type"></a>

HLL\$1CARDINALITY 函數會傳回 BIGINT 或 INT8 值。

## 範例
<a name="r_HLL_CARDINALITY-examples"></a>

下列範例會傳回資料表 `hll_table` 中資料欄 `sketch` 的基數。

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

SELECT hll_cardinality(sketch) AS cardinality FROM hll_table;
cardinality
-------------
6
4
(2 rows)
```

# HLL\$1COMBINE 函數
<a name="r_HLL_COMBINE"></a>

HLL\$1COMBINE 彙總函數會傳回合併所有輸入 HLLSKETCH 值的 HLLSKETCH 資料類型。

兩個或多個 HyperLogLog 草圖的組合是一個新的 HLLSKETCH，它封裝有關每個輸入草圖所代表的不同值的聯集的資訊。在合併草圖之後，Amazon Redshift 會擷取兩個或多個資料集的聯集基數。如需如何合併多個草圖的相關資訊，請參閱[範例：從合併多個草圖中傳回 HyperLogLog 草圖](r_HLL-examples.md#hll-examples-multiple-sketches)。

## 語法
<a name="r_HLL_COMBINE-synopsis"></a>

```
HLL_COMBINE (hllsketch_expression)
```

## 引數
<a name="r_HLL_COMBINE-argument"></a>

 *hllsketch\$1expression*   
任何演算為 HLLSKETCH 類型的有效運算式，例如欄名稱。輸入值是 HLLSKETCH 資料類型。

## 傳回類型
<a name="r_HLL_COMBINE-return-type"></a>

HLL\$1COMBINE 函數會傳回 HLLSKETCH 類型。

## 範例
<a name="r_HLL_COMBINE-examples"></a>

下列範例會傳回資料表 `hll_table` 中的合併 HLLSKETCH 值。

```
CREATE TABLE a_table(an_int INT, b_int INT);
INSERT INTO a_table VALUES (1,1), (2,1), (3,1), (4,1), (1,2), (2,2), (3,2), (4,2), (5,2), (6,2);

CREATE TABLE hll_table (sketch HLLSKETCH);
INSERT INTO hll_table select hll_create_sketch(an_int) from a_table group by b_int;

SELECT hll_combine(sketch) AS sketches FROM hll_table;
sketches
----------------------------------------------------------------------------------------------------------------------------
{"version":1,"logm":15,"sparse":{"indices":[20812342,20850007,22362299,40314817,42650774,47158030],"values":[1,2,1,3,2,1]}}
(1 row)
```

# HLL\$1COMBINE\$1SKETCHES 函數
<a name="r_HLL_COMBINE_SKETCHES"></a>

HLL\$1COMBINE\$1SKETCHES 是純量函數，用作輸入兩個 HLLSKETCH 值，並將它們合併為一個 HLLSKETCH。

兩個或多個 HyperLogLog 草圖的組合是一個新的 HLLSKETCH，它封裝有關每個輸入草圖所代表的不同值的聯集的資訊。

## 語法
<a name="r_HLL_COMBINE_SKETCHES-synopsis"></a>

```
HLL_COMBINE_SKETCHES (hllsketch_expression1, hllsketch_expression2)
```

## 引數
<a name="r_HLL_COMBINE_SKETCHES-argument"></a>

 *hllsketch\$1expression1* 和 *hllsketch\$1expression2*   
任何演算為 HLLSKETCH 類型的有效運算式，例如欄名稱。

## 傳回類型
<a name="r_HLL_COMBINE_SKETCHES-return-type"></a>

HLL\$1COMBINE\$1SKETCHES 函數會傳回 HLLSKETCH 類型。

## 範例
<a name="r_HLL_COMBINE_SKETCHES-examples"></a>

下列範例會傳回資料表 `hll_table` 中的合併 HLLSKETCH 值。

```
WITH tbl1(x, y)
     AS (SELECT Hll_create_sketch(1),
                Hll_create_sketch(2)
         UNION ALL
         SELECT Hll_create_sketch(3),
                Hll_create_sketch(4)
         UNION ALL
         SELECT Hll_create_sketch(5),
                Hll_create_sketch(6)
         UNION ALL
         SELECT Hll_create_sketch(7),
                Hll_create_sketch(8)),
     tbl2(x, y)
     AS (SELECT Hll_create_sketch(9),
                Hll_create_sketch(10)
         UNION ALL
         SELECT Hll_create_sketch(11),
                Hll_create_sketch(12)
         UNION ALL
         SELECT Hll_create_sketch(13),
                Hll_create_sketch(14)
         UNION ALL
         SELECT Hll_create_sketch(15),
                Hll_create_sketch(16)
         UNION ALL
         SELECT Hll_create_sketch(NULL),
                Hll_create_sketch(NULL)),
     tbl3(x, y)
     AS (SELECT *
         FROM   tbl1
         UNION ALL
         SELECT *
         FROM   tbl2)
SELECT Hll_combine_sketches(x, y)
FROM   tbl3;
```

# JSON 函數
<a name="json-functions"></a>

**Topics**
+ [JSON\$1PARSE 函數](JSON_PARSE.md)
+ [CAN\$1JSON\$1PARSE 函數](CAN_JSON_PARSE.md)
+ [JSON\$1SERIALIZE 函數](JSON_SERIALIZE.md)
+ [JSON\$1SERIALIZE\$1TO\$1VARBYTE 函數](JSON_SERIALIZE_TO_VARBYTE.md)
+ [文字型 JSON 函式](text-json-functions.md)

**注意**  
建議您使用下列函式來搭配 JSON 使用：  
 [JSON\$1PARSE 函數](JSON_PARSE.md) 
 [CAN\$1JSON\$1PARSE 函數](CAN_JSON_PARSE.md) 
 [JSON\$1SERIALIZE 函數](JSON_SERIALIZE.md) 
 [JSON\$1SERIALIZE\$1TO\$1VARBYTE 函數](JSON_SERIALIZE_TO_VARBYTE.md) 
使用 JSON\$1PARSE 時，您只需在擷取時將 JSON 文字轉換為 SUPER 類型值一次，之後就能操作 SUPER 值。Amazon Redshift 剖析 SUPER 值的效率比剖析 VARCHAR 更高，因為後者是文字型 JSON 函式的輸出。如需使用 SUPER 資料類型的詳細資訊，請前往 [Amazon Redshift 中的半結構化資料](super-overview.md)。

當您需要儲存相當小的一組金鑰值對時，您可以用 JSON 格式儲存資料以節省空間。因為 JSON 字串可儲存於單一欄，採用 JSON 可能比以資料表格式儲存資料更有效率。例如，假設您有一個稀疏資料表，且您需要有許多欄才能完整代表所有可能的屬性，但任何給定列或任何給定欄的大部分欄值都是 NULL。如果採用 JSON 來儲存，您可以在單一 JSON 字串中以金鑰:值對來儲存列的資料，避免產生稀疏填入的資料表欄。

此外，您可以在 JSON 結構描述變更時，輕鬆修改 JSON 字串來儲存其他鍵:值對，而不需要在資料表中新增欄。

建議少用 JSON。JSON 不適合儲存較大的資料集，因為 JSON 將相異的資料儲存在單一欄，未使用 Amazon Redshift 的欄儲存架構。雖然 Amazon Redshift 在 CHAR 和 VARCHAR 欄上支援 JSON 函數，但我們建議您使用 SUPER 來處理 JSON 序列化格式的資料。SUPER 使用可以有效地查詢階層式資料的剖析後無結構描述表示。如需 SUPER 資料類型的相關資訊，請參閱 [Amazon Redshift 中的半結構化資料](super-overview.md)。

JSON 使用 UTF-8 編碼的文字字串，所以 JSON 字串可儲存為 CHAR 或 VARCHAR 資料類型。

JSON 字串必須是符合下列規則的適當格式化 JSON：
+ 根層級 JSON 可以是 JSON 物件或 JSON 陣列。JSON 物件是一組未排序的逗號分隔金鑰:值對 (以大括號括住)。

  例如 `{"one":1, "two":2} `
+ JSON 陣列是一組已排序的逗號分隔值 (以方括號括住)。

  以下是範例：`["first", {"one":1}, "second", 3, null] `
+ JSON 陣列採用以零開始的索引；陣列的第一個元素在位置 0。在 JSON 金鑰:值對中，金鑰是雙引號括住的字串。
+ JSON 值可以是下列任何值：
  + JSON 物件 
  + 陣列 
  + string
    + 使用雙引號表示
  + number
    + 包含整數、小數和浮點數
  + boolean
  + null 
+ 空物件和空陣列是有效的 JSON 值。
+ JSON 欄位區分大小寫。
+ 忽略 JSON 結構元素之間的空格 (例如 `{ }, [ ]`)。

Amazon Redshift JSON 函數和 Amazon Redshift COPY 命令使用相同方法來處理 JSON 格式的資料。如需使用 JSON 的相關資訊，請參閱[從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)

# JSON\$1PARSE 函數
<a name="JSON_PARSE"></a>

JSON\$1PARSE 函數會剖析 JSON 格式的資料，並將其轉換為 `SUPER` 表示。

若要使用 INSERT 或 UPDATE 命令擷取到 `SUPER` 資料類型，請使用 JSON\$1PARSE 函數。當您使用 JSON\$1PARSE() 將 JSON 字串剖析為 `SUPER` 值時，適用某些限制。如需其他資訊，請參閱 [SUPER 的剖析選項](super-configurations.md#parsing-options-super)。

## 語法
<a name="JSON_PARSE-synopsis"></a>

```
JSON_PARSE( {json_string | binary_value} )
```

## 引數
<a name="JSON_PARSE-arguments"></a>

 *json\$1string*  
以 `VARBYTE` 或 `VARCHAR` 類型傳回序列化 JSON 的運算式。

 *binary\$1value*  
VARBYTE 類型二進位值。

## 傳回類型
<a name="JSON_PARSE-return"></a>

`SUPER`

## 範例
<a name="JSON_PARSE-examples"></a>

若要將 JSON 陣列 `[10001,10002,"abc"]` 轉換成 `SUPER` 資料類型，請使用下列範例。

```
SELECT JSON_PARSE('[10001,10002,"abc"]');

+---------------------+
|     json_parse      |
+---------------------+
| [10001,10002,"abc"] |
+---------------------+
```

若要確定函數將 JSON 陣列轉換成 `SUPER` 資料類型，請使用下列範例。如需詳細資訊，請參閱[JSON\$1TYPEOF 函數](r_json_typeof.md)

```
SELECT JSON_TYPEOF(JSON_PARSE('[10001,10002,"abc"]'));

+-------------+
| json_typeof |
+-------------+
| array       |
+-------------+
```

# CAN\$1JSON\$1PARSE 函數
<a name="CAN_JSON_PARSE"></a>

CAN\$1JSON\$1PARSE 函數會剖析 JSON 格式的資料，如果可以使用 JSON\$1PARSE 函數將結果轉換為 `SUPER` 值，則傳回 `true`。

## 語法
<a name="CAN_JSON_PARSE-synopsis"></a>

```
CAN_JSON_PARSE( {json_string | binary_value} )
```

## 引數
<a name="CAN_JSON_PARSE-arguments"></a>

 *json\$1string*  
以 `VARCHAR` 形式傳回序列化 JSON 的表達式。

 *binary\$1value*  
VARBYTE 類型二進位值。

## 傳回類型
<a name="CAN_JSON_PARSE-return"></a>

`BOOLEAN`

## 使用須知
<a name="CAN_JSON_PARSE-usage-notes"></a>
+ CAN\$1JSON\$1PARSE 會針對空字串傳回 false。當輸入引數為 null 時，它會傳回 NULL。

## 範例
<a name="CAN_JSON_PARSE-examples"></a>

 下列範例顯示使用 CASE 條件在格式正確的 JSON 陣列上執行的 CAN\$1JSON\$1PARSE。它傳回 true，因此 Amazon Redshift 會對範例值執行 JSON\$1PARSE 函式。

```
SELECT CASE 
            WHEN CAN_JSON_PARSE('[10001,10002,"abc"]')
            THEN JSON_PARSE('[10001,10002,"abc"]')
        END;

 case
---------------------
'[10001,10002,"abc"]'
```

 下列範例顯示使用 CASE 條件對非 JSON 格式的值執行的 CAN\$1JSON\$1PARSE。它傳回 false，因此 Amazon Redshift 會改為傳回 CASE 條件的 ELSE 子句中的區段。

```
SELECT CASE 
            WHEN CAN_JSON_PARSE('This is a string.')
            THEN JSON_PARSE('This is a string.')
            ELSE 'This is not JSON.'
        END;

 case
---------------------
"This is not JSON."
```

# JSON\$1SERIALIZE 函數
<a name="JSON_SERIALIZE"></a>

JSON\$1SERIALIZE 函數會根據 RFC 8259，將 `SUPER` 運算式序列化為文字 JSON 表示法。如需該 RFC 的相關資訊，請參閱 [JavaScript Object 物件標記法 (JSON) 資料交換格式](https://tools.ietf.org/html/rfc8259)。

`SUPER` 大小限制與區塊限制大致相同，且 `VARCHAR` 限制小於 `SUPER` 大小限制。因此，當 JSON 格式超過系統的 VARCHAR 限制時，JSON\$1SERIALIZE 函數會傳回錯誤。若要檢查 `SUPER` 運算式的大小，請參閱 [JSON\$1SIZE](r_json_size.md) 函數。

## 語法
<a name="JSON_SERIALIZE-synopsis"></a>

```
JSON_SERIALIZE(super_expression)
```

## 引數
<a name="JSON_SERIALIZE-arguments"></a>

 *super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="JSON_SERIALIZE-return"></a>

`VARCHAR`

**注意**  
傳回的 VARCHAR 值一律是非 null 的 JSON 字串。如果 *super\$1expression* 為 NULL，JSON\$1SERIALIZE 會傳回 JSON 字串 `'null'`。

## 範例
<a name="JSON_SERIALIZE-examples"></a>

若要將 `SUPER` 值序列化為字串，請使用下列範例。

```
SELECT JSON_SERIALIZE(JSON_PARSE('[10001,10002,"abc"]'));
   
+---------------------+
|   json_serialize    |
+---------------------+
| [10001,10002,"abc"] |
+---------------------+
```

# JSON\$1SERIALIZE\$1TO\$1VARBYTE 函數
<a name="JSON_SERIALIZE_TO_VARBYTE"></a>

JSON\$1SERIALIZE\$1TO\$1VARBYTE 函數會將 `SUPER` 值轉換為類似於 JSON\$1SERIALIZE()的 JSON 字串，但改為儲存在 `VARBYTE` 值中。

## 語法
<a name="JSON_SERIALIZE_TO_VARBYTE-synopsis"></a>

```
JSON_SERIALIZE_TO_VARBYTE(super_expression)
```

## 引數
<a name="JSON_SERIALIZE_TO_VARBYTE-arguments"></a>

 *super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="JSON_SERIALIZE_TO_VARBYTE-return"></a>

`VARBYTE`

## 範例
<a name="JSON_SERIALIZE_TO_VARBYTE-examples"></a>

若要序列化 `SUPER` 值，並以 `VARBYTE` 格式傳回結果，請使用下列範例。

```
SELECT JSON_SERIALIZE_TO_VARBYTE(JSON_PARSE('[10001,10002,"abc"]'));

+----------------------------------------+
|       json_serialize_to_varbyte        |
+----------------------------------------+
| 5b31303030312c31303030322c22616263225d |
+----------------------------------------+
```

若要序列化 `SUPER` 值並將結果轉換為 `VARCHAR` 格式，請使用下列範例。如需詳細資訊，請參閱[CAST 函數](r_CAST_function.md)。

```
SELECT CAST((JSON_SERIALIZE_TO_VARBYTE(JSON_PARSE('[10001,10002,"abc"]'))) AS VARCHAR);

+---------------------------+
| json_serialize_to_varbyte |
+---------------------------+
| [10001,10002,"abc"]       |
+---------------------------+
```

# 文字型 JSON 函式
<a name="text-json-functions"></a>

本節中的函式會將 JSON 值剖析為 VARCHAR。對於剖析 JSON，我們建議您改用下列函式將 JSON 值剖析為 SUPER。Amazon Redshift 剖析 SUPER 值的效率比剖析 VARCHAR 更高。
+  [JSON\$1PARSE 函數](JSON_PARSE.md) 
+  [CAN\$1JSON\$1PARSE 函數](CAN_JSON_PARSE.md) 
+  [JSON\$1SERIALIZE 函數](JSON_SERIALIZE.md) 
+  [JSON\$1SERIALIZE\$1TO\$1VARBYTE 函數](JSON_SERIALIZE_TO_VARBYTE.md) 

**Topics**
+ [IS\$1VALID\$1JSON 函數](IS_VALID_JSON.md)
+ [IS\$1VALID\$1JSON\$1ARRAY 函數](IS_VALID_JSON_ARRAY.md)
+ [JSON\$1ARRAY\$1LENGTH 函數](JSON_ARRAY_LENGTH.md)
+ [JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 函數](JSON_EXTRACT_ARRAY_ELEMENT_TEXT.md)
+ [JSON\$1EXTRACT\$1PATH\$1TEXT 函數](JSON_EXTRACT_PATH_TEXT.md)

# IS\$1VALID\$1JSON 函數
<a name="IS_VALID_JSON"></a>

**注意**  
CAN\$1JSON\$1PARSE 及其相關聯的函式會將 JSON 值剖析為 SUPER，Amazon Redshift 會剖析這類值的效率比剖析 VARCHAR 更高。  
 建議您使用 [CAN\$1JSON\$1PARSE 函數](CAN_JSON_PARSE.md) 驗證 JSON 字串，而不要使用 IS\$1VALID\$1JSON。

IS\$1VALID\$1JSON 函數會驗證 JSON 字串。如果字串是格式正確的 JSON，此函數會傳回布林值 `true`，如果字串的格式不正確，則傳回 `false`。若要驗證 JSON 陣列，請使用 [IS\$1VALID\$1JSON\$1ARRAY 函數](IS_VALID_JSON_ARRAY.md)

如需詳細資訊，請參閱[JSON 函數](json-functions.md)。

## 語法
<a name="IS_VALID_JSON-synopsis"></a>

```
IS_VALID_JSON('json_string')
```

## 引數
<a name="IS_VALID_JSON-arguments"></a>

 *json\$1string*  
評估為 JSON 字串的字串或表達式。

## 傳回類型
<a name="IS_VALID_JSON-return"></a>

`BOOLEAN`

## 範例
<a name="IS_VALID_JSON-examples"></a>

若要建立資料表並插入 JSON 字串來測試，請使用下列範例。

```
CREATE TABLE test_json(id int IDENTITY(0,1), json_strings VARCHAR);

-- Insert valid JSON strings --
INSERT INTO test_json(json_strings) VALUES
('{"a":2}'), 
('{"a":{"b":{"c":1}}}'), 
('{"a": [1,2,"b"]}');

-- Insert invalid JSON strings --
INSERT INTO test_json(json_strings) VALUES
('{{}}'), 
('{1:"a"}'), 
('[1,2,3]');
```

若要驗證上述範例中的字串，請使用下列範例。

```
SELECT id, json_strings, IS_VALID_JSON(json_strings) 
FROM test_json
ORDER BY id;

+----+---------------------+---------------+
| id |    json_strings     | is_valid_json |
+----+---------------------+---------------+
|  0 | {"a":2}             | true          |
|  4 | {"a":{"b":{"c":1}}} | true          |
|  8 | {"a": [1,2,"b"]}    | true          |
| 12 | {{}}                | false         |
| 16 | {1:"a"}             | false         |
| 20 | [1,2,3]             | false         |
+----+---------------------+---------------+
```

# IS\$1VALID\$1JSON\$1ARRAY 函數
<a name="IS_VALID_JSON_ARRAY"></a>

**注意**  
JSON\$1PARSE 及其相關聯的函式會將 JSON 值剖析為 SUPER，Amazon Redshift 會剖析這類值的效率比剖析 VARCHAR 更高。  
 建議您使用 [JSON\$1PARSE 函數](JSON_PARSE.md) 剖析 JSON 字串來取得 SUPER 值，而不要使用 IS\$1VALID\$1JSON\$1ARRAY。然後使用 [IS\$1ARRAY 函數](r_is_array.md) 函式確認陣列的格式正確。

IS\$1VALID\$1JSON\$1ARRAY 函數可驗證 JSON 陣列。如果陣列是格式正確的 JSON，此函數會傳回布林值 `true`，如果陣列的格式不正確，則傳回 `false`。若要驗證 JSON 字串，請使用 [IS\$1VALID\$1JSON 函數](IS_VALID_JSON.md)

如需詳細資訊，請參閱[JSON 函數](json-functions.md)。

## 語法
<a name="IS_VALID_JSON_ARRAY-synopsis"></a>

```
IS_VALID_JSON_ARRAY('json_array') 
```

## 引數
<a name="IS_VALID_JSON_ARRAY-arguments"></a>

 *json\$1array*  
評估為 JSON 陣列的字串或表達式。

## 傳回類型
<a name="IS_VALID_JSON_ARRAY-return"></a>

`BOOLEAN`

## 範例
<a name="IS_VALID_JSON_ARRAY-examples"></a>

若要建立資料表並插入 JSON 字串來測試，請使用下列範例。

```
CREATE TABLE test_json_arrays(id int IDENTITY(0,1), json_arrays VARCHAR);

-- Insert valid JSON array strings --
INSERT INTO test_json_arrays(json_arrays) 
VALUES('[]'), 
('["a","b"]'), 
('["a",["b",1,["c",2,3,null]]]');

-- Insert invalid JSON array strings --
INSERT INTO test_json_arrays(json_arrays) 
VALUES('{"a":1}'),
('a'),
('[1,2,]');
```

若要驗證上述範例中的字串，請使用下列範例。

```
SELECT json_arrays, IS_VALID_JSON_ARRAY(json_arrays) 
FROM test_json_arrays ORDER BY id;

+------------------------------+---------------------+
|         json_arrays          | is_valid_json_array |
+------------------------------+---------------------+
| []                           | true                |
| ["a","b"]                    | true                |
| ["a",["b",1,["c",2,3,null]]] | true                |
| {"a":1}                      | false               |
| a                            | false               |
| [1,2,]                       | false               |
+------------------------------+---------------------+
```

# JSON\$1ARRAY\$1LENGTH 函數
<a name="JSON_ARRAY_LENGTH"></a>

**注意**  
JSON\$1PARSE 及其相關聯的函式會將 JSON 值剖析為 SUPER，Amazon Redshift 會剖析這類值的效率比剖析 VARCHAR 更高。  
 建議您使用 [JSON\$1PARSE 函數](JSON_PARSE.md) 剖析 JSON 字串來取得 SUPER 值，而不要使用 JSON\$1ARRAY\$1LENGTH。然後使用 [GET\$1ARRAY\$1LENGTH 函數](get_array_length.md) 取得陣列的長度。

JSON\$1ARRAY\$1LENGTH 函數傳回 JSON 字串外圍陣列中的元素個數。如果 *null\$1if\$1invalid* 引數設為 `true`，且 JSON 字串無效，此函數會傳回 `NULL`，而非傳回錯誤。

如需詳細資訊，請參閱[JSON 函數](json-functions.md)。

## 語法
<a name="JSON_ARRAY_LENGTH-synopsis"></a>

```
JSON_ARRAY_LENGTH('json_array' [, null_if_invalid ] ) 
```

## 引數
<a name="JSON_ARRAY_LENGTH-arguments"></a>

 *json\$1array*  
格式正確的 JSON 陣列。

 *null\$1if\$1invalid*  
(選用) `BOOLEAN` 值，指定輸入 JSON 字串無效時是否傳回 `NULL`，而非傳回錯誤。若要在 JSON 無效時傳回 `NULL`，請指定 `true` (`t`)。若要在 JSON 無效時傳回錯誤，請指定 `false` (`f`)。預設值為 `false`。

## 傳回類型
<a name="JSON_ARRAY_LENGTH-return"></a>

`INTEGER`

## 範例
<a name="JSON_ARRAY_LENGTH-examples"></a>

若要傳回陣列中的元素個數，請使用下列範例。

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14]'); 

+-------------------+
| json_array_length |
+-------------------+
|                 5 |
+-------------------+
```

若要因 JSON 無效而傳回錯誤，請使用下列範例。

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14');
 
ERROR: invalid json array object [11,12,13,{"f1":21,"f2":[25,26]},14
```

若要將 *null\$1if\$1invalid* 設為 *true*，以便在 JSON 無效時，陳述式傳回 `NULL` 而非傳回錯誤，請使用下列範例。

```
SELECT JSON_ARRAY_LENGTH('[11,12,13,{"f1":21,"f2":[25,26]},14',true);

+-------------------+
| json_array_length |
+-------------------+
| NULL              |
+-------------------+
```

# JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 函數
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT"></a>

**注意**  
JSON\$1PARSE 及其相關聯的函式會將 JSON 值剖析為 SUPER，Amazon Redshift 會剖析這類值的效率比剖析 VARCHAR 更高。  
建議您使用 [JSON\$1PARSE 函數](JSON_PARSE.md) 剖析 JSON 字串來取得 SUPER 值，而不要使用 JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT。然後使用陣列索引與 `value[element position]` 語法查詢您要的元素。如需在 SUPER 值中查詢陣列元素的詳細資訊，請前往 [查詢半結構化資料](query-super.md)。

JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 函數傳回 JSON 字串最外圍陣列中的 JSON 陣列元素 (採用以零開始的索引)。陣列的第一個元素在位置 0。如果索引是負數或超出邊界，JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 會傳回 `NULL`。如果 *null\$1if\$1invalid* 引數設為 `TRUE`，且 JSON 字串無效，此函數會傳回 `NULL`，而非傳回錯誤。

如需詳細資訊，請參閱[JSON 函數](json-functions.md)。

## 語法
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-synopsis"></a>

```
JSON_EXTRACT_ARRAY_ELEMENT_TEXT('json string', pos [, null_if_invalid ] )
```

## 引數
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-arguments"></a>

 *json\$1string*  
格式正確的 JSON 字串。

*pos*  
`INTEGER`，代表要傳回之陣列元素的索引 (採用以零開始的陣列索引)。

*null\$1if\$1invalid*  
(選用) `BOOLEAN` 值，指定輸入 JSON 字串無效時是否傳回 `NULL`，而非傳回錯誤。若要在 JSON 無效時傳回 `NULL`，請指定 `true` (`t`)。若要在 JSON 無效時傳回錯誤，請指定 `false` (`f`)。預設值為 `false`。

## 傳回類型
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-return"></a>

`VARCHAR`  
`VARCHAR` 字串，代表 *pos* 所參考的 JSON 陣列元素。

## 範例
<a name="JSON_EXTRACT_ARRAY_ELEMENT_TEXT-examples"></a>

若要傳回位置 2 的陣列元素 (即從零開始之陣列索引的第三個元素)，請使用下列範例。

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('[111,112,113]', 2);
 
+---------------------------------+
| json_extract_array_element_text |
+---------------------------------+
|                             113 |
+---------------------------------+
```

若要因 JSON 無效而傳回錯誤，請使用下列範例。

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('["a",["b",1,["c",2,3,null,]]]',1);
 
ERROR: invalid json array object ["a",["b",1,["c",2,3,null,]]]
```

若要將 *null\$1if\$1invalid* 設為 *true*，以便在 JSON 無效時，陳述式傳回 `NULL` 而非傳回錯誤，請使用下列範例。

```
SELECT JSON_EXTRACT_ARRAY_ELEMENT_TEXT('["a",["b",1,["c",2,3,null,]]]',1,true);
 
+---------------------------------+
| json_extract_array_element_text |
+---------------------------------+
| NULL                            |
+---------------------------------+
```

請參考下列範例陳述式。如果提供的 JSON 字串或索引為 NULL，無論任何其他參數的值為何，JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 都會傳回 NULL。

```
--Statement where json_string is NULL.
SELECT json_extract_array_element_text(NULL, 0)

 json_extract_array_element_text
---------------------------------
                            NULL

--Statement where pos is NULL and json_string is invalid JSON.
SELECT json_extract_array_element_text('invalid_json', NULL);

 json_extract_array_element_text
---------------------------------
                            NULL

--Statement where json_string is NULL and null_if_invalid is FALSE.
SELECT json_extract_array_element_text(NULL, 0, FALSE);

 json_extract_array_element_text
---------------------------------
                            NULL
```

請參考下列範例陳述式。當 *null\$1if\$1invalid* 為 TRUE 時，JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 會在 *json\$1string* 為無效 JSON 的情況下傳回 NULL。如果 *null\$1if\$1invalid* 為 FALSE 或未設定，則函式會在 *json\$1string* 無效時傳回錯誤。

```
--Statement with invalid JSON where null_if_invalid is TRUE.
SELECT json_extract_array_element_text('invalid_json', 0, TRUE);

 json_extract_array_element_text
---------------------------------
                            NULL
                            
--Statement with invalid JSON where null_if_invalid is FALSE.
SELECT json_extract_array_element_text('invalid_json', 0);

ERROR:  JSON parsing error
```

請參考下列範例，其中 *json\$1string* 是有效的 JSON，而 *pos* 參考 JSON `null` 值。在此情況下，無論 *null\$1if\$1invalid* 的值為何，JSON\$1EXTRACT\$1ARRAY\$1ELEMENT\$1TEXT 都會傳回 NULL。

```
--Statement selecting a null value.
SELECT json_extract_array_element_text('[null]', 0);

  json_extract_array_element_text 
----------------------------------
                             NULL
```

# JSON\$1EXTRACT\$1PATH\$1TEXT 函數
<a name="JSON_EXTRACT_PATH_TEXT"></a>

**注意**  
JSON\$1PARSE 及其相關聯的函式會將 JSON 值剖析為 SUPER，Amazon Redshift 會剖析這類值的效率比剖析 VARCHAR 更高。  
建議您使用 [JSON\$1PARSE 函數](JSON_PARSE.md) 剖析 JSON 字串來取得 SUPER 值，而不要使用 JSON\$1EXTRACT\$1PATH\$1TEXT。然後使用 `value.attribute` 語法查詢您要的元素。如需在 SUPER 值中查詢陣列元素的詳細資訊，請前往 [查詢半結構化資料](query-super.md)。

JSON\$1EXTRACT\$1PATH\$1TEXT 函數傳回 JSON 字串中由一連串路徑元素所參考的鍵-值對的值。JSON 路徑巢狀最深可達五層。路徑元素區分大小寫。如果 JSON 字串中沒有路徑元素，JSON\$1EXTRACT\$1PATH\$1TEXT 會傳回 `NULL`。

如果 *null\$1if\$1invalid* 引數設為 `TRUE`，且 JSON 字串無效，此函數會傳回 `NULL`，而非傳回錯誤。

JSON\$1EXTRACT\$1PATH\$1TEXT 的資料大小上限為 64KB。因此，如果有任何 JSON 記錄大於 64KB，則使用 JSON\$1EXTRACT\$1PATH\$1TEXT 處理該記錄會產生錯誤。

如需有關其他 JSON 函數的資訊，請參閱[JSON 函數](json-functions.md)。如需使用 JSON 的相關資訊，請參閱[從 JSON 格式 COPY](copy-usage_notes-copy-from-json.md)。

## 語法
<a name="JSON_EXTRACT_PATH_TEXT-synopsis"></a>

```
JSON_EXTRACT_PATH_TEXT('json_string', 'path_elem' [,'path_elem'[, …] ] [, null_if_invalid ] )
```

## 引數
<a name="JSON_EXTRACT_PATH_TEXT-arguments"></a>

 *json\$1string*  
格式正確的 JSON 字串。

*path\$1elem*  
JSON 字串中的路徑元素。需要一個路徑元素。可指定其他路徑元素，最深可達五層。

*null\$1if\$1invalid*  
(選用) `BOOLEAN` 值，指定輸入 JSON 字串無效時是否傳回 `NULL`，而非傳回錯誤。若要在 JSON 無效時傳回 `NULL`，請指定 `TRUE` (`t`)。若要在 JSON 無效時傳回錯誤，請指定 `FALSE` (`f`)。預設值為 `FALSE`。

在 JSON 字串中，Amazon Redshift 將 `\n` 視為新行字元，將 `\t` 視為 Tab 字元。若要載入反斜線，請加上反斜線 ( `\\` ) 來逸出。如需詳細資訊，請參閱[JSON 中的逸出字元](copy-usage_notes-copy-from-json.md#copy-usage-json-escape-characters)。

## 傳回類型
<a name="JSON_EXTRACT_PATH_TEXT-return"></a>

`VARCHAR`  
`VARCHAR` 字串，代表路徑元素所參考的 JSON 值。

## 範例
<a name="JSON_EXTRACT_PATH_TEXT-examples"></a>

若要傳回路徑 `'f4', 'f6'` 的值，請使用下列範例。

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4', 'f6');

+------------------------+
| json_extract_path_text |
+------------------------+
| star                   |
+------------------------+
```

若要因 JSON 無效而傳回錯誤，請使用下列範例。

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}','f4', 'f6');

ERROR: invalid json object {"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}
```

若要將 *null\$1if\$1invalid* 設為 *TRUE*，讓陳述式在 JSON 無效時傳回 `NULL` 而非傳回錯誤，請使用下列範例。

```
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}','f4', 'f6',true);

+------------------------+
| json_extract_path_text |
+------------------------+
| NULL                   |
+------------------------+
```

請參考下列選取路徑 `'farm', 'barn', 'color'` 之值的範例，其中擷取的值位於第三層。此範例使用 JSON lint 工具進行格式，以便於閱讀。

```
SELECT JSON_EXTRACT_PATH_TEXT('{
    "farm": {
        "barn": {
            "color": "red",
            "feed stocked": true
        }
    }
}', 'farm', 'barn', 'color');
+------------------------+
| json_extract_path_text |
+------------------------+
| red                    |
+------------------------+
```

若要在遺失 `'color'` 元素時傳回 `NULL`，請使用下列範例。此範例使用 JSON lint 工具進行格式化。

```
SELECT JSON_EXTRACT_PATH_TEXT('{
    "farm": {
        "barn": {}
    }
}', 'farm', 'barn', 'color');

+------------------------+
| json_extract_path_text |
+------------------------+
| NULL                   |
+------------------------+
```

如果 JSON 有效，嘗試提取缺少的元素會傳回 `NULL`。

若要傳回路徑 `'house', 'appliances', 'washing machine', 'brand'` 的值，請使用下列範例。

```
SELECT JSON_EXTRACT_PATH_TEXT('{
  "house": {
    "address": {
      "street": "123 Any St.",
      "city": "Any Town",
      "state": "FL",
      "zip": "32830"
    },
    "bathroom": {
      "color": "green",
      "shower": true
    },
    "appliances": {
      "washing machine": {
        "brand": "Any Brand",
        "color": "beige"
      },
      "dryer": {
        "brand": "Any Brand",
        "color": "white"
      }
    }
  }
}', 'house', 'appliances', 'washing machine', 'brand');  

+------------------------+
| json_extract_path_text |
+------------------------+
| Any Brand              |
+------------------------+
```

下列範例會建立範例資料表，並填入 SUPER 值，然後針對這兩列路徑 `'f2'` 的值。

```
CREATE TABLE json_example(id INT, json_text SUPER);

INSERT INTO json_example VALUES
(1, JSON_PARSE('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}')),
(2, JSON_PARSE('{
    "farm": {
        "barn": {
            "color": "red",
            "feed stocked": true
        }
    }
}'));

SELECT * FROM json_example;
id          | json_text
------------+--------------------------------------------
1           | {"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}
2           | {"farm":{"barn":{"color":"red","feed stocked":true}}}
 

SELECT id, JSON_EXTRACT_PATH_TEXT(JSON_SERIALIZE(json_text), 'f2') FROM json_example;
         
id          | json_text
------------+--------------------------------------------
1           | {"f3":1}
2           |
```

請參考下列範例陳述式。提供的 *path\$1elem* 為 NULL，因此無論任何其他參數的值為何，JSON\$1EXTRACT\$1PATH\$1TEXT 都會傳回 NULL。

```
--Statement where path_elem is NULL and json_string is valid JSON.
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}',NULL);

 json_extract_path_text
------------------------
                   NULL

--Statement where only one path_elem is NULL.
SELECT JSON_EXTRACT_PATH_TEXT('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4',NULL);

 json_extract_path_text
------------------------
                   NULL
                   
--Statement where path_elem is NULL and json_string is invalid JSON.
SELECT json_extract_path_text('invalid_json', NULL);

 json_extract_path_text
------------------------
                   NULL

--Statement where path_elem is NULL and null_if_invalid is FALSE.
SELECT json_extract_path_text(NULL, 0, FALSE);

 json_extract_path_text
------------------------
                   NULL
```

請參考下列範例陳述式。當 *null\$1if\$1invalid* 為 TRUE 時，JSON\$1EXTRACT\$1PATH\$1TEXT 會在 *json\$1string* 為無效 JSON 的情況下傳回 NULL。如果 *null\$1if\$1invalid* 為 FALSE 或未設定，則函式會在 *json\$1string* 無效時傳回錯誤。

```
--Statement with invalid JSON where null_if_invalid is TRUE.
SELECT json_extract_path_text('invalid_json', 0, TRUE);

 json_extract_path_text
------------------------
                   NULL
                                                    
--Statement with invalid JSON where null_if_invalid is FALSE.
SELECT json_extract_path_text('invalid_json', 0, FALSE);

ERROR:  JSON parsing error
```

請參考下列範例，其中 *json\$1string* 是有效的 JSON，而 *path\$1elem* 參考 JSON `null` 值。在此情況下，JSON\$1EXTRACT\$1PATH\$1TEXT 會傳回 NULL。同樣地，當 *path\$1elem* 參考不存在的值時，無論 *null\$1if\$1invalid* 的值為何，JSON\$1EXTRACT\$1PATH\$1TEXT 都會傳回 NULL。

```
--Statement selecting a null value.
SELECT json_extract_path_text('[null]', 0);

  json_extract_path_text  
-------------------------
                    NULL   
                             
--Statement selecting a non-existing value.               
SELECT json_extract_path_text('{}', 'a');
       
  json_extract_path_text  
-------------------------
                    NULL
```

# 機器學習函數
<a name="ml-function"></a>

透過使用 Amazon Redshift 機器學習 (ML)，您可以使用 SQL 陳述式訓練 ML 模型，並在 SQL 查詢中調用它們以進行預測。Amazon Redshift 模型可解釋性包含特徵重要性值，可協助您了解訓練資料中的每個屬性如何影響預測結果。

接下來，您可以找到 Amazon Redshift 支援的 SQL 機器學習函數的說明。

**Topics**
+ [EXPLAIN\$1MODEL 函數](r_explain_model_function.md)

# EXPLAIN\$1MODEL 函數
<a name="r_explain_model_function"></a>

EXPLAIN\$1MODEL 函數傳回 SUPER 資料類型，其中包含 JSON 格式的模型可解釋性報表。可解釋性報告包含有關所有模型特徵的 Shapley 值的資訊。

EXPLAIN\$1MODEL 函數目前僅支援 AUTO ON 或 AUTO OFF XGBoost 模型。

當可解釋性報告不可用時，函數會傳回顯示模型進度的狀態。其中包括 `Waiting for training job to complete`、`Waiting for processing job to complete` 和 `Processing job failed`。

當您執行 CREATE MODEL 陳述式時，解釋狀態會變成 `Waiting for training job to complete`。當模型經過訓練並傳送解釋請求時，解釋狀態會變成 `Waiting for processing job to complete`。當模型解釋成功完成後，即可獲得完整的可解釋性報告。否則狀態變成 `Processing job failed`。

當您執行 CREATE MODEL 陳述式時，您可以使用選用的 `MAX_RUNTIME` 參數來指定訓練應採取的時間上限。一旦模型建立達到這段時間，Amazon Redshift 就會停止建立模型。如果您在建立自動駕駛模型時達到該時間限制，Amazon Redshift 將傳回目前為止最佳模型。模型訓練完成後，模型可解釋性就可用，因此如果 `MAX_RUNTIME` 設定的時間較短，則可解釋性報告可能無法使用。訓練時間會因模型複雜度、資料大小及其他因素而有所不同。

## 語法
<a name="r_explain_model_function-synopsis"></a>

```
EXPLAIN_MODEL ('schema_name.model_name')
```

## 引數
<a name="r_explain_model_function-argument"></a>

 *schema\$1name*   
結構描述的名稱。如果未指定 schema\$1name，則會選取目前的結構描述。

 *model\$1name*   
模型的名稱。結構描述中的模型名稱必須是唯一的。

## 傳回類型
<a name="r_explain_model_function-return-type"></a>

EXPLAIN\$1MODEL 函數傳回 SUPER 資料類型，如下所示。

```
{"version":"1.0","explanations":{"kernel_shap":{"label0":{"global_shap_values":{"x0":0.05,"x1":0.10,"x2":0.30,"x3":0.15},"expected_value":0.50}}}}
```

## 範例
<a name="r_explain_model_function-examples"></a>

下列範例會傳回解釋狀態 `waiting for training job to complete`。

```
select explain_model('customer_churn_auto_model');
                 explain_model
--------------------------------------------------------
{"explanations":"waiting for training job to complete"}
(1 row)
```

當模型解釋成功完成時，完整的可解釋性報告如下。

```
select explain_model('customer_churn_auto_model');
                                       explain_model
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"version":"1.0","explanations":{"kernel_shap":{"label0":{"global_shap_values":{"x0":0.05386043365892927,"x1":0.10801289723274592,"x2":0.23227865827017378,"x3":0.0676685133940455,"x4":0.0897097667672375,"x5":0.08502141653270926,"x6":0.07581993936077065,"x7":0.16462880604578135},"expected_value":0.8492974042892456}}}}
(1 row)
```

因為 EXPLAIIN\$1MODEL 函數會傳回 SUPER 資料類型，所以您可以查詢可解釋性報告。透過這樣做，您可以擷取 `global_shap_values`、`expected_value` 或特定於特徵的 Shapley 值。

以下範例會擷取模型的 `global_shap_values`。

```
select json_table.report.explanations.kernel_shap.label0.global_shap_values from (select explain_model('customer_churn_auto_model') as report) as json_table;
                                                       global_shap_values
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{"state":0.10983770427197151,"account_length":0.1772441398408543,"area_code":0.08626823968639591,"phone":0.0736669595282712,"intl_plan":3.344907436910987,"vmail_plan":0.09646600597854467,"vmail_message":0.2064922655089351,"day_mins":2.015038015251777,"day_calls":0.13179511076780168,"day_charge":0.4941091720480879,"eve_mins":0.46081379198626105,"eve_calls":0.16913440417758477,"eve_charge":0.09651014369401761,"night_mins":0.44218153640050845,"night_calls":0.15311640089218997,"night_charge":0.13850366104495426,"intl_mins":0.7583662464883899,"intl_calls":0.47144468610485685,"intl_charge":0.10945894673611875,"cust_serv_calls":0.31822051038387733}
(1 row)
```

以下範例會擷取特徵 x0 的 `global_shap_values`。

```
select json_table.report.explanations.kernel_shap.label0.global_shap_values.x0 from (select explain_model('customer_churn_auto_model') as report) as json_table;
          x0
------------------------
  0.05386043365892927
(1 row)
```

如果模型是在一個特定的結構描述中建立的，且您有權存取建立的模型，那麼您可以查詢模型解釋，如下所示。

```
-- Check the current schema
SHOW search_path;
   search_path
------------------
  $user, public
(1 row)         
-- If you have the privilege to access the model explanation
-- in `test_schema`
SELECT explain_model('test_schema.test_model_name');
                       explain_model
---------------------------------------------------------
{"explanations":"waiting for training job to complete"}
(1 row)
```

# 數學函數
<a name="Math_functions"></a>

**Topics**
+ [數學運算子符號](r_OPERATOR_SYMBOLS.md)
+ [ABS 函數](r_ABS.md)
+ [ACOS 函數](r_ACOS.md)
+ [ASIN 函數](r_ASIN.md)
+ [ATAN 函數](r_ATAN.md)
+ [ATAN2 函數](r_ATAN2.md)
+ [CBRT 函數](r_CBRT.md)
+ [CEILING (或 CEIL) 函數](r_CEILING_FLOOR.md)
+ [COS 函數](r_COS.md)
+ [COT 函數](r_COT.md)
+ [DEGREES 函數](r_DEGREES.md)
+ [DEXP 函數](r_DEXP.md)
+ [DLOG1 函數](r_DLOG1.md)
+ [DLOG10 函數](r_DLOG10.md)
+ [EXP 函數](r_EXP.md)
+ [FLOOR 函數](r_FLOOR.md)
+ [LN 函數](r_LN.md)
+ [LOG 函數](r_LOG.md)
+ [MOD 函數](r_MOD.md)
+ [PI 函數](r_PI.md)
+ [POWER 函數](r_POWER.md)
+ [RADIANS 函數](r_RADIANS.md)
+ [RANDOM 函數](r_RANDOM.md)
+ [ROUND 函數](r_ROUND.md)
+ [SIN 函數](r_SIN.md)
+ [SIGN 函數](r_SIGN.md)
+ [SQRT 函數](r_SQRT.md)
+ [TAN 函數](r_TAN.md)
+ [TRUNC 函數](r_TRUNC.md)

本節描述 Amazon Redshift 中支援的數學運算子和函數。

# 數學運算子符號
<a name="r_OPERATOR_SYMBOLS"></a>

 下表列出支援的數學運算子。

## 支援的運算子
<a name="r_OPERATOR_SYMBOLS-supported-operators"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_OPERATOR_SYMBOLS.html)

## 範例
<a name="r_OPERATOR_SYMBOLS-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要計算給定交易的已付佣金加 2.00 USD 手續費，請使用下列範例。

```
SELECT
    commission,
    (commission + 2.00) AS comm
FROM
    sales
WHERE
    salesid = 10000;

+------------+-------+
| commission | comm  |
+------------+-------+
|      28.05 | 30.05 |
+------------+-------+
```

若要計算給定交易售價的 20%，請使用下列範例。

```
SELECT pricepaid, (pricepaid * .20) as twentypct 
FROM sales 
WHERE salesid=10000;

+-----------+-----------+
| pricepaid | twentypct |
+-----------+-----------+
|       187 |      37.4 |
+-----------+-----------+
```

若要使用 DEXP 函數以根據持續成長模式來預測門票銷售，請使用下列範例。在此範例中，子查詢傳回 2008 年銷售的門票數。此結果以指數方式乘以過去 10 年的持續成長率 5%。

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid AND year=2008)^((5::float/100)*10) AS qty10years;

+------------------+
|    qty10years    |
+------------------+
| 587.664019657491 |
+------------------+
```

若要尋找日期 ID 大於或等於 2000 之銷售的支付總價和佣金，請使用下列範例。然後從支付總價中減去佣金總計。

```
SELECT SUM(pricepaid) AS sum_price, dateid,
SUM(commission) AS sum_comm, (SUM(pricepaid) - SUM(commission)) AS value
FROM sales 
WHERE dateid >= 2000
GROUP BY dateid 
ORDER BY dateid 
LIMIT 10;

+-----------+--------+----------+-----------+
| sum_price | dateid | sum_comm |   value   |
+-----------+--------+----------+-----------+
|    305885 |   2000 | 45882.75 | 260002.25 |
|    316037 |   2001 | 47405.55 | 268631.45 |
|    358571 |   2002 | 53785.65 | 304785.35 |
|    366033 |   2003 | 54904.95 | 311128.05 |
|    307592 |   2004 |  46138.8 |  261453.2 |
|    333484 |   2005 |  50022.6 |  283461.4 |
|    317670 |   2006 |  47650.5 |  270019.5 |
|    351031 |   2007 | 52654.65 | 298376.35 |
|    313359 |   2008 | 47003.85 | 266355.15 |
|    323675 |   2009 | 48551.25 | 275123.75 |
+-----------+--------+----------+-----------+
```

# ABS 函數
<a name="r_ABS"></a>

 ABS 計算數字的絕對值，此數字可以是常值，或評估為數字的表達式。

## 語法
<a name="r_ABS-synopsis"></a>

```
ABS(number)
```

## 引數
<a name="r_ABS-arguments"></a>

 *number*   
數字或評估為數字的表達式。它可以是 `SMALLINT`、`INTEGER`、`BIGINT`、`DECIMAL`、`FLOAT4`、`FLOAT8` 或 `SUPER` 類型。

## 傳回類型
<a name="r_ABS-return-type"></a>

ABS 傳回與其引數相同的資料類型。

## 範例
<a name="r_ABS-examples"></a>

若要計算 `-38` 的絕對值，請使用下列範例。

```
SELECT ABS(-38);

+-----+
| abs |
+-----+
|  38 |
+-----+
```

若要計算 `(14-76)` 的絕對值，請使用下列範例。

```
SELECT ABS(14-76);

+-----+
| abs |
+-----+
|  62 |
+-----+
```

# ACOS 函數
<a name="r_ACOS"></a>

ACOS 是傳回數字反餘弦的三角函數。傳回值為弧度且介於 `0` 和 `PI` 之間。

## 語法
<a name="r_ACOS-synopsis"></a>

```
ACOS(number)
```

## 引數
<a name="r_ACOS-arguments"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_ACOS-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_ACOS-examples"></a>

若要傳回 `-1` 的反餘弦，請使用下列範例。

```
SELECT ACOS(-1);

+-------------------+
|       acos        |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

若要將 `.5` 的反餘弦轉換為同等度數，請使用下列範例。

```
SELECT (ACOS(.5) * 180/(SELECT PI())) AS degrees;

+-------------------+
|      degrees      |
+-------------------+
| 60.00000000000001 |
+-------------------+
```

# ASIN 函數
<a name="r_ASIN"></a>

ASIN 是傳回數字反正弦的三角函數。傳回值為弧度且介於 `PI/2` 和 `-PI/2` 之間。

## 語法
<a name="r_ASIN-synopsis"></a>

```
ASIN(number)
```

## 引數
<a name="r_ASIN-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_ASIN-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_ASIN-examples"></a>

若要傳回 `1` 的正弦，請使用下列範例。

```
SELECT ASIN(1) AS halfpi;

+--------------------+
|       halfpi       |
+--------------------+
| 1.5707963267948966 |
+--------------------+
```

若要將 `.5` 的反正弦轉換為同等度數，請使用下列範例。

```
SELECT (ASIN(.5) * 180/(SELECT PI())) AS degrees;

+--------------------+
|      degrees       |
+--------------------+
| 30.000000000000004 |
+--------------------+
```

# ATAN 函數
<a name="r_ATAN"></a>

ATAN 是傳回數字反正切的三角函數。傳回值為弧度且介於 `-PI` 和 `PI` 之間。

## 語法
<a name="r_ATAN-synopsis"></a>

```
ATAN(number)
```

## 引數
<a name="r_ATAN-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_ATAN-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_ATAN-examples"></a>

若要傳回 1 的反正切再乘以 4，請使用下列範例。

```
SELECT ATAN(1) * 4 AS pi;
            
+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

若要將 1 的反正切轉換為同等度數，請使用下列範例。

```
SELECT (ATAN(1) * 180/(SELECT PI())) AS degrees;

+---------+
| degrees |
+---------+
|      45 |
+---------+
```

# ATAN2 函數
<a name="r_ATAN2"></a>

ATAN2 是傳回兩個數字相除之反正切的三角函數。傳回值為弧度且介於 `PI/2` 和 `-PI/2` 之間。

## 語法
<a name="r_ATAN2-synopsis"></a>

```
ATAN2(number1, number2)
```

## 引數
<a name="r_ATAN2-arguments"></a>

 *number1*   
`DOUBLE PRECISION` 數字。

 *number2*   
`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_ATAN2-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_ATAN2-examples"></a>

若要傳回 1 的反正切再乘以 4，請使用下列範例。

```
SELECT ATAN2(2,2) * 4 AS PI;

+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

若要將 1 的的反正切 (計算結果為 0 )轉換為同等度數，請使用下列範例。

```
SELECT (ATAN2(1,0) * 180/(SELECT PI())) AS degrees;

+---------+
| degrees |
+---------+
|      90 |
+---------+
```

# CBRT 函數
<a name="r_CBRT"></a>

 CBRT 是計算指定數字立方根的數學函數。

## 語法
<a name="r_CBRT-synopsis"></a>

```
CBRT(number)
```

## 引數
<a name="r_CBRT-argument"></a>

CBRT 需要一個 `DOUBLE PRECISION` 數字作為引數。

## 傳回類型
<a name="r_CBRT-return-type"></a>

`DOUBLE PRECISION` 

## 範例
<a name="r_CBRT-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要計算給定交易之已付佣金的立方根，請使用下列範例。

```
SELECT CBRT(commission) FROM sales WHERE salesid=10000;

+--------------------+
|        cbrt        |
+--------------------+
| 3.0383953904884344 |
+--------------------+
```

# CEILING (或 CEIL) 函數
<a name="r_CEILING_FLOOR"></a>

CEILING 或 CEIL 函數用來將數字捨進到下一個整數。([FLOOR 函數](r_FLOOR.md) 將數字捨去到下一個整數。) 

## 語法
<a name="r_CEILING_FLOOR-synopsis"></a>

```
{CEIL | CEILING}(number)
```

## 引數
<a name="r_CEILING_FLOOR-arguments"></a>

 *number*   
數字或評估為數字的運算式。它可以是 `SMALLINT`、`INTEGER`、`BIGINT`、`DECIMAL`、`FLOAT4`、`FLOAT8` 或 `SUPER` 類型。

## 傳回類型
<a name="r_CEILING_FLOOR-return-type"></a>

CEILING 和 CEIL 傳回相同的資料類型作為它的引數。

當輸入為 `SUPER` 類型時，輸出會保留與輸入相同的動態類型，而靜態類型仍然是 SUPER 類型。當 `SUPER` 的動態類型不是數字時，Amazon Redshift 會傳回 null。

## 範例
<a name="r_CEILING_FLOOR-example"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要計算給定銷售交易之已付佣金的上限，請使用下列範例。

```
SELECT CEILING(commission) FROM sales
WHERE salesid=10000;

+---------+
| ceiling |
+---------+
|      29 |
+---------+
```

# COS 函數
<a name="r_COS"></a>

COS 是傳回數字餘弦的三角函數。傳回值為弧度且介於 `-1` 和 `1` (含) 之間。

## 語法
<a name="r_COS-synopsis"></a>

```
COS(double_precision)
```

## 引數
<a name="r_COS-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_COS-return-type"></a>

COS 函數會傳回 `DOUBLE PRECISION` 數字。

## 範例
<a name="r_COS-examples"></a>

若要傳回 `0` 的餘弦，請使用下列範例。

```
SELECT COS(0);

+-----+
| cos |
+-----+
|   1 |
+-----+
```

若要傳回 `pi` 的餘弦，請使用下列範例。

```
SELECT COS(PI());

+-----+
| cos |
+-----+
|  -1 |
+-----+
```

# COT 函數
<a name="r_COT"></a>

COT 是傳回數字餘切的三角函數。輸入參數必須不是零。

## 語法
<a name="r_COT-synopsis"></a>

```
COT(number)
```

## 引數
<a name="r_COT-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_COT-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_COT-examples"></a>

若要傳回 1 的餘切，請使用下列範例。

```
SELECT COT(1);

+--------------------+
|        cot         |
+--------------------+
| 0.6420926159343306 |
+--------------------+
```

# DEGREES 函數
<a name="r_DEGREES"></a>

將角度的弧度轉換為其同等度數。

## 語法
<a name="r_DEGREES-synopsis"></a>

```
DEGREES(number)
```

## 引數
<a name="r_DEGREES-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_DEGREES-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_DEGREES-examples"></a>

若要傳回 0.5 弧度的同等度數，請使用下列範例。

```
SELECT DEGREES(.5);

+-------------------+
|      degrees      |
+-------------------+
| 28.64788975654116 |
+-------------------+
```

若要將 PI 弧度轉換為度數，請使用下列範例。

```
SELECT DEGREES(pi());

+---------+
| degrees |
+---------+
|     180 |
+---------+
```

# DEXP 函數
<a name="r_DEXP"></a>

DEXP 函數以科學記號表示法傳回雙精確度數字的指數值。DEXP 和 EXP 函數的唯一差異是 DEXP 的參數必須為 `DOUBLE PRECISION`。

## 語法
<a name="r_DEXP-synopsis"></a>

```
DEXP(number)
```

## 引數
<a name="r_DEXP-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_DEXP-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_DEXP-example"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

使用 DEXP 函數以根據持續成長模式來預測門票銷售。在此範例中，子查詢傳回 2008 年銷售的門票數。此結果乘以 DEXP 函數的結果，而此函數指出過去 10 年的持續成長率為 7%。

```
SELECT (SELECT SUM(qtysold) 
FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * DEXP((7::FLOAT/100)*10) qty2010;

+-------------------+
|      qty2010      |
+-------------------+
| 695447.4837722216 |
+-------------------+
```

# DLOG1 函數
<a name="r_DLOG1"></a>

DLOG1 函數傳回輸入參數的自然對數。[LN 函數](r_LN.md) 的同義詞。

# DLOG10 函數
<a name="r_DLOG10"></a>

DLOG10 傳回輸入參數的以 10 為底的對數。

[LOG 函數](r_LOG.md) 的同義詞。

## 語法
<a name="r_DLOG10-synopsis"></a>

```
DLOG10(number)
```

## 引數
<a name="r_DLOG10-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_DLOG10-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_DLOG10-example"></a>

若要傳回數字 100 的以 10 為底的對數，請使用下列範例。

```
SELECT DLOG10(100);

+--------+
| dlog10 |
+--------+
|      2 |
+--------+
```

# EXP 函數
<a name="r_EXP"></a>

EXP 函數會實作數值表達式的指數函數，或是自然對數的底數，表達式的 `e` 次方。EXP 函數為 [LN 函數](r_LN.md) 的倒數。

## 語法
<a name="r_EXP-synopsis"></a>

```
EXP(expression)
```

## 引數
<a name="r_EXP-argument"></a>

 *表達式*   
運算式必須是 `INTEGER`、`DECIMAL` 或 `DOUBLE PRECISION` 資料類型。

## 傳回類型
<a name="r_EXP-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_EXP-example"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

使用 EXP 函數以根據持續成長模式來預測門票銷售。在此範例中，子查詢傳回 2008 年銷售的門票數。此結果乘以 EXP 函數的結果，而此函數指出過去 10 年的持續成長率為 7%。

```
SELECT (SELECT SUM(qtysold) 
FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * EXP((7::FLOAT/100)*10) qty2018;

+-------------------+
|      qty2018      |
+-------------------+
| 695447.4837722216 |
+-------------------+
```

# FLOOR 函數
<a name="r_FLOOR"></a>

FLOOR 函數將數字捨去到下一個整數。

## 語法
<a name="r_FLOOR-synopsis"></a>

```
FLOOR(number)
```

## 引數
<a name="r_FLOOR-argument"></a>

 *number*   
數字或評估為數字的運算式。它可以是 `SMALLINT`、`INTEGER`、`BIGINT`、`DECIMAL`、`FLOAT4`、`FLOAT8` 或 `SUPER` 類型。

## 傳回類型
<a name="r_FLOOR-return-type"></a>

FLOOR 傳回與其引數相同的資料類型。

當輸入為 `SUPER` 類型時，輸出會保留與輸入相同的動態類型，而靜態類型仍然是 `SUPER` 類型。當 `SUPER` 的動態類型不是數字時，Amazon Redshift 會傳回 `NULL`。

## 範例
<a name="r_FLOOR-example"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要顯示使用 FLOOD 函數之前和之後，針對指定的銷售交易支付之佣金的數值，請使用下列範例。

```
SELECT commission 
FROM sales 
WHERE salesid=10000;

+------------+
| commission |
+------------+
|      28.05 |
+------------+

SELECT FLOOR(commission) 
FROM sales 
WHERE salesid=10000;

+-------+
| floor |
+-------+
|    28 |
+-------+
```

# LN 函數
<a name="r_LN"></a>

傳回輸入參數的自然對數。

[DLOG1 函數](r_DLOG1.md) 的同義詞。

## 語法
<a name="r_LN-synopsis"></a>

```
LN(expression)
```

## 引數
<a name="r_LN-argument"></a>

 *表達式*   
函數運算的目標欄或表達式。  
如果運算式參考 Amazon Redshift 使用者建立的資料表或 Amazon Redshift STL 或 STV 系統資料表，此函數會針對某些資料類型傳回錯誤。
如果具有下列資料類型的表達式參考使用者建立的資料表或系統資料表，則會產生錯誤。具有這些資料類型的表達式只能在領導者節點上執行：  
+ `BOOLEAN` 
+ `CHAR` 
+ `DATE` 
+ `DECIMAL` 或 `NUMERIC` 
+ `TIMESTAMP` 
+ `VARCHAR` 
在使用者建立的資料表和 STL 或 STV 系統資料表上，具有下列資料類型的表達式可以成功執行：  
+ `BIGINT` 
+ `DOUBLE PRECISION` 
+ `INTEGER` 
+ `REAL` 
+ `SMALLINT` 

## 傳回類型
<a name="r_LN-return-type"></a>

LN 函數傳回與輸入*運算式*相同的類型。

## 範例
<a name="r_LN-example"></a>

若要傳回數字 2.718281828 的自然對數或以 `e` 為底的對數，請使用下列範例。

```
SELECT LN(2.718281828);

+--------------------+
|         ln         |
+--------------------+
| 0.9999999998311267 |
+--------------------+
```

請注意，答案幾乎等於 1。

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要傳回 USERS 資料表的 userid 欄中值的自然對數，請使用下列範例。

```
SELECT username, LN(userid) FROM users ORDER BY userid LIMIT 10;

+----------+--------------------+
| username |         ln         |
+----------+--------------------+
| JSG99FHE |                  0 |
| PGL08LJI | 0.6931471805599453 |
| IFT66TXU | 1.0986122886681098 |
| XDZ38RDD | 1.3862943611198906 |
| AEB55QTM | 1.6094379124341003 |
| NDQ15VBM |  1.791759469228055 |
| OWY35QYB | 1.9459101490553132 |
| AZG78YIP | 2.0794415416798357 |
| MSD36KVR | 2.1972245773362196 |
| WKW41AIW |  2.302585092994046 |
+----------+--------------------+
```

# LOG 函數
<a name="r_LOG"></a>

傳回數字的對數。

如果您使用此函數計算以 10 為底的對數，則也可以使用 [DLOG10 函數](r_DLOG10.md)。

## 語法
<a name="r_LOG-synopsis"></a>

```
LOG([base, ]argument)
```

## Parameters
<a name="r_LOG-argument"></a>

 *base*   
(選用) 對數函數的底。這個數字必須是正數且不能等於 `1`。如果省略此參數，Amazon Redshift 會計算 *argument* 的以 10 為底的對數。

 *argument*   
對數函數的引數。此數字必須為正數。如果 *argument* 值是 `1`，則函數傳回 `0`。

## 傳回類型
<a name="r_LOG-return-type"></a>

LOG 函數會傳回 `DOUBLE PRECISION` 數字。

## 範例
<a name="r_LOG-example"></a>

若要尋找 100 的以 2 為底的對數，請使用下列範例。

```
SELECT LOG(2, 100);
+-------------------+
|        log        |
+-------------------+
| 6.643856189774725 |
+-------------------+
```

若要尋找 100 的以 10 為底的對數，請使用下列範例。請注意，如果您省略基本參數，Amazon Redshift 假設基數為 10。

```
SELECT LOG(100);
            
+-----+
| log |
+-----+
|   2 |
+-----+
```

# MOD 函數
<a name="r_MOD"></a>

傳回兩個數字的餘數，也稱為*模數*運算。為了計算結果，第一個參數除以第二個參數。

## 語法
<a name="r_MOD-synopsis"></a>

```
MOD(number1, number2)
```

## 引數
<a name="r_MOD-arguments"></a>

 *number1*   
第一個輸入參數是 `INTEGER`、`SMALLINT`、`BIGINT` 或 `DECIMAL` 數字。如果任一參數為 `DECIMAL` 類型，則另一個參數也必須為 `DECIMAL` 類型。如果任一參數為 `INTEGER`，則另一個參數可以是 `INTEGER`、`SMALLINT` 或 `BIGINT`。兩個參數也都可以是 `SMALLINT` 或 `BIGINT`，但如果一個參數是 `BIGINT`，則另一個參數不能是 `SMALLINT`。

 *number2*   
第二個參數是 `INTEGER`、`SMALLINT`、`BIGINT` 或 `DECIMAL` 數字。相同的資料類型規則適用於 *number2* 與 *number1*。

## 傳回類型
<a name="r_MOD-return-type"></a>

如果兩個輸入參數都是相同類型，則 MOD 函數的傳回類型與輸入參數的數值類型相同。不過，如果任一輸入參數為 `INTEGER`，則傳回類型也會是 `INTEGER`。有效的傳回類型為 `DECIMAL`、`INT`、`SMALLINT` 和 `BIGINT`。

## 使用須知
<a name="r_MOD-usage-notes"></a>

您可以使用 `%` 作為模數運算子。

## 範例
<a name="r_MOD-example"></a>

若要傳回一個數字除以另一個數字時的餘數，請使用下列範例。

```
SELECT MOD(10, 4);
               
+-----+
| mod |
+-----+
|   2 |
+-----+
```

若要在使用 MOD 函數時傳回 `DECIMAL` 結果，請使用下列範例。

```
SELECT MOD(10.5, 4);
               
+-----+
| mod |
+-----+
| 2.5 |
+-----+
```

若要在執行 MOD 函數之前轉換數字，請使用下列範例。如需詳細資訊，請參閱[CAST 函數](r_CAST_function.md)。

```
SELECT MOD(CAST(16.4 AS INTEGER), 5);
               
+-----+
| mod |
+-----+
|   1 |
+-----+
```

若要透過除以 2 來檢查第一個參數是否為偶數，請使用下列範例。

```
SELECT mod(5,2) = 0 AS is_even;
               
+---------+
| is_even |
+---------+
| false   |
+---------+
```

若要使用 *%* 做為模數運算子，請使用下列範例。

```
SELECT 11 % 4 as remainder;
               
 +-----------+
| remainder |
+-----------+
|         3 |
+-----------+
```

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要傳回 CATEGORY 資料表中奇數編號類別的資訊，請使用下列範例。

```
SELECT catid, catname
FROM category
WHERE MOD(catid,2)=1
ORDER BY 1,2;

+-------+-----------+
| catid |  catname  |
+-------+-----------+
|     1 | MLB       |
|     3 | NFL       |
|     5 | MLS       |
|     7 | Plays     |
|     9 | Pop       |
|    11 | Classical |
+-------+-----------+
```

# PI 函數
<a name="r_PI"></a>

PI 函數會傳回 pi 的值，精確到 14 位小數。

## 語法
<a name="r_PI-synopsis"></a>

```
PI()
```

## 傳回類型
<a name="r_PI-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_PI-examples"></a>

若要傳回 pi 的值，請使用下列範例。

```
SELECT PI();

+-------------------+
|        pi         |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

# POWER 函數
<a name="r_POWER"></a>

 POWER 函數是將一個數值表達式乘上以第二個數值表達式為次方的指數函數。例如，2 的三次方以 `POWER(2,3)` 計算，結果為 `8`。

## 語法
<a name="r_POWER-synopsis"></a>

```
{POW | POWER}(expression1, expression2)
```

## 引數
<a name="r_POWER-arguments"></a>

 *expression1*   
要乘以次方的數值表達式。必須是 `INTEGER`、`DECIMAL` 或 `FLOAT` 資料類型。

 *expression2*   
*expression1* 要乘以的次方。必須是 `INTEGER`、`DECIMAL` 或 `FLOAT` 資料類型。

## 傳回類型
<a name="r_POWER-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_POWER-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

在下列範例中，使用 POWER 函數以根據 2008 年銷售的門票數 (子查詢的結果)，預測未來 10 年的門票銷售。在此範例中，成長率設為每年 7%。

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * POW((1+7::FLOAT/100),10) qty2010;

+-------------------+
|      qty2010      |
+-------------------+
| 679353.7540885945 |
+-------------------+
```

下列範例是上一個範例的變化版，成長率每年 7%，但間隔設為月份 (10 年共 120 個月)。

```
SELECT (SELECT SUM(qtysold) FROM sales, date
WHERE sales.dateid=date.dateid
AND year=2008) * POW((1+7::FLOAT/100/12),120) qty2010;

+-----------------+
|     qty2010     |
+-----------------+
| 694034.54678046 |
+-----------------+
```

# RADIANS 函數
<a name="r_RADIANS"></a>

RADIANS 函數會將以度為單位的角度轉換為其同等弧度。

## 語法
<a name="r_RADIANS-synopsis"></a>

```
RADIANS(number)
```

## 引數
<a name="r_RADIANS-argument"></a>

 *number*   
輸入參數是`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_RADIANS-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_RADIANS-examples"></a>

若要傳回 180 度的同等弧度，請使用下列範例。

```
SELECT RADIANS(180);

+-------------------+
|      radians      |
+-------------------+
| 3.141592653589793 |
+-------------------+
```

# RANDOM 函數
<a name="r_RANDOM"></a>

RANDOM 函數會產生介於 0.0 (包含) 到 1.0 (不包含) 間的隨機值。

## 語法
<a name="r_RANDOM-synopsis"></a>

```
RANDOM()
```

## 傳回類型
<a name="r_RANDOM-return-type"></a>

`DOUBLE PRECISION`

## 使用須知
<a name="r_RANDOM_usage_notes"></a>

以 [SET](r_SET.md) 命令設定種子值之後呼叫 RANDOM，讓 RANDOM 以可預測的序列產生數字。

## 範例
<a name="r_RANDOM-examples"></a>

若要計算 0 到 99 之間的隨機值，請使用下列範例。如果隨機數字為 0 到 1，此查詢會產生 0 到 100 的隨機數字。

```
SELECT CAST(RANDOM() * 100 AS INT);

+------+
| int4 |
+------+
|   59 |
+------+
```

此範例會使用 [SET](r_SET.md) 命令設定 SEED 值，讓 RANDOM 產生可預測的數字序列。

若要在不設定 SEED 值的情況下傳回三個 RANDOM 整數，請使用下列範例。

```
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|    6 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   68 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   56 |
+------+
```

若要將 SEED 值設定為 `.25`，並傳回三個以上的亂數，請使用下列範例。

```
SET SEED TO .25;
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   21 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   79 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   12 |
+------+
```

若要將 SEED 值重設為 `.25`，並驗證 RANDOM 是否傳回與前三個呼叫相同的結果，請使用下列範例。

```
SET SEED TO .25;
SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   21 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   79 |
+------+

SELECT CAST(RANDOM() * 100 AS INT);
+------+
| int4 |
+------+
|   12 |
+------+
```

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 SALES 表格擷取 10 個項目的統一隨機樣本，請使用下列範例。

```
SELECT * 
FROM sales
ORDER BY RANDOM()
LIMIT 10;

+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
| salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
|   45422 |  51114 |     5983 |   24482 |    4369 |   2118 |       1 |       195 |      29.25 | 2008-10-19 05:20:07 |
|   42481 |  47638 |     4573 |    6198 |    6479 |   1987 |       4 |      1140 |        171 | 2008-06-10 09:39:19 |
|   31494 |  34759 |    18895 |    4719 |    7753 |   2090 |       4 |      1024 |      153.6 | 2008-09-21 03:44:26 |
|  119388 | 136685 |    21815 |   41905 |    2071 |   1884 |       1 |       359 |      53.85 | 2008-02-27 10:43:10 |
|  166990 | 225037 |    18529 |    7628 |     746 |   2113 |       1 |      2009 |     301.35 | 2008-10-14 10:07:44 |
|   11146 |  12096 |    42685 |    6619 |    1876 |   2123 |       1 |        29 |       4.35 | 2008-10-24 06:23:54 |
|  148537 | 172056 |    15102 |   11787 |    6122 |   1923 |       2 |       480 |         72 | 2008-04-07 03:58:23 |
|   68945 |  78387 |     7359 |   18323 |    6636 |   1910 |       1 |       457 |      68.55 | 2008-03-25 08:31:03 |
|   52796 |  59576 |     9909 |   15102 |    7958 |   1951 |       1 |       479 |      71.85 | 2008-05-05 02:25:08 |
|   90684 | 103522 |    38052 |   21549 |    7384 |   2117 |       1 |       313 |      46.95 | 2008-10-18 05:43:11 |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
```

若要擷取 10 個商品的隨機樣本，但請依價格比例來選擇商品，請使用下列範例。例如，一個商品的價格如果是其他商品的兩倍，則出現在查詢結果的機率也是其他商品的兩倍。

```
SELECT * 
FROM sales
ORDER BY -LOG(RANDOM()) / pricepaid
LIMIT 10;

+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
| salesid | listid | sellerid | buyerid | eventid | dateid | qtysold | pricepaid | commission |      saletime       |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
|  158340 | 208208 |    17082 |   42018 |    1211 |   2160 |       4 |      6852 |     1027.8 | 2008-11-30 12:21:43 |
|   53250 |  60069 |    12644 |    7066 |    7942 |   1838 |       4 |      1528 |      229.2 | 2008-01-12 11:24:56 |
|   22929 |  24938 |    47314 |    6503 |     179 |   2000 |       3 |       741 |     111.15 | 2008-06-23 08:04:50 |
|  164980 | 221181 |     1949 |   19670 |    1471 |   1906 |       1 |      1330 |      199.5 | 2008-03-21 07:59:51 |
|  159641 | 211179 |    44897 |   16652 |    7458 |   2128 |       1 |      1019 |     152.85 | 2008-10-29 02:02:15 |
|   73143 |  83439 |     5716 |    5727 |    7314 |   1903 |       1 |       248 |       37.2 | 2008-03-18 11:07:42 |
|   84778 |  96749 |    46608 |   32980 |    3883 |   1999 |       2 |       958 |      143.7 | 2008-06-22 12:13:31 |
|  171096 | 232929 |    43683 |    8536 |    8353 |   1870 |       1 |       929 |     139.35 | 2008-02-13 01:36:36 |
|   74212 |  84697 |    39809 |   15569 |    5525 |   2105 |       2 |       896 |      134.4 | 2008-10-06 11:47:50 |
|  158011 | 207556 |    25399 |   16881 |     232 |   2088 |       2 |      2526 |      378.9 | 2008-09-19 06:00:26 |
+---------+--------+----------+---------+---------+--------+---------+-----------+------------+---------------------+
```

# ROUND 函數
<a name="r_ROUND"></a>

ROUND 函數將數字四捨五入至最接近的整數或小數。

ROUND 函數可以選擇包含第二個引數做為 `INTEGER`，表示四捨五入的小數位數 (任一方向)。當您未提供第二個引數時，函數會四捨五入為最接近的整數。指定第二個引數 *integer* 時，函數會捨入為具有 *integer* 小數位數的最接近的數字。

## 語法
<a name="r_ROUND-synopsis"></a>

```
ROUND(number [ , integer ] )
```

## 引數
<a name="r_ROUND-argument"></a>

 *number*   
數字或評估為數字的運算式。它可以是 `DECIMAL`、`FLOAT8` 或 `SUPER` 類型。Amazon Redshift 可以隱含轉換其他數字資料類型。

*integer*  
(選用) `INTEGER`，表示沿任一方向捨入的小數位數。此引數不支援 `SUPER` 資料類型。

## 傳回類型
<a name="r_ROUND-return-type"></a>

ROUND 會傳回與輸入 *number* 相同的數值資料類型。

當輸入為 `SUPER` 類型時，輸出會保留與輸入相同的動態類型，而靜態類型仍然是 `SUPER` 類型。當 `SUPER` 的動態類型不是數字時，Amazon Redshift 會傳回 `NULL`。

## 範例
<a name="r_ROUND-examples"></a>

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將給定交易的已付佣金四捨五入至最接近的整數，請使用下列範例。

```
SELECT commission, ROUND(commission)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |    28 |
+------------+-------+
```

若要將給定交易的已付佣金四捨五入至第一位小數，請使用下列範例。

```
SELECT commission, ROUND(commission, 1)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |  28.1 |
+------------+-------+
```

若要以上一個範例的反方向延伸精確度，請使用下列範例。

```
SELECT commission, ROUND(commission, -1)
FROM sales WHERE salesid=10000;

+------------+-------+
| commission | round |
+------------+-------+
|      28.05 |    30 |
+------------+-------+
```

# SIN 函數
<a name="r_SIN"></a>

SIN 是傳回數字正弦的三角函數。傳回值介於 `-1` 和 `1` 之間。

## 語法
<a name="r_SIN-synopsis"></a>

```
SIN(number)
```

## 引數
<a name="r_SIN-argument"></a>

 *number*   
以弧度表示的 `DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_SIN-return-type"></a>

`DOUBLE PRECISION` 

## 範例
<a name="r_SIN-examples"></a>

若要傳回 `-PI` 的正弦，請使用下列範例。

```
SELECT SIN(-PI());

+-------------------------+
|           sin           |
+-------------------------+
| -0.00000000000000012246 |
+-------------------------+
```

# SIGN 函數
<a name="r_SIGN"></a>

 SIGN 函數傳回數字的符號 (正或負)。如果引數是正的，SIGN 函數的結果會是 `1`，如果引數是負的則結果為 `-1`，如果引數是 `0` 則結果為 `0`。

## 語法
<a name="r_SIGN-synopsis"></a>

```
SIGN(number)
```

## 引數
<a name="r_SIGN-argument"></a>

 *number*   
數字或評估為數字的表達式。它可以是 `DECIMAL`、`FLOAT8` 或 `SUPER` 類型。Amazon Redshift 可以根據隱含轉換規則轉換其他資料類型。

## 傳回類型
<a name="r_SIGN-return-type"></a>

SIGN 傳回與輸入引數相同的數值資料類型。如果輸入是 `DECIMAL`，則輸出為 `DECIMAL(1,0)`。

當輸入為 `SUPER` 類型時，輸出會保留與輸入相同的動態類型，而靜態類型仍然是 `SUPER` 類型。當 `SUPER` 的動態類型不是數字時，Amazon Redshift 會傳回 `NULL`。

## 範例
<a name="r_SIGN-examples"></a>

下列範例顯示表格 t2 中的 `d` 欄具有 `DOUBLE PRECISION` 類型，因為輸入是 `DOUBLE PRECISION`，而表格 t2 中的 `n` 欄具有 `NUMERIC(1,0)` 輸出，因為輸入是 `NUMERIC`。

```
CREATE TABLE t1(d DOUBLE PRECISION, n NUMERIC(12, 2));
INSERT INTO t1 VALUES (4.25, 4.25), (-4.25, -4.25);
CREATE TABLE t2 AS SELECT SIGN(d) AS d, SIGN(n) AS n FROM t1;
SELECT table_name, column_name, data_type FROM SVV_REDSHIFT_COLUMNS WHERE table_name='t1' OR table_name='t2';
 
+------------+-------------+-----------------------+
| table_name | column_name |       data_type       |
+------------+-------------+-----------------------+
| t1         | d           | double precision      |
| t1         | n           | numeric(12,2)         |
| t2         | d           | double precision      |
| t2         | n           | numeric(1,0)          |
| t1         | col1        | character varying(20) |
+------------+-------------+-----------------------+
```

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要確定從 SALES 表中為給定交易支付的佣金的符號，請使用以下範例。

```
SELECT commission, SIGN(commission)
FROM sales WHERE salesid=10000;

+------------+------+
| commission | sign |
+------------+------+
|      28.05 |    1 |
+------------+------+
```

# SQRT 函數
<a name="r_SQRT"></a>

 SQRT 函數傳回 `NUMERIC` 值的平方根。平方根是一個數字與其自身相乘以獲得給定值。

## 語法
<a name="r_SQRT-synopsis"></a>

```
SQRT(expression)
```

## 引數
<a name="r_SQRT-argument"></a>

 *表達式*   
運算式必須具有 `INTEGER`、`DECIMAL` 或 `FLOAT` 資料類型，或隱含轉換為這些資料類型的資料類型。*expression* 可以包含函數。

## 傳回類型
<a name="r_SQRT-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_SQRT-examples"></a>

若要傳回 16 的平方根，請使用下列範例。

```
SELECT SQRT(16);
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

若要使用隱含類型轉換傳回字串 `16` 的平方根，請使用下列範例。

```
SELECT SQRT('16');
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

若要在使用 ROUND 函數之後傳回 16.4 的平方根，請使用下列範例。

```
SELECT SQRT(ROUND(16.4));
               
+------+
| sqrt |
+------+
|    4 |
+------+
```

若要在指定圓的面積時傳回半徑的長度，請使用下列範例。例如，當以平方英吋為單位指定面積時，它會以英吋為單位計算半徑。樣本中的面積為 20。

```
SELECT SQRT(20/PI()) AS radius;
               
+--------------------+
|      radius        |
+--------------------+
| 2.5231325220201604 |
+--------------------+
```

下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 SALES 資料表中傳回某些 COMMISSION 值的平方根，請使用下列範例。COMMISSION 欄是 `DECIMAL` 欄。此範例顯示如何在具有更複雜條件式邏輯的查詢中使用函數。

```
SELECT SQRT(commission)
FROM sales WHERE salesid < 10 ORDER BY salesid;

+--------------------+
|        sqrt        |
+--------------------+
| 10.449880382090505 |
| 3.3763886032268267 |
|  7.245688373094719 |
|  5.123475382979799 |
|  4.806245936279167 |
|  7.687652437513028 |
| 10.871982339941507 |
| 5.4359911699707535 |
|   9.41541289588513 |
+--------------------+
```

若要傳回同一組 COMMISSION 值的四捨五入平方根，請使用下列範例。

```
SELECT ROUND(SQRT(commission))
FROM sales WHERE salesid < 10 ORDER BY salesid;

+-------+
| round |
+-------+
|    10 |
|     3 |
|     7 |
|     5 |
|     5 |
|     8 |
|    11 |
|     5 |
|     9 |
+-------+
```

# TAN 函數
<a name="r_TAN"></a>

TAN 是傳回數字正切的三角函數。輸入引數是一個數字 (以弧度表示)。

## 語法
<a name="r_TAN-synopsis"></a>

```
TAN(number)
```

## 引數
<a name="r_TAN-argument"></a>

 *number*   
`DOUBLE PRECISION` 數字。

## 傳回類型
<a name="r_TAN-return-type"></a>

`DOUBLE PRECISION`

## 範例
<a name="r_TAN-examples"></a>

若要傳回 0 的正切，請使用下列範例。

```
SELECT TAN(0);

+-----+
| tan |
+-----+
|   0 |
+-----+
```

# TRUNC 函數
<a name="r_TRUNC"></a>

TRUNC 函數將數字截斷為先前的整數或小數。

TRUNC 函數可以選擇包含第二個引數做為 `INTEGER`，表示四捨五入的小數位數 (任一方向)。當您未提供第二個引數時，函數會四捨五入為最接近的整數。指定第二個引數 *integer* 時，函數會捨入為具有 *integer* 小數位數的最接近的數字。

 這個函數也可以截斷 `TIMESTAMP` 並傳回 `DATE`。如需詳細資訊，請參閱[TRUNC 函數](r_TRUNC_date.md)。

## 語法
<a name="r_TRUNC-synopsis"></a>

```
TRUNC(number [ , integer ])
```

## 引數
<a name="r_TRUNC-arguments"></a>

 *number*   
數字或評估為數字的運算式。它可以是 `DECIMAL`、`FLOAT8` 或 `SUPER` 類型。Amazon Redshift 可以根據隱含轉換規則轉換其他資料類型。

 *integer*  
(選用) `INTEGER`，表示精確度的小數位數 (任一方向)。如果未提供*整數*，數字會截斷為整數；如果指定*整數*，數字會截斷至指定的小數位數。不支援 `SUPER` 資料類型。

## 傳回類型
<a name="r_TRUNC-return-type"></a>

TRUNC 會傳回與輸入 *number* 相同的資料類型。

當輸入為 `SUPER` 類型時，輸出會保留與輸入相同的動態類型，而靜態類型仍然是 `SUPER` 類型。當 `SUPER` 的動態類型不是數字時，Amazon Redshift 會傳回 `NULL`。

## 範例
<a name="r_TRUNC-examples"></a>

下列部分範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要截斷給定銷售交易的已付佣金，請使用下列範例。

```
SELECT commission, TRUNC(commission)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 |   111 |
+------------+-------+
```

若要將同一個佣金值截斷至第一位小數，請使用下列範例。

```
SELECT commission, TRUNC(commission,1)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 | 111.1 |
+------------+-------+
```

若要使用第二個引數的負值截斷佣金，請使用下列範例。請注意 `111.15` 向下捨入為 `110`。

```
SELECT commission, TRUNC(commission,-1)
FROM sales WHERE salesid=784;

+------------+-------+
| commission | trunc |
+------------+-------+
|     111.15 |   110 |
+------------+-------+
```

# 物件函數
<a name="Object_Functions"></a>

以下是 Amazon Redshift 支援在 SUPER 類型物件上建立和操作的 SQL 物件函數：

**Topics**
+ [GET\$1NUMBER\$1ATTRIBUTES 函數](get_number_attributes.md)
+ [LOWER\$1ATTRIBUTE\$1NAMES 函式](r_lower_attribute_names.md)
+ [OBJECT 函數](r_object_function.md)
+ [OBJECT\$1TRANSFORM 函數](r_object_transform_function.md)
+ [UPPER\$1ATTRIBUTE\$1NAMES 函式](r_upper_attribute_names.md)

# GET\$1NUMBER\$1ATTRIBUTES 函數
<a name="get_number_attributes"></a>

傳回字典物件根層級上有多少鍵值對存在的計數。

## 語法
<a name="get_number_attributes-syntax"></a>

```
GET_NUMBER_ATTRIBUTES( super_expression )
```

## 引數
<a name="get_number_attributes-arguments"></a>

 *super\$1expression*   
字典形式的 SUPER 表達式。

## 傳回類型
<a name="get_number_attributes-return-type"></a>

GET\$1NUMBER\$1ATTRIBUTES 函數會傳回 INT 類型。

## 注意
<a name="get_number_attributes-note"></a>

此函數只會計算直接屬性，且不包含巢狀字典中的配對。

## 範例
<a name="get_number_attributes-example"></a>

下列範例顯示 GET\$1NUMBER\$1ATTRIBUTES 函數。

```
SELECT GET_NUMBER_ATTRIBUTES(JSON_PARSE('{"a": 1, "b": 2, "c": 3}'));
 get_number_attributes
-----------------------
            3
(1 row)
```

GET\$1NUMBER\$1ATTRIBUTES 函數只會在字典的第一個層級運作。

```
SELECT GET_NUMBER_ATTRIBUTES(JSON_PARSE('{"a": 1, "b": {"c": 3}}'));
 get_number_attributes
-----------------------
            2
(1 row)
```

# LOWER\$1ATTRIBUTE\$1NAMES 函式
<a name="r_lower_attribute_names"></a>

使用與 [LOWER 函數](r_LOWER.md) 相同的大小寫轉換常式，將 SUPER 值中所有適用的屬性名稱轉換為小寫。LOWER\$1ATTRIBUTE\$1NAMES 支援 UTF-8 多位元組字元，每個字元最多 4 個位元組。

 若要將 SUPER 屬性名稱轉換為大寫，請使用 [UPPER\$1ATTRIBUTE\$1NAMES 函式](r_upper_attribute_names.md)。

## 語法
<a name="r_lower_attribute_names-synopsis"></a>

```
LOWER_ATTRIBUTE_NAMES( super_expression )
```

## 引數
<a name="r_lower_attribute_names-arguments"></a>

*super\$1expression*  
SUPER 表達式。

## 傳回類型
<a name="r_lower_attribute_names-return-type"></a>

`SUPER`

## 使用須知
<a name="r_lower_attribute_names-usage-notes"></a>

在 Amazon Redshift 中，欄識別碼傳統上不區分大小寫，並且會轉換為小寫。如果您從 JSON 等區分大小寫的資料格式擷取資料，則資料可能包含混合大小寫的屬性名稱。

請考量下列範例。

```
CREATE TABLE t1 (s) AS SELECT JSON_PARSE('{"AttributeName": "Value"}');


SELECT s.AttributeName FROM t1;  

attributename
-------------
NULL


SELECT s."AttributeName" FROM t1;

attributename
-------------
NULL
```

Amazon Redshift 會針對這兩個查詢傳回 NULL。若要查詢 `AttributeName`，請使用 LOWER\$1ATTRIBUTE\$1NAMES 將資料的屬性名稱轉換為小寫。請考量下列範例。

```
CREATE TABLE t2 (s) AS SELECT LOWER_ATTRIBUTE_NAMES(s) FROM t1;


SELECT s.attributename FROM t2;

attributename
-------------
"Value"


SELECT s.AttributeName FROM t2; 

attributename
-------------
"Value"


SELECT s."attributename" FROM t2;

attributename
-------------
"Value"


SELECT s."AttributeName" FROM t2;

attributename
-------------
"Value"
```

使用混合大小寫物件屬性名稱的相關選項為 `enable_case_sensitive_super_attribute` 組態選項，其可讓 Amazon Redshift 辨識 SUPER 屬性名稱中的大小寫。這可作為使用 LOWER\$1ATTRIBUTE\$1NAMES 的替代解決方案。如需 `enable_case_sensitive_super_attribute` 的詳細資訊，請前往 [enable\$1case\$1sensitive\$1super\$1attribute](r_enable_case_sensitive_super_attribute.md)。

## 範例
<a name="r_lower_attribute_names_examples"></a>

**將 SUPER 屬性名稱轉換為小寫**  
下列範例使用 LOWER\$1ATTRIBUTE\$1NAMES 來轉換資料表中所有 SUPER 值的屬性名稱。

```
-- Create a table and insert several SUPER values.
CREATE TABLE t (i INT, s SUPER);

INSERT INTO t VALUES
  (1, NULL), 
  (2, 'A'::SUPER),
  (3, JSON_PARSE('{"AttributeName": "B"}')),
  (4, JSON_PARSE(
     '[{"Subobject": {"C": "C"},
        "Subarray": [{"D": "D"}, "E"]
      }]'));

-- Convert all attribute names to lowercase.
UPDATE t SET s = LOWER_ATTRIBUTE_NAMES(s);

SELECT i, s FROM t ORDER BY i;

 i |                        s
---+--------------------------------------------------
 1 | NULL
 2 | "A"
 3 | {"attributename":"B"}
 4 | [{"subobject":{"c":"C"},"subarray":[{"d":"D"}, "E"]}]
```

請注意 LOWER\$1ATTRIBUTE\$1NAMES 的運作方式。
+  NULL 值和純量 SUPER 值 (例如 `"A"`) 會保持不變。
+  在 SUPER 物件中，所有屬性名稱都會變更為小寫，但屬性值 (例如 `"B"`) 則保持不變。
+  LOWER\$1ATTRIBUTE\$1NAMES 會反覆套用至 SUPER 陣列內或其他物件內的任何巢狀 SUPER 物件。

**對擁有重複屬性名稱的 SUPER 物件使用 LOWER\$1ATTRIBUTE\$1NAMES**  
如果 SUPER 物件包含的屬性名稱只有大小寫不同，LOWER\$1ATTRIBUTE\$1NAMES 將會引發錯誤。請考量下列範例。

```
SELECT LOWER_ATTRIBUTE_NAMES(JSON_PARSE('{"A": "A", "a": "a"}'));      

error:   Invalid input
code:    8001
context: SUPER value has duplicate attributes after case conversion.
```

# OBJECT 函數
<a name="r_object_function"></a>

建立 SUPER 資料類型的物件。

## 語法
<a name="r_object_function-synopsis"></a>

```
OBJECT ( [ key1, value1 ], [ key2, value2 ...] )
```

## 引數
<a name="r_object_function-arguments"></a>

*key1, key2*  
計算結果為 VARCHAR 類型字串的運算式。

*value1, value2*  
除了日期時間類型以外的任何 Amazon Redshift 資料類型的運算式，因為 Amazon Redshift 不會將日期時間類型轉換為 SUPER 資料類型。如需日期時間類型的相關資訊，請參閱[日期時間 (Datetime) 類型](r_Datetime_types.md)。  
物件中的 `value` 運算式不需要是相同的資料類型。

## 傳回類型
<a name="r_object_function-returns"></a>

`SUPER`

## 範例
<a name="r_object_function_example"></a>

```
-- Creates an empty object.
select object();

object
--------
{}
(1 row)
            
-- Creates objects with different keys and values.
select object('a', 1, 'b', true, 'c', 3.14);

object
---------------------------
{"a":1,"b":true,"c":3.14}
(1 row)
               
select object('a', object('aa', 1), 'b', array(2,3), 'c', json_parse('{}'));
               
object
---------------------------------
{"a":{"aa":1},"b":[2,3],"c":{}}
(1 row)
            
-- Creates objects using columns from a table.
create table bar (k varchar, v super);
insert into bar values ('k1', json_parse('[1]')), ('k2', json_parse('{}'));
select object(k, v) from bar;

object
------------
{"k1":[1]}
{"k2":{}}
(2 rows)
            
-- Errors out because DATE type values can't be converted to SUPER type.
select object('k', '2008-12-31'::date);

ERROR:  OBJECT could not convert type date to super
```

# OBJECT\$1TRANSFORM 函數
<a name="r_object_transform_function"></a>

變換 SUPER 物件。

## 語法
<a name="r_object_transform_function-synopsis"></a>

```
OBJECT_TRANSFORM(
  input
  [KEEP path1, ...]
  [SET
    path1, value1,
    ...,  ...
  ]
)
```

## 引數
<a name="r_object_transform_function-arguments"></a>

*input*  
解析為 SUPER 類型物件的表達式。

*KEEP*  
在這個子句中指定的所有*路徑*值都會保留，並轉移到輸出物件。  
此子句是選用的。

*path1*、*path2*...  
常數字串常值，採用以句點分隔的雙引號路徑元件的格式。例如，`'"a"."b"."c"'` 是有效的路徑值。這適用於 KEEP 和 SET 子句中的路徑參數。

*SET*  
*path* 和 *value* 配對可修改現有路徑或新增路徑，並在輸出物件中設定該路徑的值。  
此子句是選用的。

*value1*、*value2*...  
解析為 SUPER 類型值的表達式。請注意，數字、文字和布林值類型可以解析為 SUPER。

## 傳回類型
<a name="r_object_transform_function-returns"></a>

`SUPER`

## 使用須知
<a name="r_object_transform_function-usage-notes"></a>

OBJECT\$1TRANSFORM 會傳回 SUPER 類型物件，其中包含來自 KEEP 中指定的 *input*路徑值，以及 SET 中指定的 *path* 和 *value* 對。

如果 KEEP 和 SET 都是空的，OBJECT\$1TRANSFORM 會傳回 *input*。

如果 *input* 不是 SUPER 類型 *object*，則 OBJECT\$1TRANSFORM 會傳回 *input*，而不管任何 KEEP 或 SET 值。

## 範例
<a name="r_object_transform_function-example"></a>

下列範例會將 SUPER 物件轉換成另一個 SUPER 物件。

```
CREATE TABLE employees (
    col_person SUPER
);

INSERT INTO employees
VALUES
    (
        json_parse('
            {
                "name": {
                    "first": "John",
                    "last": "Doe"
                },
                "age": 25,
                "ssn": "111-22-3333",
                "company": "Company Inc.",
                "country": "U.S."
            }
        ')
    ),
    (
        json_parse('
            {
                "name": {
                    "first": "Jane",
                    "last": "Appleseed"
                },
                "age": 34,
                "ssn": "444-55-7777",
                "company": "Organization Org.",
                "country": "Ukraine"
            }
        ')
    )
;

SELECT
    OBJECT_TRANSFORM(
        col_person
        KEEP
            '"name"."first"',
            '"age"',
            '"company"',
            '"country"'
        SET
            '"name"."first"', UPPER(col_person.name.first::TEXT),
            '"age"', col_person.age + 5,
            '"company"', 'Amazon'
    ) AS col_person_transformed
FROM employees;
    
--This result is formatted for ease of reading.
                  col_person_transformed
-------------------------------------------------------------
{
    "name": {
        "first": "JOHN"
    },
    "age": 30,
    "company": "Amazon",
    "country": "U.S."
}
{
    "name": {
        "first": "JANE"
    },
    "age": 39,
    "company": "Amazon",
    "country": "Ukraine"
}
```

# UPPER\$1ATTRIBUTE\$1NAMES 函式
<a name="r_upper_attribute_names"></a>

使用與 [UPPER 函數](r_UPPER.md) 相同的大小寫轉換常式，將 SUPER 值中所有適用的屬性名稱轉換為大寫。UPPER\$1ATTRIBUTE\$1NAMES 支援 UTF-8 多位元組字元，每個字元最多 4 個位元組。

 若要將 SUPER 屬性名稱轉換為小寫，請使用 [LOWER\$1ATTRIBUTE\$1NAMES 函式](r_lower_attribute_names.md)。

## 語法
<a name="r_upper_attribute_names-synopsis"></a>

```
UPPER_ATTRIBUTE_NAMES( super_expression )
```

## 引數
<a name="r_upper_attribute_names-arguments"></a>

*super\$1expression*  
SUPER 表達式。

## 傳回類型
<a name="r_upper_attribute_names-return-type"></a>

`SUPER`

## 範例
<a name="r_upper_attribute_names_examples"></a>

**將 SUPER 屬性名稱轉換為大寫**  
下列範例使用 UPPER\$1ATTRIBUTE\$1NAMES 來轉換資料表中所有 SUPER 值的屬性名稱。

```
-- Create a table and insert several SUPER values.
CREATE TABLE t (i INT, s SUPER);

INSERT INTO t VALUES
  (1, NULL), 
  (2, 'a'::SUPER),
  (3, JSON_PARSE('{"AttributeName": "b"}')),
  (4, JSON_PARSE(
     '[{"Subobject": {"c": "c"},
        "Subarray": [{"d": "d"}, "e"]
      }]'));

-- Convert all attribute names to uppercase.
UPDATE t SET s = UPPER_ATTRIBUTE_NAMES(s);

SELECT i, s FROM t ORDER BY i;

 i |                        s
---+--------------------------------------------------
 1 | NULL
 2 | "a"
 3 | {"ATTRIBUTENAME":"B"}
 4 | [{"SUBOBJECT":{"C":"c"},"SUBARRAY":[{"D":"d"}, "e"]}]
```

請注意 UPPER\$1ATTRIBUTE\$1NAMES 的運作方式。
+  NULL 值和純量 SUPER 值 (例如 `"a"`) 會保持不變。
+  在 SUPER 物件中，所有屬性名稱都會變更為大寫，但屬性值 (例如 `"b"`) 則保持不變。
+  UPPER\$1ATTRIBUTE\$1NAMES 會反覆套用至 SUPER 陣列內或其他物件內的任何巢狀 SUPER 物件。

**對擁有重複屬性名稱的 SUPER 物件使用 UPPER\$1ATTRIBUTE\$1NAMES**  
如果 SUPER 物件包含的屬性名稱只有大小寫不同，UPPER\$1ATTRIBUTE\$1NAMES 將會引發錯誤。請考量下列範例。

```
SELECT UPPER_ATTRIBUTE_NAMES(JSON_PARSE('{"A": "A", "a": "a"}'));      

error:   Invalid input
code:    8001
context: SUPER value has duplicate attributes after case conversion.
```

# 空間函數
<a name="geospatial-functions"></a>

幾何物件之間的關係是以維度延伸九交模型 (DE-9IM) 為基礎。這個模型定義了如相等、包含和涵蓋等述詞。如需空間關係定義的相關資訊，請參閱 Wikipedia 中的 [DE-9IM](https://en.wikipedia.org/wiki/DE-9IM)。

如需如何將空間資料與 Amazon Redshift 搭配使用的相關資訊，請參閱[在 Amazon Redshift 中查詢空間資料](geospatial-overview.md)。

Amazon Redshift 提供了可與 `GEOMETRY` 和 `GEOGRAPHY` 資料類型一起使用的空間函數。以下列出支援 `GEOGRAPHY` 資料類型的函數：
+ [ST\$1Area](ST_Area-function.md)
+ [ST\$1AsEWKT](ST_AsEWKT-function.md)
+ [ST\$1AsGeoJSON](ST_AsGeoJSON-function.md)
+ [ST\$1AsHexEWKB](ST_AsHexEWKB-function.md)
+ [ST\$1AsHexWKB](ST_AsHexWKB-function.md)
+ [ST\$1AsText](ST_AsText-function.md)
+ [ST\$1Distance](ST_Distance-function.md)
+ [ST\$1GeogFromText](ST_GeogFromText-function.md)
+ [ST\$1GeogFromWKB](ST_GeogFromWKB-function.md)
+ [ST\$1Length](ST_Length-function.md)
+ [ST\$1NPoints](ST_NPoints-function.md)
+ [ST\$1Perimeter](ST_Perimeter-function.md)

以下列出 Amazon Redshift 支援的完整空間函數集。

**Topics**
+ [AddBBox](AddBBox-function.md)
+ [DropBBox](DropBBox-function.md)
+ [GeometryType](GeometryType-function.md)
+ [H3\$1Boundary](H3_Boundary-function.md)
+ [H3\$1Center](H3_Center-function.md)
+ [H3\$1FromLongLat](H3_FromLongLat-function.md)
+ [H3\$1FromPoint](H3_FromPoint-function.md)
+ [H3\$1IsValid](H3_IsValid-function.md)
+ [H3\$1Polyfill](H3_Polyfill-function.md)
+ [H3\$1解析度](H3_Resolution-function.md)
+ [H3\$1ToChildren](H3_ToChildren-function.md)
+ [H3\$1ToParent](H3_ToParent-function.md)
+ [ST\$1AddPoint](ST_AddPoint-function.md)
+ [ST\$1Angle](ST_Angle-function.md)
+ [ST\$1Area](ST_Area-function.md)
+ [ST\$1AsBinary](ST_AsBinary-function.md)
+ [ST\$1AsEWKB](ST_AsEWKB-function.md)
+ [ST\$1AsEWKT](ST_AsEWKT-function.md)
+ [ST\$1AsGeoJSON](ST_AsGeoJSON-function.md)
+ [ST\$1AsHexWKB](ST_AsHexWKB-function.md)
+ [ST\$1AsHexEWKB](ST_AsHexEWKB-function.md)
+ [ST\$1AsText](ST_AsText-function.md)
+ [ST\$1Azimuth](ST_Azimuth-function.md)
+ [ST\$1Boundary](ST_Boundary-function.md)
+ [ST\$1Buffer](ST_Buffer-function.md)
+ [ST\$1Centroid](ST_Centroid-function.md)
+ [ST\$1Collect](ST_Collect-function.md)
+ [ST\$1Contains](ST_Contains-function.md)
+ [ST\$1ContainsProperly](ST_ContainsProperly-function.md)
+ [ST\$1ConvexHull](ST_ConvexHull-function.md)
+ [ST\$1CoveredBy](ST_CoveredBy-function.md)
+ [ST\$1Covers](ST_Covers-function.md)
+ [ST\$1Crosses](ST_Crosses-function.md)
+ [ST\$1Dimension](ST_Dimension-function.md)
+ [ST\$1Disjoint](ST_Disjoint-function.md)
+ [ST\$1Distance](ST_Distance-function.md)
+ [ST\$1DistanceSphere](ST_DistanceSphere-function.md)
+ [ST\$1DWithin](ST_DWithin-function.md)
+ [ST\$1EndPoint](ST_EndPoint-function.md)
+ [ST\$1Envelope](ST_Envelope-function.md)
+ [ST\$1Equals](ST_Equals-function.md)
+ [ST\$1ExteriorRing](ST_ExteriorRing-function.md)
+ [ST\$1Force2D](ST_Force2D-function.md)
+ [ST\$1Force3D](ST_Force3D-function.md)
+ [ST\$1Force3DM](ST_Force3DM-function.md)
+ [ST\$1Force3DZ](ST_Force3DZ-function.md)
+ [ST\$1Force4D](ST_Force4D-function.md)
+ [ST\$1GeoHash](ST_GeoHash-function.md)
+ [ST\$1GeogFromText](ST_GeogFromText-function.md)
+ [ST\$1GeogFromWKB](ST_GeogFromWKB-function.md)
+ [ST\$1GeometryN](ST_GeometryN-function.md)
+ [ST\$1GeometryType](ST_GeometryType-function.md)
+ [ST\$1GeomFromEWKB](ST_GeomFromEWKB-function.md)
+ [ST\$1GeomFromEWKT](ST_GeomFromEWKT-function.md)
+ [ST\$1GeomFromGeoHash](ST_GeomFromGeoHash-function.md)
+ [ST\$1GeomFromGeoJSON](ST_GeomFromGeoJSON-function.md)
+ [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md)
+ [ST\$1GeomFromText](ST_GeomFromText-function.md)
+ [ST\$1GeomFromWKB](ST_GeomFromWKB-function.md)
+ [ST\$1GeoSquare](ST_GeoSquare-function.md)
+ [ST\$1InteriorRingN](ST_InteriorRingN-function.md)
+ [ST\$1Intersects](ST_Intersects-function.md)
+ [ST\$1Intersection](ST_Intersection-function.md)
+ [ST\$1IsPolygonCCW](ST_IsPolygonCCW-function.md)
+ [ST\$1IsPolygonCW](ST_IsPolygonCW-function.md)
+ [ST\$1IsClosed](ST_IsClosed-function.md)
+ [ST\$1IsCollection](ST_IsCollection-function.md)
+ [ST\$1IsEmpty](ST_IsEmpty-function.md)
+ [ST\$1IsRing](ST_IsRing-function.md)
+ [ST\$1IsSimple](ST_IsSimple-function.md)
+ [ST\$1IsValid](ST_IsValid-function.md)
+ [ST\$1Length](ST_Length-function.md)
+ [ST\$1LengthSphere](ST_LengthSphere-function.md)
+ [ST\$1Length2D](ST_Length2D-function.md)
+ [ST\$1LineFromMultiPoint](ST_LineFromMultiPoint-function.md)
+ [ST\$1LineInterpolatePoint](ST_LineInterpolatePoint-function.md)
+ [ST\$1M](ST_M-function.md)
+ [ST\$1MakeEnvelope](ST_MakeEnvelope-function.md)
+ [ST\$1MakeLine](ST_MakeLine-function.md)
+ [ST\$1MakePoint](ST_MakePoint-function.md)
+ [ST\$1MakePolygon](ST_MakePolygon-function.md)
+ [ST\$1MemSize](ST_MemSize-function.md)
+ [ST\$1MMax](ST_MMax-function.md)
+ [ST\$1MMin](ST_MMin-function.md)
+ [ST\$1Multi](ST_Multi-function.md)
+ [ST\$1NDims](ST_NDims-function.md)
+ [ST\$1NPoints](ST_NPoints-function.md)
+ [ST\$1NRings](ST_NRings-function.md)
+ [ST\$1NumGeometries](ST_NumGeometries-function.md)
+ [ST\$1NumInteriorRings](ST_NumInteriorRings-function.md)
+ [ST\$1NumPoints](ST_NumPoints-function.md)
+ [ST\$1Perimeter](ST_Perimeter-function.md)
+ [ST\$1Perimeter2D](ST_Perimeter2D-function.md)
+ [ST\$1Point](ST_Point-function.md)
+ [ST\$1PointN](ST_PointN-function.md)
+ [ST\$1Points](ST_Points-function.md)
+ [ST\$1Polygon](ST_Polygon-function.md)
+ [ST\$1RemovePoint](ST_RemovePoint-function.md)
+ [ST\$1Reverse](ST_Reverse-function.md)
+ [ST\$1SetPoint](ST_SetPoint-function.md)
+ [ST\$1SetSRID](ST_SetSRID-function.md)
+ [ST\$1Simplify](ST_Simplify-function.md)
+ [ST\$1SRID](ST_SRID-function.md)
+ [ST\$1StartPoint](ST_StartPoint-function.md)
+ [ST\$1Touches](ST_Touches-function.md)
+ [ST\$1Transform](ST_Transform-function.md)
+ [ST\$1Union](ST_Union-function.md)
+ [ST\$1Within](ST_Within-function.md)
+ [ST\$1X](ST_X-function.md)
+ [ST\$1XMax](ST_XMax-function.md)
+ [ST\$1XMin](ST_XMin-function.md)
+ [ST\$1Y](ST_Y-function.md)
+ [ST\$1YMax](ST_YMax-function.md)
+ [ST\$1YMin](ST_YMin-function.md)
+ [ST\$1Z](ST_Z-function.md)
+ [ST\$1ZMax](ST_ZMax-function.md)
+ [ST\$1ZMin](ST_ZMin-function.md)
+ [SupportsBBox](SupportsBBox-function.md)

# AddBBox
<a name="AddBBox-function"></a>

AdDbBox 會傳回支援使用預先計算的週框方塊編碼輸入幾何的副本。如需週框方塊支援的相關資訊，請參閱[邊界框](spatial-terminology.md#spatial-terminology-bounding-box)。

## 語法
<a name="AddBBox-function-syntax"></a>

```
AddBBox(geom)
```

## 引數
<a name="AddBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="AddBBox-function-return"></a>

`GEOMETRY`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="AddBBox-function-examples"></a>

下列 SQL 會傳回支援使用週框方塊編碼的輸入多邊形幾何的副本。

```
SELECT ST_AsText(AddBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
 st_astext
----------
 POLYGON((0 0,1 0,0 1,0 0))
```

# DropBBox
<a name="DropBBox-function"></a>

DropbBox 會傳回不支援使用預先計算的邊界方框編碼的輸入幾何副本。如需週框方塊支援的相關資訊，請參閱[邊界框](spatial-terminology.md#spatial-terminology-bounding-box)。

## 語法
<a name="DropBBox-function-syntax"></a>

```
DropBBox(geom)
```

## 引數
<a name="DropBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="DropBBox-function-return"></a>

`GEOMETRY`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="DropBBox-function-examples"></a>

以下 SQL 會傳回不支援使用週框方塊編碼之輸入多邊形幾何的副本。

```
SELECT ST_AsText(DropBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
 st_astext
----------
 POLYGON((0 0,1 0,0 1,0 0))
```

# GeometryType
<a name="GeometryType-function"></a>

GeometryType 函數會將輸入幾何的子類型做為字串傳回。

## 語法
<a name="GeometryType-function-syntax"></a>

```
GeometryType(geom)
```

## 引數
<a name="GeometryType-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="GeometryType-function-return"></a>

`VARCHAR` 表示 *geom* 的子類型。

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 傳回 2D、3DZ、4D 幾何的字串值 | 傳回 3DM 幾何的字串值 | 幾何子類型 | 
| --- | --- | --- | 
| `POINT` | `POINTM` | 在 *geom* 是 `POINT` 子類型時傳回  | 
| `LINESTRING` | `LINESTRINGM` | 在 *geom* 是 `LINESTRING` 子類型時傳回  | 
| `POLYGON` | `POLYGONM` | 在 *geom* 是 `POLYGON` 子類型時傳回  | 
| `MULTIPOINT` | `MULTIPOINTM` | 在 *geom* 是 `MULTIPOINT` 子類型時傳回  | 
| `MULTILINESTRING` | `MULTILINESTRINGM` | 在 *geom* 是 `MULTILINESTRING` 子類型時傳回  | 
| `MULTIPOLYGON` | `MULTIPOLYGONM` | 在 *geom* 是 `MULTIPOLYGON` 子類型時傳回  | 
| `GEOMETRYCOLLECTION` | `GEOMETRYCOLLECTIONM` | 在 *geom* 是 `GEOMETRYCOLLECTION` 子類型時傳回  | 

## 範例
<a name="GeometryType-function-examples"></a>

以下 SQL 會轉換多邊形的已知文字 (WKT) 表示法，並將 `GEOMETRY` 子類型做為字串傳回。

```
SELECT GeometryType(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
geometrytype
-------------
 POLYGON
```

# H3\$1Boundary
<a name="H3_Boundary-function"></a>

H3\$1Boundary 會從輸入索引傳回 H3 儲存格 ID 的邊界。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_Boundary-function-syntax"></a>

```
H3_Boundary(index)
```

## 引數
<a name="H3_Boundary-function-arguments"></a>

 *索引*   
`BIGINT` 或 `VARCHAR` 資料類型的值，代表 H3 儲存格的索引。或者，評估為其中一種資料類型的表達式。

## 傳回類型
<a name="H3_Boundary-function-return"></a>

`POLYGON` - 代表空間參考系統識別碼 (SRID) 為 `0` 的多邊形。

如果 *index* 無效，則會傳回錯誤。

## 範例
<a name="H3_Boundary-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格索引的 `VARCHAR`，並傳回 SRID 0 的 POLYGON，代表輸入 H3 儲存格的邊界。H3\$1Boundary 的輸出會輸入至 ST\$1AwEWKT，並以擴充已知文字 (EWKT) 表示法顯示。

```
SELECT ST_AsEWKT(H3_Boundary('8025fffffffffff'));
```

```
 st_asewkt
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POLYGON((87.7729641223953 52.6542030078627,86.7082098104731 40.3127667561966,98.2285042557705 33.6210697806835,110.694610548823 37.163896485796,116.212895637138 47.3094513028131,106.40349563788 56.210610737585,87.7729641223953 52.6542030078627))
```

下列 SQL 會輸入代表 H3 儲存格索引的 `BIGINT`，並傳回 SRID 0 的 POLYGON，代表輸入 H3 儲存格的邊界。H3\$1Boundary 的輸出會輸入至 ST\$1AwEWKT，並以擴充已知文字 (EWKT) 表示法顯示。

```
SELECT ST_AsEWKT(H3_Boundary(577129255373111295)); 
```

```
 st_asewkt
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((87.7729641223953 52.6542030078627,86.7082098104731 40.3127667561966,98.2285042557705 33.6210697806835,110.694610548823 37.163896485796,116.212895637138 47.3094513028131,106.40349563788 56.210610737585,87.7729641223953 52.6542030078627))
```

# H3\$1Center
<a name="H3_Center-function"></a>

H3\$1Center 會從輸入索引傳回 H3 儲存格 ID 的質心。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_Center-function-syntax"></a>

```
H3_Center(index)
```

## 引數
<a name="H3_Center-function-arguments"></a>

 *索引*   
`BIGINT` 或 `VARCHAR` 資料類型的值，代表 H3 儲存格的索引。或者，評估為其中一種資料類型的表達式。

## 傳回類型
<a name="H3_Center-function-return"></a>

`POINT` - 代表空間參考系統識別碼 (SRID) 為 `0` 的 H3 儲存格質心。

如果 *index* 無效，則會傳回錯誤。

## 範例
<a name="H3_Center-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格索引的 `VARCHAR`，並傳回 SRID 為 0 的 POINT，代表輸入 H3 儲存格質心。

```
SELECT H3_Center('8025fffffffffff');
```

```
 h3_center
--------------------------------------------
 010100000070707A550B605940AEE9D70B327E4640
```

下列 SQL 會輸入代表 H3 儲存格索引的 `BIGINT`，並傳回 SRID 0 的 POINT，代表輸入 H3 儲存格質心。

```
SELECT H3_Center(577129255373111295);
```

```
 h3_center
--------------------------------------------
 010100000070707A550B605940AEE9D70B327E4640
```

下列 SQL 會輸入代表 H3 儲存格索引的 `VARCHAR`，並傳回 SRID 0 的 POINT，代表輸入 H3 儲存格質心。H3\$1Center 的輸出會輸入至 ST\$1AwEWKT，並以擴充已知文字 (EWKT) 表示法顯示。

```
SELECT ST_AsEWKT(H3_Center('8075fffffffffff'));
```

```
 st_asewkt
-----------------------------------------
POINT(-5.24539029677733 2.30088211162675)
```

# H3\$1FromLongLat
<a name="H3_FromLongLat-function"></a>

H3\$1fromlonglat 會從輸入的經度、緯度和解析度傳回對應的 H3 儲存格 ID。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_FromLongLat-function-syntax"></a>

```
H3_FromLongLat(longitude, latitude, resolution)
```

## 引數
<a name="H3_FromLongLat-function-arguments"></a>

 *經度*   
`DOUBLE PRECISION` 資料類型的值，或是評估為 `DOUBLE PRECISION` 類型的表達式。

 *緯度*   
`DOUBLE PRECISION` 資料類型的值，或是評估為 `DOUBLE PRECISION` 類型的表達式。

 *解析度*   
`INTEGER` 資料類型的值，或是評估為 `INTEGER` 類型的表達式。該值表示 H3 網格系統的解析度。該值必須是介於 0 和 15 之間的整數。`0` 是最普遍的，`15` 是最好。

## 傳回類型
<a name="H3_FromLongLat-function-return"></a>

`BIGINT`— 代表 H3 儲存格 ID。

如果*解析度*超出範圍，則會傳回錯誤。

## 範例
<a name="H3_FromLongLat-function-examples"></a>

下列 SQL 會從經度 `0`、緯度 `0` 和解析度 `10` 傳回 H3 儲存格 ID。

```
SELECT H3_FromLongLat(0, 0, 10);
```

```
 h3_fromlonglat
-------------------
 623560421467684863
```

# H3\$1FromPoint
<a name="H3_FromPoint-function"></a>

H3\$1FromPoint 會從輸入幾何點和解析度傳回對應的 H3 儲存格 ID。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_FromPoint-function-syntax"></a>

```
H3_FromPoint(geom, resolution)
```

## 引數
<a name="H3_FromPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。*geom* 必須是 `POINT`。

 *解析度*   
`INTEGER` 資料類型的值，或是評估為 `INTEGER` 類型的表達式。該值表示 H3 網格系統的解析度。該值必須是介於 0 和 15 之間的整數。`0` 是最普遍的，`15` 是最好。

## 傳回類型
<a name="H3_FromPoint-function-return"></a>

`BIGINT`— 代表 H3 儲存格 ID。

如果 *geom* 不是 `POINT`，則會傳回錯誤。

如果*解析度*超出範圍，則會傳回錯誤。

如果 *geom* 為空白，則會傳回 NULL。

## 範例
<a name="H3_FromPoint-function-examples"></a>

下方的 SQL 從點 `0,0` 和解析度 `10` 傳回 H3 儲存格 ID。

```
SELECT H3_FromPoint(ST_GeomFromText('POINT(0 0)'), 10);
```

```
 h3_frompoint
-------------------
 623560421467684863
```

# H3\$1IsValid
<a name="H3_IsValid-function"></a>

如果輸入代表 H3 儲存格 ID，H3\$1IsValid 會傳回 true，否則為 false。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_IsValid-function-syntax"></a>

```
H3_IsValid(index)
```

## 引數
<a name="H3_IsValid-function-arguments"></a>

 *索引*   
資料類型 `BIGINT`或 的值`VARCHAR`，或評估為其中一個資料類型的表達式。

## 傳回類型
<a name="H3_IsValid-function-return"></a>

`BOOLEAN` – 如果輸入代表有效的 H3 儲存格 ID，則為 true，否則為 false。

如果*索引*為 NULL，則會傳回 NULL。

## 範例
<a name="H3_IsValid-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格 ID 的 VARCHAR，並傳回 true。

```
SELECT H3_IsValid('8025fffffffffff');
```

```
 h3_isvalid
------------
 true
```

下列 SQL 會輸入代表 H3 儲存格 ID 的 BIGINT，並傳回 true。

```
SELECT H3_IsValid(577129255373111295);
```

```
 h3_isvalid
------------
 true
```

下列 SQL 會輸入無效的 H3 儲存格 ID，並傳回 false。

```
SELECT H3_IsValid('');
```

```
 h3_isvalid
------------
 false
```

# H3\$1Polyfill
<a name="H3_Polyfill-function"></a>

H3\$1Polyfill 會傳回對應於指定解析度之輸入多邊形中包含的六邊形和五邊形的對應 H3 儲存格 ID。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_Polyfill-function-syntax"></a>

```
H3_Polyfill(geom, resolution)
```

## 引數
<a name="H3_Polyfill-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。*geom* 必須是 `POLYGON`。

 *解析度*   
`INTEGER` 資料類型的值，或是評估為 `INTEGER` 類型的表達式。該值表示 H3 網格系統的解析度。該值必須是介於 0 和 15 之間的整數。`0` 是最普遍的，`15` 是最好。

## 傳回類型
<a name="H3_Polyfill-function-return"></a>

`SUPER`— 代表 H3 儲存格 ID 的清單。

如果 *geom* 不是 `POLYGON`，則會傳回錯誤。

如果*解析度*超出範圍，則會傳回錯誤。

如果 *geom* 為空白，則會傳回 NULL。

## 範例
<a name="H3_Polyfill-function-examples"></a>

下方的 SQL 會從多邊形和解析度 `4` 傳回 H3 儲存格 ID 的 SUPER 資料類型陣列。

```
SELECT H3_Polyfill(ST_GeomFromText('POLYGON((0 0, 0 1, 1 1, 1 0, 0 0))'), 4);
```

```
 h3_polyfill
----------------------------------------------------------------------------------------------------------------------------------------------------------
 [596538848238895103,596538805289222143,596538856828829695,596538813879156735,596537920525959167,596538685030137855,596538693620072447,596538839648960511]
```

# H3\$1解析度
<a name="H3_Resolution-function"></a>

H3\$1Resolution 會從輸入索引傳回 H3 儲存格 ID 的解析度。解析度是從 0 （最粗） 到 15 （最深） 的整數。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_Resolution-function-syntax"></a>

```
H3_Resolution(index)
```

## 引數
<a name="H3_Resolution-function-arguments"></a>

 *索引*   
資料類型的值 `BIGINT`或 `VARCHAR`代表 H3 儲存格的索引，或評估為其中一個資料類型的表達式。

## 傳回類型
<a name="H3_Resolution-function-return"></a>

`INTEGER` – 代表輸入 H3 儲存格 ID 的解析度。

如果*索引*為 NULL，則會傳回 NULL。

如果 *index* 無效，則會傳回錯誤。

## 範例
<a name="H3_Resolution-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格索引的 VARCHAR，並傳回代表輸入 H3 儲存格解析度的 INTEGER。

```
SELECT H3_Resolution('8025fffffffffff');
```

```
 h3_resolution
---------------
 0
```

下列 SQL 會輸入代表 H3 儲存格索引的 BIGINT，並傳回代表輸入 H3 儲存格解析度的 INTEGER。

```
SELECT H3_Resolution(614553222213795839);
```

```
 h3_resolution
---------------
 8
```

# H3\$1ToChildren
<a name="H3_ToChildren-function"></a>

H3\$1ToChildren 會傳回指定 H3 索引之特定解析度的子 H3 儲存格 IDs 清單。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_ToChildren-function-syntax"></a>

```
H3_ToChildren(index, resolution)
```

## 引數
<a name="H3_ToChildren-function-arguments"></a>

 *索引*   
資料類型的值 `BIGINT`或 `VARCHAR`代表 H3 儲存格的索引，或評估為其中一個資料類型的表達式。

 *解析度*   
`INTEGER` 資料類型的值，或是評估為 `INTEGER` 類型的表達式。此值代表子儲存格 IDs的解析度。該值必須是輸入*索引*的解析度與 15 之間的整數，包含在內。

## 傳回類型
<a name="H3_ToChildren-function-return"></a>

`SUPER`— 代表 H3 儲存格 ID 的清單。

如果*索引*或*解析度*為 NULL，則會傳回 NULL。

如果 *index* 無效，則會傳回錯誤。

如果*解析度*不在*索引*的解析度和包含 15 之間，則會傳回錯誤。

如果輸出大小超過最大 SUPER 大小限制，則會傳回錯誤。

## 範例
<a name="H3_ToChildren-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格索引的 VARCHAR，以及代表所有子項所需解析度的 INTEGER，並以解析度 6 傳回包含子項的 SUPER 陣列。

```
SELECT H3_ToChildren('85283473fffffff', 6);
```

```
 h3_tochildren                                                
--------------------------------------------------------------------------------------------------------------------------------------
 [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]
```

下列 SQL 會輸入代表 H3 儲存格索引的 BIGINT，以及代表所有子項所需解析度的 INTEGER，並以解析度 6 傳回包含子項的 SUPER 陣列。

```
SELECT H3_ToChildren(599686042433355775, 6);
```

```
 h3_tochildren                                              
--------------------------------------------------------------------------------------------------------------------------------------
 [604189641121202175,604189641255419903,604189641389637631,604189641523855359,604189641658073087,604189641792290815,604189641926508543]
```

注意：*解析度*和*索引*解析度之間的差異為 7 或更少是安全的。

下列範例示範超過 SUPER 大小限制的查詢解決方法。當輸入 H3 索引與所需子解析度之間的解析度差異過大 （大於 7) 時。此程序透過以較小的步驟逐步擴展子系 （一次最多 5 個解析度層級），並將最終結果儲存在使用者建立的資料表中，來解決問題。

```
CREATE OR REPLACE PROCEDURE generate_h3_children()
LANGUAGE plpgsql
AS $$
BEGIN
    -- Drop and create h3_children table that will contain the results
    DROP TABLE IF EXISTS h3_children;
    CREATE TABLE h3_children (
        h3_index BIGINT,
        child_res INTEGER,
        children SUPER
    );

    -- Create temporary table for steps
    DROP TABLE IF EXISTS h3_steps;
    CREATE TABLE h3_steps (
        h3_index BIGINT,
        current_res INTEGER,
        target_res INTEGER,
        h3_array SUPER
    );

    -- Initial insert into h3_steps
    INSERT INTO h3_steps
    SELECT h3_index, H3_Resolution(h3_index), child_res, ARRAY(h3_index)
    FROM h3_indexes; -- Insert from your table with h3_index and child_res as columns

    -- Loop until we reach target resolution
    -- We expect at most 3 iterations considering that we can start at resolution
    -- 0 and target/child resolution equal to 15 (0 -> 5 -> 10 -> 15)
    WHILE EXISTS (
        SELECT 1
        FROM h3_steps h
        GROUP BY h3_index, target_res
        HAVING MAX(current_res) < target_res
    ) LOOP
        -- Populate the h3_steps table with the tables that need to
        -- reach closer to the target res
        INSERT INTO h3_steps
        SELECT
            h.h3_index,
            LEAST(h.current_res + 5, h.target_res), -- Do not exceed target res
            h.target_res,
            -- Take the children of the child cell at resolution current_res of the
            -- h3_index
            H3_ToChildren(c.child::BIGINT, LEAST(h.current_res + 5, h.target_res))
        FROM h3_steps h, UNNEST(h.h3_array) AS c(child)
        WHERE h.current_res < h.target_res
        AND h.current_res = (SELECT MAX(current_res)
                           FROM h3_steps
                           WHERE h3_index = h.h3_index
        );
    END LOOP;

    -- Store final results
    INSERT INTO h3_children
    SELECT h3_index AS h3_index, target_res AS child_res, h3_array AS children
    FROM h3_steps
    WHERE current_res = target_res;
END;
$$;

-- Create the source table for H3_ToChildren queries
CREATE TABLE h3_indexes (
    h3_index BIGINT,
    child_res INTEGER,
    PRIMARY KEY (h3_index, child_res)
);
INSERT INTO h3_indexes (h3_index, child_res)
VALUES (x'8001fffffffffff'::BIGINT, 11);

-- Execute the procedure
CALL generate_h3_children();

-- View results
SELECT * FROM h3_children;
```

# H3\$1ToParent
<a name="H3_ToParent-function"></a>

H3\$1ToParent 會以指定 H3 索引的父解析度傳回父 H3 儲存格 ID。如需 H3 索引的詳細資訊，請參閱 [H3](spatial-terminology.md#spatial-terminology-h3)。

## 語法
<a name="H3_ToParent-function-syntax"></a>

```
H3_ToParent(index, resolution)
```

## 引數
<a name="H3_ToParent-function-arguments"></a>

 *索引*   
資料類型的值 `BIGINT`或 `VARCHAR`代表 H3 儲存格的索引，或評估為其中一個資料類型的表達式。

 *解析度*   
`INTEGER` 資料類型的值，或是評估為 `INTEGER` 類型的表達式。此值代表父儲存格 ID 的解析度。值必須介於 0 和*索引*的解析度之間，包括 。

## 傳回類型
<a name="H3_ToParent-function-return"></a>

`BIGINT` – 代表父系的 H3 儲存格 ID。

如果*索引*或*解析度*為 NULL，則會傳回 NULL。

如果 *index* 無效，則會傳回錯誤。

如果*解析度*小於 0 或大於*索引*解析度，則會傳回錯誤。

## 範例
<a name="H3_ToParent-function-examples"></a>

下列 SQL 會輸入代表 H3 儲存格索引的 VARCHAR，以及代表所需父項之所需解析度的 INTEGER，並傳回代表輸入 H3 儲存格解析度 0 之父項的 BIGINT。

```
SELECT H3_ToParent('85283473fffffff', 0);
```

```
 h3_toparent
--------------------
 577199624117288959
```

下列 SQL 會輸入代表 H3 儲存格索引的 BIGINT，以及代表所需父項之所需解析度的 INTEGER，並傳回代表輸入 H3 儲存格解析度 0 之父項的 BIGINT。

```
SELECT H3_ToParent(646078419604526808, 8);
```

```
 h3_toparent
--------------------
 614553222213795839
```

# ST\$1AddPoint
<a name="ST_AddPoint-function"></a>

ST\$1AddPoint 傳回的 linestring 幾何與已新增點的輸入幾何相同。如果提供索引，則點會新增在索引位置。如果索引為 -1 或未提供，則點附加至 linestring。

索引是以零開始。結果的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。

傳回幾何的維度與 *geom1* 值的維度相同。如果 *geom1* 和 *geom2* 具有不同的維度，則將 *geom2* 投影到 *geom1* 的維度。

## 語法
<a name="ST_AddPoint-function-syntax"></a>

```
ST_AddPoint(geom1, geom2)
```

```
ST_AddPoint(geom1, geom2, index)
```

## 引數
<a name="ST_AddPoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。該點可以是空點。

 *索引*   
資料類型 `INTEGER` 的值，代表以零開始的索引位置。

## 傳回類型
<a name="ST_AddPoint-function-return"></a>

`GEOMETRY` 

如果 *geom1*、*geom2* 或 *index* 為 Null，則會傳回 Null。

如果 *geom2* 是空點，則傳回 *geom1* 的副本。

如果 *geom1* 不是 `LINESTRING`，則會傳回錯誤。

如果 *geom2* 不是 `POINT`，則會傳回錯誤。

如果 *index* 超出範圍，則會傳回錯誤。索引位置的有效值是 -1 或是介於 0 與 `ST_NumPoints(geom1)` 之間的值。

## 範例
<a name="ST_AddPoint-function-examples"></a>

下列 SQL 會將一點新增到 linestring，使其成為一個封閉的 linestring。

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_AddPoint(g, ST_StartPoint(g))) FROM tmp;
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5,0 5,0 0)
```

下列 SQL 會將一點新增到 linestring 中的特定位置。

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_AddPoint(g, ST_SetSRID(ST_Point(5, 10), 4326), 3)) FROM tmp;
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 10,5 5,0 5)
```

# ST\$1Angle
<a name="ST_Angle-function"></a>

ST\$1Angle 傳回以弧度為單位順時針測量的點之間的角度，如下所示：
+ 如果輸入三個點，則將測量傳回的角度 P1-P2-P3，就像繞 P2 順時針從 P1 旋轉到 P3 獲得的角度一樣。
+ 如果輸入四個點，則傳回由有向線 P1-P2 和 P3-P4 形成的順時針角度。如果輸入是退化情況 (也就是說，P1 等於 P2，或 P3 等於 P4)，則傳回 null。

傳回值以弧度為單位，範圍為 [0, 2π)。

ST\$1Angle 對輸入幾何的 2D 投影進行操作。

## 語法
<a name="ST_Angle-function-syntax"></a>

```
ST_Angle(geom1, geom2, geom3)
```

```
ST_Angle(geom1, geom2, geom3, geom4)
```

## 引數
<a name="ST_Angle-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。

 *geom3*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。

 *geom4*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。

## 傳回類型
<a name="ST_Angle-function-return"></a>

`DOUBLE PRECISION`. 

如果 *geom1* 等於 *geom2*，或 *geom2* 等於 *geom3*，則傳回 null。

如果 *geom1*、*geom2*、*geom3* 或 *geom4* 為 null，則傳回 null。

如果 *geom1*、*geom2*、*geom3* 或 *geom4* 的任一個是空點，則會傳回錯誤。

如果 *geom1*、*geom2*、*geom3* 和 *geom4* 的空間參考系統識別碼 (SRID) 值不同，則會傳回錯誤。

## 範例
<a name="ST_Angle-function-examples"></a>

下列 SQL 會傳回三個輸入點轉換為度數的角度。

```
SELECT ST_Angle(ST_Point(1,1), ST_Point(0,0), ST_Point(1,0)) / Pi() * 180.0 AS angle;
```

```
 angle
---------------
    45
```

下列 SQL 會傳回四個輸入點轉換為度數的角度。

```
SELECT ST_Angle(ST_Point(1,1), ST_Point(0,0), ST_Point(1,0), ST_Point(2,0)) / Pi() * 180.0 AS angle;
```

```
 angle
---------------
   225
```

# ST\$1Area
<a name="ST_Area-function"></a>

對於輸入幾何，ST\$1Area 傳回 2D 投影的笛卡爾面積。面積單位與表示輸入幾何座標的單位相同。對於點、linestring、multipoint 和 multilinestring，函數會傳回 0。對於幾何集合，它會傳回集合中幾何面積的總和。

對於輸入地理，ST\$1Area 會傳回在球體 (由 SRID 決定) 上所計算輸入面積地理之 2D 投影的測地線面積。長度單位為平方公尺。對於點、multipoint 和線形地理，此函數會傳回零 (0)。當輸入為幾何集合時，此函數會傳回集合中面積地理的面積總和。

## 語法
<a name="ST_Area-function-syntax"></a>

```
ST_Area(geo)
```

## 引數
<a name="ST_Area-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_Area-function-return"></a>

`DOUBLE PRECISION`

如果 *geo* 為 null，則傳回 null。

## 範例
<a name="ST_Area-function-examples"></a>

下列 SQL 會傳回 multipolygon 的笛卡爾面積。

```
SELECT ST_Area(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_area
---------
     100
```

以下 SQL 傳回地理中多邊形的面積。

```
SELECT ST_Area(ST_GeogFromText('polygon((34 35, 28 30, 25 34, 34 35))'));
```

```
     st_area
------------------
 201824655743.383
```

下列 SQL 針對線性地理傳回零。

```
SELECT ST_Area(ST_GeogFromText('multipoint(0 0, 1 1, -21.32 121.2)'));
```

```
 st_area
---------
       0
```

# ST\$1AsBinary
<a name="ST_AsBinary-function"></a>

ST\$1AsBinary 會傳回輸入幾何的十六進位已知二進位 (WKB) 表示法。對於 3DZ、3DM 和 4D 幾何，ST\$1AsBinary 使用開放地理空間聯盟 (OGC) 標準值作為幾何類型。

## 語法
<a name="ST_AsBinary-function-syntax"></a>

```
ST_AsBinary(geom)
```

## 引數
<a name="ST_AsBinary-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_AsBinary-function-return"></a>

`VARBYTE`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_AsBinary-function-examples"></a>

以下 SQL 會傳回多邊形的十六進位 WKB 表示法。

```
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_asbinary
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsEWKB
<a name="ST_AsEWKB-function"></a>

ST\$1AsEWKB 會傳回輸入幾何的擴充已知二進位 (EWKB) 表示法。對於 3DZ、3DM 和 4D 幾何，ST\$1AsEWKB 使用開放地理空間聯盟 (OGC) 標準值作為幾何類型。

## 語法
<a name="ST_AsEWKB-function-syntax"></a>

```
ST_AsEWKB(geom)
```

## 引數
<a name="ST_AsEWKB-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_AsEWKB-function-return"></a>

`VARBYTE`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_AsEWKB-function-examples"></a>

以下 SQL 會傳回多邊形的十六進位 EWKB 表示法。

```
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_asewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsEWKT
<a name="ST_AsEWKT-function"></a>

ST\$1AsEWKT 會傳回輸入幾何或地理的擴充已知文字 (EWKT) 表示法。對於 3DZ、3DM 和 4D 幾何，ST\$1AsEWKT 會將 Z、M 或 ZM 附加至幾何類型的 WKT 值。

## 語法
<a name="ST_AsEWKT-function-syntax"></a>

```
ST_AsEWKT(geo)
```

```
ST_AsEWKT(geo, precision)
```

## 引數
<a name="ST_AsEWKT-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

 *precision*   
`INTEGER` 資料類型的值。對於幾何，使用指定的精確度 1-20 顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。對於地理，使用指定的精確度顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。

## 傳回類型
<a name="ST_AsEWKT-function-return"></a>

`VARCHAR`

如果 *geo* 為 null，則傳回 null。

如果 *precision* 為 Null，則會傳回 Null。

如果結果大於 64-KB `VARCHAR`，則會傳回錯誤。

## 範例
<a name="ST_AsEWKT-function-examples"></a>

以下 SQL 會傳回 linestring 的 EWKT 表示法。

```
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326));
```

```
st_asewkt
--------------------------------
 SRID=4326;LINESTRING(3.14159265358979 -6.28318530717959,2.71828182845905 -1.41421356237309)
```

以下 SQL 會傳回 linestring 的 EWKT 表示法。幾何的座標會使用六位數的精確度顯示。

```
SELECT ST_AsEWKT(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326), 6);
```

```
st_asewkt
--------------------------------
 SRID=4326;LINESTRING(3.14159 -6.28319,2.71828 -1.41421)
```

以下 SQL 會傳回地理的 EWKT 表示法。

```
SELECT ST_AsEWKT(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
                  st_asewkt
----------------------------------------------
 SRID=4326;LINESTRING(110 40,2 3,-10 80,-7 9)
```

# ST\$1AsGeoJSON
<a name="ST_AsGeoJSON-function"></a>

ST\$1AsGeoJSON 會傳回輸入幾何或地理的 GeoJSON 表示法。如需 GeoJSON 的相關資訊，請參閱 Wikipedia 中的 [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON)。

對於 3DZ 和 4D 幾何，輸出幾何是輸入 3DZ 或 4D 幾何的 3DZ 投影。也就是說，`x`、`y` 和 `z` 座標存在於輸出中。對於 3DM 幾何，輸出幾何是輸入 3DM 幾何的 2D 投影。也就是說，只有 `x` 和 `y` 座標存在於輸出中。

對於輸入地理，ST\$1AsGeoJSON 會傳回輸入地理的 GeoJSON 表示法。使用指定的精確度顯示地理座標。

## 語法
<a name="ST_AsGeoJSON-function-syntax"></a>

```
ST_AsGeoJSON(geo)
```

```
ST_AsGeoJSON(geo, precision)
```

## 引數
<a name="ST_AsGeoJSON-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

 *precision*   
`INTEGER` 資料類型的值。對於幾何，使用指定的精確度 1-20 顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。對於地理，使用指定的精確度顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。

## 傳回類型
<a name="ST_AsGeoJSON-function-return"></a>

`VARCHAR`

如果 *geo* 為 null，則傳回 null。

如果 *precision* 為 Null，則會傳回 Null。

如果結果大於 64-KB `VARCHAR`，則會傳回錯誤。

## 範例
<a name="ST_AsGeoJSON-function-examples"></a>

以下 SQL 會傳回 linestring 的 GeoJSON 表示法。

```
SELECT ST_AsGeoJSON(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)'));
```

```
st_asgeojson
----------------------------------------------------------------------------------------------------------------
 {"type":"LineString","coordinates":[[3.14159265358979,-6.28318530717959],[2.71828182845905,-1.41421356237309]]}
```

以下 SQL 會傳回 linestring 的 GeoJSON 表示法。幾何的座標會使用六位數的精確度顯示。

```
SELECT ST_AsGeoJSON(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)'), 6);
```

```
st_asgeojson
-----------------------------------------------------------------------------
  {"type":"LineString","coordinates":[[3.14159,-6.28319],[2.71828,-1.41421]]}
```

以下 SQL 會傳回地理的 GeoJSON 表示法。

```
SELECT ST_AsGeoJSON(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
                             st_asgeojson
----------------------------------------------------------------------
 {"type":"LineString","coordinates":[[110,40],[2,3],[-10,80],[-7,9]]}
```

# ST\$1AsHexWKB
<a name="ST_AsHexWKB-function"></a>

ST\$1AsHexWKB 會使用 ASCII 十六進位字元 (0–9、A–F)，傳回輸入幾何或地理的十六進位已知二進位 (WKB) 表示法。對於 3DZ、3DM 和 4D 幾何或地理，ST\$1AsHexWKB 會針對幾何或地理類型使用開放地理空間協會 (OGC) 標準值。

## 語法
<a name="ST_AsHexWKB-function-syntax"></a>

```
ST_AsHexWKB(geo)
```

## 引數
<a name="ST_AsHexWKB-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_AsHexWKB-function-return"></a>

`VARCHAR`

如果 *geo* 為 null，則傳回 null。

如果結果大於 64-KB `VARCHAR`，則會傳回錯誤。

## 範例
<a name="ST_AsHexWKB-function-examples"></a>

以下 SQL 會傳回幾何中多邊形的十六進位 WKB 表示法。

```
SELECT ST_AsHexWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_ashexwkb
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

以下 SQL 會傳回地理中多邊形的十六進位 WKB 表示法。

```
SELECT ST_AsHexWKB(ST_GeogFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'));
```

```
st_ashexwkb
--------------------------------
01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsHexEWKB
<a name="ST_AsHexEWKB-function"></a>

ST\$1AsHexEWKB 會使用 ASCII 十六進位字元 (0–9、A–F)，傳回輸入幾何或地理的擴充已知二進位 (EWKB) 表示法。對於 3DZ、3DM 和 4D 幾何或地理，ST\$1AsHexEWKB 會針對幾何或地理類型使用 PostGIS 延伸 WKB 值。

## 語法
<a name="ST_AsHexEWKB-function-syntax"></a>

```
ST_AsHexEWKB(geo)
```

## 引數
<a name="ST_AsHexEWKB-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_AsHexEWKB-function-return"></a>

`VARCHAR`

如果 *geo* 為 null，則傳回 null。

如果結果大於 64-KB `VARCHAR`，則會傳回錯誤。

## 範例
<a name="ST_AsHexEWKB-function-examples"></a>

以下 SQL 會傳回幾何中多邊形的十六進位 EWKB 表示法。

```
SELECT ST_AsHexEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
```

```
st_ashexewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

以下 SQL 會傳回地理中多邊形的十六進位 EWKB 表示法。

```
SELECT ST_AsHexEWKB(ST_GeogFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))'));
```

```
st_ashexewkb
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1AsText
<a name="ST_AsText-function"></a>

ST\$1AsText 會傳回輸入幾何或地理的已知文字 (WKT) 表示法。對於 3DZ、3DM 和 4D 幾何或地理，ST\$1AsEWKT 會將 Z、M 或 ZM 附加至幾何或地理類型的 WKT 值。

## 語法
<a name="ST_AsText-function-syntax"></a>

```
ST_AsText(geo)
```

```
ST_AsText(geo, precision)
```

## 引數
<a name="ST_AsText-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

 *precision*   
`INTEGER` 資料類型的值。對於幾何，使用指定的精確度 1-20 顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。對於地理，使用指定的精確度顯示 *geo* 座標。如果沒有指定 *precision*，則預設為 15。

## 傳回類型
<a name="ST_AsText-function-return"></a>

`VARCHAR`

如果 *geo* 為 null，則傳回 null。

如果 *precision* 為 Null，則會傳回 Null。

如果結果大於 64-KB `VARCHAR`，則會傳回錯誤。

## 範例
<a name="ST_AsText-function-examples"></a>

以下 SQL 會傳回 linestring 的 WKT 表示法。

```
SELECT ST_AsText(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326));
```

```
st_astext
--------------------------------
LINESTRING(3.14159265358979 -6.28318530717959,2.71828182845905 -1.41421356237309)
```

以下 SQL 會傳回 linestring 的 WKT 表示法。幾何的座標會使用六位數的精確度顯示。

```
SELECT ST_AsText(ST_GeomFromText('LINESTRING(3.141592653589793 -6.283185307179586,2.718281828459045 -1.414213562373095)', 4326), 6);
```

```
st_astext
----------------------------------------------
 LINESTRING(3.14159 -6.28319,2.71828 -1.41421)
```

以下 SQL 會傳回地理的 WKT 表示法。

```
SELECT ST_AsText(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
             st_astext
------------------------------------
 LINESTRING(110 40,2 3,-10 80,-7 9)
```

# ST\$1Azimuth
<a name="ST_Azimuth-function"></a>

ST\$1Azimuth 會使用兩個輸入點的 2D 投影傳回以北為基礎的笛卡爾方位。

## 語法
<a name="ST_Azimuth-function-syntax"></a>

```
ST_Azimuth(point1, point2)
```

## 引數
<a name="ST_Azimuth-function-arguments"></a>

 *point1*   
`GEOMETRY` 資料類型的 `POINT` 值。*point1* 的空間參考系統識別碼 (SRID) 必須與 *point2* 的 SRID 相符。

 *point2*   
`GEOMETRY` 資料類型的 `POINT` 值。*point2* 的 SRID 必須與 *point1* 的 SRID 相符。

## 傳回類型
<a name="ST_Azimuth-function-return"></a>

數字，為 `DOUBLE PRECISION` 資料類型的角度 (弧度)。值的範圍介於 0 (含) 到 2 pi (不含)。

如果 *point1* 或 *point2* 是空點，則會傳回錯誤。

如果 *point1* 或 *point2* 為 Null，則會傳回 Null。

如果 *point1* 和 *point2* 相等，則會傳回 Null。

如果 *point1* 或 *point2* 不是點，則會傳回錯誤。

如果 *point1* 和 *point2* 沒有空間參考系統識別碼 (SRID) 的值，則會傳回錯誤。

## 範例
<a name="ST_Azimuth-function-examples"></a>

以下 SQL 會傳回輸入點的方位。

```
SELECT ST_Azimuth(ST_Point(1,2), ST_Point(5,6));
```

```
st_azimuth
-------------------
 0.7853981633974483
```

# ST\$1Boundary
<a name="ST_Boundary-function"></a>

ST\$1Boundary 會傳回輸入幾何的邊界，如下所示：
+ 如果輸入幾何是空的 (也就是說，它不包含任何點)，則會按原樣傳回。
+ 如果輸入幾何是點或非空的多點，則會傳回空的幾何集合。
+ 如果輸入為 linestring 或 multilinestring，則會傳回包含邊界上所有點的多點。多點可能是空的)。
+ 如果輸入是沒有任何內環的多邊形，則會傳回表示其邊界的封閉 linestring。
+ 如果輸入是具有內環的多邊形，或者是多重多邊形，則會傳回 multilinestring。Multilinestring 包含面積幾何中所有環的所有邊界，做為封閉 linestring。

為了確定點相等，ST\$1Boundary 對輸入幾何的 2D 投影進行操作。如果輸入幾何為空，則會以與輸入相同的維度傳回其副本。對於非空的 3DM 和 4D 幾何，它們的 `m` 座標會被捨棄。在 3DZ 和 4D multilinestring 的特殊情況下，multilinestring 邊界點的 `z` 座標會計算為具有相同 2D 投影之 linestring 邊界點之相異 z 值的平均值。

## 語法
<a name="ST_Boundary-function-syntax"></a>

```
ST_Boundary(geom)
```

## 引數
<a name="ST_Boundary-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Boundary-function-return"></a>

`GEOMETRY`

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是 `GEOMETRYCOLLECTION`，則會傳回錯誤。

## 範例
<a name="ST_Boundary-function-examples"></a>

下列 SQL 傳回輸入多邊形的邊界作為 multilinestring。

```
SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1))')));
```

```
st_asewkt
--------------------
 MULTILINESTRING((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1))
```

# ST\$1Buffer
<a name="ST_Buffer-function"></a>

ST\$1Buffer 傳回 2D 幾何，該幾何表示與投影在 xy 笛卡爾平面上的輸入幾何的距離小於或等於輸入距離的所有點。

## 語法
<a name="ST_Buffer-function-syntax"></a>

```
ST_Buffer(geom, distance)
```

```
ST_Buffer(geom, distance, number_of_segments_per_quarter_circle)
```

## 引數
<a name="ST_Buffer-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *distance*   
`DOUBLE PRECISION` 資料類型的值，表示緩衝區的距離 (或半徑)。

 *number\$1of\$1segments\$1per\$1quarter\$1circle*   
`INTEGER` 資料類型的值。此值決定了圍繞輸入幾何的每個頂點近似四分之一圓的點數。負值預設為零。預設值為 8。

## 傳回類型
<a name="ST_Buffer-function-return"></a>

`GEOMETRY`

ST\$1Buffer 函數會傳回 xy 笛卡爾平面中的二維 (2D) 幾何。

如果 *geom* 是 `GEOMETRYCOLLECTION`，則會傳回錯誤。

## 範例
<a name="ST_Buffer-function-examples"></a>

以下 SQL 會傳回輸入 linestring 的緩衝區。

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('LINESTRING(1 2,5 2,5 8)'), 2));
```

```
               st_asewkt  
POLYGON((-1 2,-0.96157056080646 2.39018064403226,-0.847759065022573 2.76536686473018,-0.662939224605089 3.11114046603921,-0.414213562373093 3.4142135623731,-0.111140466039201 3.66293922460509,0.234633135269824 3.84775906502257,0.609819355967748 3.96157056080646,1 4,3 4,3 8,3.03842943919354 8.39018064403226,3.15224093497743 8.76536686473018,3.33706077539491 9.11114046603921,3.58578643762691 9.4142135623731,3.8888595339608 9.66293922460509,4.23463313526982 9.84775906502257,4.60981935596775 9.96157056080646,5 10,5.39018064403226 9.96157056080646,5.76536686473018 9.84775906502257,6.11114046603921 9.66293922460509,6.4142135623731 9.41421356237309,6.66293922460509 9.1111404660392,6.84775906502258 8.76536686473017,6.96157056080646 8.39018064403225,7 8,7 2,6.96157056080646 1.60981935596774,6.84775906502257 1.23463313526982,6.66293922460509 0.888859533960796,6.41421356237309 0.585786437626905,6.1111404660392 0.33706077539491,5.76536686473018 0.152240934977427,5.39018064403226 0.0384294391935391,5 0,1 0,0.609819355967744 0.0384294391935391,0.234633135269821 0.152240934977427,-0.111140466039204 0.337060775394909,-0.414213562373095 0.585786437626905,-0.662939224605091 0.888859533960796,-0.847759065022574 1.23463313526982,-0.961570560806461 1.60981935596774,-1 2))
```

以下 SQL 會傳回近似於圓的輸入點幾何圖形的緩衝區。由於此命令未指定每四分之一圓的線段數，因此函數使用八個線段的預設值來近似四分之一圓。

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('POINT(3 4)'), 2));
```

```
               st_asewkt
POLYGON((1 4,1.03842943919354 4.39018064403226,1.15224093497743 4.76536686473018,1.33706077539491 5.11114046603921,1.58578643762691 5.4142135623731,1.8888595339608 5.66293922460509,2.23463313526982 5.84775906502257,2.60981935596775 5.96157056080646,3 6,3.39018064403226 5.96157056080646,3.76536686473019 5.84775906502257,4.11114046603921 5.66293922460509,4.4142135623731 5.41421356237309,4.66293922460509 5.1111404660392,4.84775906502258 4.76536686473017,4.96157056080646 4.39018064403225,5 4,4.96157056080646 3.60981935596774,4.84775906502257 3.23463313526982,4.66293922460509 2.8888595339608,4.41421356237309 2.58578643762691,4.1111404660392 2.33706077539491,3.76536686473018 2.15224093497743,3.39018064403226 2.03842943919354,3 2,2.60981935596774 2.03842943919354,2.23463313526982 2.15224093497743,1.8888595339608 2.33706077539491,1.58578643762691 2.58578643762691,1.33706077539491 2.8888595339608,1.15224093497743 3.23463313526982,1.03842943919354 3.60981935596774,1 4))
```

以下 SQL 會傳回近似於圓的輸入點幾何圖形的緩衝區。由於此命令指定 3 作為每四分之一圓的線段數，因此函數使用三個線段來近似四分之一圓。

```
SELECT ST_AsEwkt(ST_Buffer(ST_GeomFromText('POINT(3 4)'), 2, 3));
```

```
               st_asewkt
POLYGON((1 4,1.26794919243112 5,2 5.73205080756888,3 6,4 5.73205080756888,4.73205080756888 5,5 4,4.73205080756888 3,4 2.26794919243112,3 2,2 2.26794919243112,1.26794919243112 3,1 4))
```

# ST\$1Centroid
<a name="ST_Centroid-function"></a>

st\$1Centroid 會傳回表示幾何質心的點，如下所示：
+ 對於 `POINT` 幾何，它會傳回座標為幾何中點座標平均值的點。
+ 對於 `LINESTRING` 幾何，它會傳回一個點，其座標是幾何體各段中點的加權平均值，其中權重是幾何體各段的長度。
+ 對於 `POLYGON` 幾何，它會傳回一個點，其座標是面積幾何三角剖分質心的加權平均值，其中權重是三角剖分中三角形的面積。
+ 對於幾何集合，它會傳回幾何集合中最大拓撲維度的幾何質心的加權平均值。

## 語法
<a name="ST_Centroid-function-syntax"></a>

```
ST_Centroid(geom)
```

## 引數
<a name="ST_Centroid-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Centroid-function-return"></a>

`GEOMETRY` 

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空白，則會傳回 Null。

## 範例
<a name="ST_Centroid-function-examples"></a>

以下 SQL 會傳回輸入 linestring 的中心點。

```
SELECT ST_AsEWKT(ST_Centroid(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9, -22 -33)', 4326)))
```

```
                     st_asewkt
----------------------------------------------------
 SRID=4326;POINT(15.6965103455214 27.0206782881905)
```

# ST\$1Collect
<a name="ST_Collect-function"></a>

ST\$1Collect 有兩個變體。一個接受兩個幾何，一個接受彙總運算式。

ST\$1Collect 的第一個變體會從輸入幾何建立幾何。會保留輸入幾何的順序。此變體的運作方式如下：
+ 如果兩個輸入幾何都是點，則傳回具有兩個點的 `MULTIPOINT`。
+ 如果兩個輸入幾何都是 linestring，則傳回具有兩個 linestring 的 `MULTILINESTRING`。
+ 如果兩個輸入幾何都是多邊形，則傳回具有兩個多邊形的 `MULTIPOLYGON`。
+ 否則，會傳回具有兩個輸入幾何的 `GEOMETRYCOLLECTION`。

ST\$1Collect 的第二個變體會根據幾何欄中的幾何建立幾何。幾何形狀沒有確定的傳回順序。指定 WITHIN GROUP (ORDER BY ...) 子句以指定傳回幾何的順序。此變體的運作方式如下：
+ 如果輸入彙總運算式中的所有非 NULL 列都是點，則傳回包含彙總運算式中所有點的多點。
+ 如果彙總運算式中的所有非 NULL 列都是 linestring，則會傳回包含彙總運算式中所有 linestring 的 multilinestring。
+ 如果彙總運算式中的所有非 NULL 列都是多邊形，則結果是傳回一個包含彙總運算式中所有多邊形的多重多邊形。
+ 否則，會傳回包含彙總運算式中所有幾何的 `GEOMETRYCOLLECTION`。

ST\$1Collect 會傳回與輸入幾何相同維度的幾何。所有輸入幾何必須具有相同的維度。

## 語法
<a name="ST_Collect-function-syntax"></a>

```
ST_Collect(geom1, geom2)
```

```
ST_Collect(aggregate_expression)  [WITHIN GROUP (ORDER BY sort_expression1 [ASC | DESC] [, sort_expression2 [ASC | DESC] ...])]
```

## 引數
<a name="ST_Collect-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *aggregate\$1expression*   
`GEOMETRY` 資料類型的欄，或是評估為 `GEOMETRY` 類型的運算式。

 [WITHIN GROUP (ORDER BY *sort\$1expression1* [ASC \$1 DESC] [, *sort\$1expression2* [ASC \$1 DESC] ...])]   
選用子句，指定彙總值的排序順序。ORDER BY 子句包含排序運算式的清單。排序運算式是類似於查詢選取清單中的有效排序運算式 (例如欄名稱) 的運算式。您可以指定遞增 (`ASC`) 或遞減 (`DESC`) 順序。預設值為 `ASC`。

## 傳回類型
<a name="ST_Collect-function-return"></a>

`MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON` 或 `GEOMETRYCOLLECTION` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom1* 或 *geom2* 為 null，則傳回 null。

如果 *aggregate\$1expression* 的所有列都為 null，則傳回 null。

如果 *geom1* 為 null，則傳回 *geom2* 的副本。同樣，如果 *geom2* 為 null，則傳回 *geom1* 的副本。

如果 *geom1* 和 *geom2* 具有不同的 SRID 值，則會傳回錯誤。

如果 *aggregate\$1expression* 中的兩個幾何具有不同的 SRID 值，則會傳回錯誤。

如果傳回的幾何大於 `GEOMETRY` 的大小上限，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的維度不同，則傳回錯誤。

如果 *aggregate\$1expression* 中的兩個幾何具有不同的維度，則會傳回錯誤。

## 範例
<a name="ST_Collect-function-examples"></a>

下列 SQL 會傳回包含兩個輸入幾何的幾何集合。

```
SELECT ST_AsText(ST_Collect(ST_GeomFromText('LINESTRING(0 0,1 1)'), ST_GeomFromText('POLYGON((10 10,20 10,10 20,10 10))')));
```

```
st_astext
-----------
 GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),POLYGON((10 10,20 10,10 20,10 10)))
```

下列 SQL 會將表格中的所有幾何圖形收集到幾何集合中。

```
WITH tbl(g) AS (SELECT ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT NULL::geometry UNION ALL
SELECT ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326))
SELECT ST_AsEWKT(ST_Collect(g)) FROM tbl;
```

```
st_astext
-----------
 SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(0 0,10 0),MULTIPOINT((13 4),(8 5),(4 4)),POLYGON((0 0,10 0,0 10,0 0)))
```

下列 SQL 會收集資料表中依 id 欄分組並依此 ID 排序的所有幾何。在此範例中，產生的幾何會依 ID 分組，如下所示：
+ id 1 – 多點中的點。
+ id 2 – multilinestring 中的 linestring。
+ id 3 – 幾何集合中的混合子類型。
+ id 4 – 多重多邊形中的多邊形。
+ id 5 – null，結果為 null。

```
WITH tbl(id, g) AS (SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL
SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL
SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry)
SELECT id, ST_AsEWKT(ST_Collect(g)) FROM tbl GROUP BY id ORDER BY id;
```

```
 id |                                                 st_asewkt                                                 
----+-----------------------------------------------------------------------------------------------------------
  1 | SRID=4326;MULTIPOINT((1 2),(4 5))
  2 | SRID=4326;MULTILINESTRING((0 0,10 0),(10 0,20 -5))
  3 | SRID=4326;GEOMETRYCOLLECTION(MULTIPOINT((13 4),(8 5),(4 4)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5)))
  4 | SRID=4326;MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((20 20,20 30,30 20,20 20)))
  5 |
```

下列 SQL 會從幾何集合中的資料表收集所有幾何。結果會依 `id` 的遞減順序排序，然後根據它們的最小和最大 x 座標按字典順序排列。

```
WITH tbl(id, g) AS (
SELECT 1, ST_GeomFromText('POINT(4 5)', 4326) UNION ALL
SELECT 1, ST_GeomFromText('POINT(1 2)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(10 0,20 -5)', 4326) UNION ALL
SELECT 2, ST_GeomFromText('LINESTRING(0 0,10 0)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTIPOINT(13 4,8 5,4 4)', 4326) UNION ALL
SELECT 3, ST_GeomFromText('MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((20 20,20 30,30 20,20 20))', 4326) UNION ALL
SELECT 4, ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))', 4326) UNION ALL
SELECT 1, NULL::geometry UNION ALL SELECT 2, NULL::geometry UNION ALL
SELECT 5, NULL::geometry UNION ALL SELECT 5, NULL::geometry)
SELECT ST_AsEWKT(ST_Collect(g) WITHIN GROUP (ORDER BY id DESC, ST_XMin(g), ST_XMax(g))) FROM tbl;
```

```
                                                                                                                  st_asewkt                                                                                                                  
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=4326;GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),POLYGON((20 20,20 30,30 20,20 20)),MULTILINESTRING((-1 -1,-2 -2),(-3 -3,-5 -5)),MULTIPOINT((13 4),(8 5),(4 4)),LINESTRING(0 0,10 0),LINESTRING(10 0,20 -5),POINT(1 2),POINT(4 5)
```

# ST\$1Contains
<a name="ST_Contains-function"></a>

ST\$1Contains 會在第一個輸入幾何的 2D 投影包含第二個輸入幾何的 2D 投影時傳回 true。如果 `B` 中的每個點都是 `A` 中的點，且其內部包含非空白的交集，則幾何 `A` 包含幾何 `B`。

ST\$1Contains(`A`, `B`) 與 ST\$1Within(`B`, `A`) 相等。

## 語法
<a name="ST_Contains-function-syntax"></a>

```
ST_Contains(geom1, geom2)
```

## 引數
<a name="ST_Contains-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。這個值會和 *geom1* 比較，以判斷其是否包含在 *geom1* 中。

## 傳回類型
<a name="ST_Contains-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Contains-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否包含第二個多邊形。

```
SELECT ST_Contains(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_contains
-----------
 false
```

# ST\$1ContainsProperly
<a name="ST_ContainsProperly-function"></a>

如果兩個輸入幾何都非空，且第二個幾何的 2D 投影的所有點都是第一個幾何的 2D 投影的內點，則 ST\$1ContainsProperly 傳回 true。

## 語法
<a name="ST_ContainsProperly-function-syntax"></a>

```
ST_ContainsProperly(geom1, geom2)
```

## 引數
<a name="ST_ContainsProperly-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型不能是 `GEOMETRYCOLLECTION`。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型不能是 `GEOMETRYCOLLECTION`。此值會與 *geom1* 進行比較，以判斷其所有點是否都是 *geom1* 的內點。

## 傳回類型
<a name="ST_ContainsProperly-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_ContainsProperly-function-examples"></a>

以下 SQL 會傳回輸入 linestring 與輸入多邊形的內部和邊界 (但不與其外部) 相交處的 ST\$1Contains 和 ST\$1ContainsProperly 的值。多邊形包含 linestring，但未正確包含 linestring。

```
WITH tmp(g1, g2) 
AS (SELECT ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('LINESTRING(5 5,10 5,10 6,5 5)')) SELECT ST_Contains(g1, g2), ST_ContainsProperly(g1, g2) 
FROM tmp;
```

```
 st_contains | st_containsproperly 
-------------+---------------------
 t           | f
```

# ST\$1ConvexHull
<a name="ST_ConvexHull-function"></a>

ST\$1ConvexHull 會傳回一個幾何，該幾何表示輸入幾何中包含的非空點的凸包。

對於空輸入，產生的幾何與輸入幾何相同。對於所有非空輸入，此函數對輸入幾何的 2D 投影進行操作。但是，輸出幾何的維度取決於輸入幾何的維度。更具體地說，當輸入幾何是非空的 3DM 或 3D 幾何時，會捨棄 `m` 座標。也就是說，傳回幾何的維度分別為 2D 或 3DZ。如果輸入是非空的 2D 或 3DZ 幾何，則產生的幾何具有相同的維度。

## 語法
<a name="ST_ConvexHull-function-syntax"></a>

```
ST_ConvexHull(geom)
```

## 引數
<a name="ST_ConvexHull-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_ConvexHull-function-return"></a>

`GEOMETRY`

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 凸包上的點數 | 幾何子類型 | 
| --- | --- | 
| 0 | 傳回 *geom* 的副本。 | 
| 1 | 傳回 `POINT` 子類型。 | 
| 2 | 傳回 `LINESTRING` 子類型。傳回 linestring 的兩個點按字典順序排序。 | 
| 3 或以上 | 傳回沒有內環的 `POLYGON` 子類型。多邊形是順時針方向的，外環的第一個點是環的字典順序最小的點。 | 

## 範例
<a name="ST_ConvexHull-function-examples"></a>

以下 SQL 會傳回 linestring 的擴充已知文字 (EWKT) 表示法。在此情況下，傳回的凸包為多邊形。

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('LINESTRING(0 0,1 0,0 1,1 1,0.5 0.5)'))) as output;
```

```
output
-------------
POLYGON((0 0,0 1,1 1,1 0,0 0))
```

以下 SQL 會傳回 linestring 的 EWKT 表示法。在此情況下，傳回的凸包為 linestring。

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('LINESTRING(0 0,1 1,0.2 0.2,0.6 0.6,0.5 0.5)'))) as output;
```

```
output
-------------
LINESTRING(0 0,1 1)
```

以下 SQL 會傳回多點的 EWKT 表示法。在此情況下，傳回的凸包為點。

```
SELECT ST_AsEWKT(ST_ConvexHull(ST_GeomFromText('MULTIPOINT(0 0,0 0,0 0)'))) as output;
```

```
output
-------------
POINT(0 0)
```

# ST\$1CoveredBy
<a name="ST_CoveredBy-function"></a>

ST\$1CoveredBy 會在第二個輸入幾何的 2D 投影涵蓋第一個輸入幾何的 2D 投影時傳回 true。如果兩個幾何皆非空白，且 `A` 中的每個點都是 `B` 中的點，則幾何 `B` 涵蓋幾何 `A`。

ST\$1CoveredBy(`A`, `B`) 與 ST\$1Covers(`B`, `A`) 相等。

## 語法
<a name="ST_CoveredBy-function-syntax"></a>

```
ST_CoveredBy(geom1, geom2)
```

## 引數
<a name="ST_CoveredBy-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。這個值會和 *geom2* 比較，以判斷其是否涵蓋於 *geom2*。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_CoveredBy-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_CoveredBy-function-examples"></a>

以下 SQL 會檢查第二個多邊形是否涵蓋第一個多邊形。

```
SELECT ST_CoveredBy(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_coveredby
-----------
 true
```

# ST\$1Covers
<a name="ST_Covers-function"></a>

ST\$1Covers 會在第一個輸入幾何的 2D 投影涵蓋第二個輸入幾何的 2D 投影時傳回 true。如果兩個幾何皆非空白，且 `B` 中的每個點都是 `A` 中的點，則幾何 `A` 涵蓋幾何 `B`。

ST\$1Covers(`A`, `B`) 與 ST\$1CoveredBy(`B`, `A`) 相等。

## 語法
<a name="ST_Covers-function-syntax"></a>

```
ST_Covers(geom1, geom2)
```

## 引數
<a name="ST_Covers-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。這個值會和 *geom1* 比較，以判斷其是否涵蓋 *geom1*。

## 傳回類型
<a name="ST_Covers-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Covers-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否涵蓋第二個多邊形。

```
SELECT ST_Covers(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_covers
-----------
 false
```

# ST\$1Crosses
<a name="ST_Crosses-function"></a>

如果兩個輸入幾何的 2D 投影互相交叉，ST\$1Crosses 會傳回 true。

## 語法
<a name="ST_Crosses-function-syntax"></a>

```
ST_Crosses(geom1, geom2)
```

## 引數
<a name="ST_Crosses-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Crosses-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

## 範例
<a name="ST_Crosses-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否與第二個多點交錯。在此範例中，多點與多邊形的內部和外部相交，這就是 ST\$1Crosses 傳回 true 的原因。

```
SELECT ST_Crosses (ST_GeomFromText('polygon((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('multipoint(5 5,0 0,-1 -1)'));
```

```
st_crosses              
-------------
 true
```

以下 SQL 會檢查第一個多邊形是否與第二個多點交錯。在此範例中，多點與多邊形的外部相交，但不與多邊形的內部相交，這就是 ST\$1Crosses 傳回 false 的原因。

```
SELECT ST_Crosses (ST_GeomFromText('polygon((0 0,10 0,10 10,0 10,0 0))'), ST_GeomFromText('multipoint(0 0,-1 -1)'));
```

```
st_crosses              
-------------
 false
```

# ST\$1Dimension
<a name="ST_Dimension-function"></a>

ST\$1Dimension 會傳回輸入幾何的固有維度。「固有維度」**是定義在幾何中子類型的維度值。

對於 3DM、3DZ 和 4D 幾何輸入，ST\$1Dimension 會傳回與 2D 幾何輸入相同的結果。

## 語法
<a name="ST_Dimension-function-syntax"></a>

```
ST_Dimension(geom)
```

## 引數
<a name="ST_Dimension-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Dimension-function-return"></a>

`INTEGER` 代表 *geom* 的固有維度。

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 傳回的值 | 幾何子類型 | 
| --- | --- | 
| 0 | 在 *geom* 是 `POINT` 或 `MULTIPOINT` 子類型時傳回 | 
| 1 | 在 *geom* 是 `LINESTRING` 或 `MULTILINESTRING` 子類型時傳回。 | 
| 2 | 在 *geom* 是 `POLYGON` 或 `MULTIPOLYGON` 子類型時傳回 | 
| 0 | 在 *geom* 是空白的 `GEOMETRYCOLLECTION` 子類型時傳回 | 
| 集合元件的最大維度 | 在 *geom* 是 `GEOMETRYCOLLECTION` 子類型時傳回 | 

## 範例
<a name="ST_Dimension-function-examples"></a>

以下 SQL 會將四個點 LINESTRING 的已知文字 (WKT) 表示法轉換成 GEOMETRY 物件，並傳回 linestring 的維度。

```
SELECT ST_Dimension(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_dimension
-------------
1
```

# ST\$1Disjoint
<a name="ST_Disjoint-function"></a>

ST\$1Disjoint 會在兩個輸入幾何的 2D 投影沒有任何相同點時傳回 True。

## 語法
<a name="ST_Disjoint-function-syntax"></a>

```
ST_Disjoint(geom1, geom2)
```

## 引數
<a name="ST_Disjoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Disjoint-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Disjoint-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否與第二個多邊形斷續。

```
SELECT ST_Disjoint(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), ST_Point(4, 4));
```

```
st_disjoint               
-----------
 true
```

# ST\$1Distance
<a name="ST_Distance-function"></a>

對於輸入幾何，ST\$1Distance 會傳回兩個輸入幾何值的 2D 投影之間的最小歐幾里得距離。

對於 3DM、3DZ、4D 幾何，ST\$1Distance 會傳回兩個輸入幾何值的 2D 投影之間的歐幾里德距離。

對於輸入地理，ST\$1Distance 會傳回兩個 2D 點的測地距離。距離的單位是公尺。對於點和空點以外的地理，會傳回錯誤。

## 語法
<a name="ST_Distance-function-syntax"></a>

```
ST_Distance(geo1, geo2)
```

## 引數
<a name="ST_Distance-function-arguments"></a>

 *geo1*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。*geo1* 的資料類型必須與 *geo2* 相同。

 *geo2*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。*geo2* 的資料類型必須與 *geo1* 相同。

## 傳回類型
<a name="ST_Distance-function-return"></a>

與輸入幾何或地理相同單位的 `DOUBLE PRECISION`。

如果 *geo1* 或 *geo2* 為 null 或空白，則傳回 null。

如果 *geo1* 和 *geo2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geo1* 或 *geo2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Distance-function-examples"></a>

以下 SQL 會傳回兩個多邊形之間的距離。

```
SELECT ST_Distance(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 -3,-2 -1,0 -3,-1 -3))'));
```

```
  st_distance
-----------
1.4142135623731
```

以下 SQL 使用 GEOGRAPHY 資料類型，傳回柏林的布蘭登堡門和德國國會大廈之間的距離 (以公尺為單位)。

```
SELECT ST_Distance(ST_GeogFromText('POINT(13.37761826722198 52.516411678282445)'), ST_GeogFromText('POINT(13.377950831464005 52.51705102546893)'));
```

```
   st_distance
------------------
 74.64129172609631
```

# ST\$1DistanceSphere
<a name="ST_DistanceSphere-function"></a>

ST\$1DistanceSphere 會傳回球面上兩個點幾何之間的距離。

## 語法
<a name="ST_DistanceSphere-function-syntax"></a>

```
ST_DistanceSphere(geom1, geom2)
```

```
ST_DistanceSphere(geom1, geom2, radius)
```

## 引數
<a name="ST_DistanceSphere-function-arguments"></a>

 *geom1*   
球面上 `GEOMETRY` 資料類型的點值，單位為度。點的第一個座標是經度值。點的第二個座標是緯度值。對於 3DZ、3DM 或 4D 幾何，僅使用前兩個座標。

 *geom2*   
球面上 `GEOMETRY` 資料類型的點值，單位為度。點的第一個座標是經度值。點的第二個座標是緯度值。對於 3DZ、3DM 或 4D 幾何，僅使用前兩個座標。

 *radius*   
`DOUBLE PRECISION` 資料類型的球面半徑。如果沒有提供 *radius*，則球面會預設為地球，且會從橢球的全球測量系統 (WGS) 84 表示法運算半徑。

## 傳回類型
<a name="ST_DistanceSphere-function-return"></a>

與半徑單位相同的 `DOUBLE PRECISION`。如果未提供半徑，則距離以公尺為單位。

如果 *geom1* 或 *geom2* 為 Null 或空白，則會傳回 Null。

如果沒有提供 *radius*，則結果的單位會是沿著地球表面的公尺數。

如果 *radius* 為負數，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 不是點，則會傳回錯誤。

## 範例
<a name="ST_DistanceSphere-function-examples"></a>

以下範例 SQL 會計算地球上兩點之間的距離 (以公里為單位)。

```
SELECT ROUND(ST_DistanceSphere(ST_Point(-122, 47), ST_Point(-122.1, 47.1))/ 1000, 0);
```

```
  round
-----------
 13
```

以下範例 SQL 會運算德國三個機場位置間的距離 (公里)：柏林泰格爾機場 (TXL)、慕尼黑國際機場 (MUC) 及法蘭克福國際機場 (FRA)。

```
WITH airports_raw(code,lon,lat) AS (
(SELECT 'MUC', 11.786111, 48.353889) UNION
(SELECT 'FRA', 8.570556, 50.033333) UNION
(SELECT 'TXL', 13.287778, 52.559722)),
airports1(code,location) AS (SELECT code, ST_Point(lon, lat) FROM airports_raw),
airports2(code,location) AS (SELECT * from airports1)
SELECT (airports1.code || ' <-> ' || airports2.code) AS airports,
round(ST_DistanceSphere(airports1.location, airports2.location) / 1000, 0) AS distance_in_km
FROM airports1, airports2 WHERE airports1.code < airports2.code ORDER BY 1;
```

```
  airports   | distance_in_km 
-------------+----------------
 FRA <-> MUC |            299
 FRA <-> TXL |            432
 MUC <-> TXL |            480
```

# ST\$1DWithin
<a name="ST_DWithin-function"></a>

ST\$1DWithin 會在兩個輸入幾何值的 2D 投影之間的歐幾里得距離不大於閾值時傳回 True。

## 語法
<a name="ST_DWithin-function-syntax"></a>

```
ST_DWithin(geom1, geom2, threshold)
```

## 引數
<a name="ST_DWithin-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *threshold*   
`DOUBLE PRECISION` 資料類型的值。這個值的單位是輸入引數。

## 傳回類型
<a name="ST_DWithin-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *threshold* 為負值，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_DWithin-function-examples"></a>

以下 SQL 會檢查兩個多邊形間的距離是否在五個單位內。

```
SELECT ST_DWithin(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'),5);
```

```
st_dwithin
-----------
 true
```

# ST\$1EndPoint
<a name="ST_EndPoint-function"></a>

ST\$1EndPoint 會傳回輸入 linestring 的最後一個點。結果的空間參考系統識別碼 (SRID) 值與輸入幾何的 SRID 值相同。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_EndPoint-function-syntax"></a>

```
ST_EndPoint(geom)
```

## 引數
<a name="ST_EndPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

## 傳回類型
<a name="ST_EndPoint-function-return"></a>

`GEOMETRY` 

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 不是 `LINESTRING`，則會傳回 Null。

## 範例
<a name="ST_EndPoint-function-examples"></a>

下列 SQL 將四點 `LINESTRING` 的擴充已知文字 (EWKT) 表示法傳回至 `GEOMETRY` 物件，並傳回 linestring 的終點。

```
SELECT ST_AsEWKT(ST_EndPoint(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 5)
```

# ST\$1Envelope
<a name="ST_Envelope-function"></a>

ST\$1Enelope 會傳回輸入幾何的最小週框方塊，如下所示。
+ 如果輸入幾何為空白，則傳回的幾何為輸入幾何的副本。
+ 如果輸入幾何圖形的最小週框方塊退化為一點，則傳回的幾何為一點。
+ 如果輸入幾何的最小週框方塊為一維，則會傳回兩點 linestring。
+ 如果上述情況都不成立，則函數會傳回順時針方向的多邊形，其頂點是最小週框方塊的邊角。

所傳回幾何的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。

對於所有非空輸入，此函數對輸入幾何的 2D 投影進行操作。

## 語法
<a name="ST_Envelope-function-syntax"></a>

```
ST_Envelope(geom)
```

## 引數
<a name="ST_Envelope-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Envelope-function-return"></a>

`GEOMETRY` 

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_Envelope-function-examples"></a>

下列 SQL 將四點 `LINESTRING` 的已知文字 (WKT) 表示法轉換為 `GEOMETRY` 物件，並傳回一個多邊形，其邊角是最小週框方塊。

```
SELECT ST_AsText(ST_Envelope(ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))')));
```

```
    st_astext
------------------------------------
  POLYGON((0 0,0 10,20 10,20 0,0 0))
```

# ST\$1Equals
<a name="ST_Equals-function"></a>

ST\$1Equals 會在輸入幾何的 2D 投影在幾何上相等時傳回 True。如果幾何具有相同的點集合，且其內部包含非空白的交集，便可將幾何視為幾何相等。

## 語法
<a name="ST_Equals-function-syntax"></a>

```
ST_Equals(geom1, geom2)
```

## 引數
<a name="ST_Equals-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。這個值會和 *geom1* 比較，以判斷其是否與 *geom1* 相等。

## 傳回類型
<a name="ST_Equals-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Equals-function-examples"></a>

以下 SQL 會檢查兩個多邊形是否幾何相等。

```
SELECT ST_Equals(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_equals
-----------
 false
```

以下 SQL 會檢查兩個 linestring 是否幾何相等。

```
SELECT ST_Equals(ST_GeomFromText('LINESTRING(1 0,10 0)'), ST_GeomFromText('LINESTRING(1 0,5 0,10 0)'));
```

```
st_equals
-----------
 true
```

# ST\$1ExteriorRing
<a name="ST_ExteriorRing-function"></a>

ST\$1ExteriorRing 會傳回代表輸入多邊形外環的封閉 linestring。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_ExteriorRing-function-syntax"></a>

```
ST_ExteriorRing(geom)
```

## 引數
<a name="ST_ExteriorRing-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_ExteriorRing-function-return"></a>

`LINESTRING` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 不是多邊形，則會傳回 Null。

如果 *geom* 為空，則傳回空的多邊形。

## 範例
<a name="ST_ExteriorRing-function-examples"></a>

下列 SQL 會將多邊形的外環傳回為封閉的 linestring。

```
SELECT ST_AsEWKT(ST_ExteriorRing(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))')));
```

```
st_asewkt
-----------
 LINESTRING(7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9)
```

# ST\$1Force2D
<a name="ST_Force2D-function"></a>

ST\$1Force2D 會傳回輸入幾何的 2D 幾何。對於 2D 幾何，會傳回輸入的副本。對於 3DZ、3DM 和 4D 幾何，ST\$1Force2D 會將幾何投影至 xy 笛卡爾平面。輸入幾何中的空點在輸出幾何中仍然是空點。

## 語法
<a name="ST_Force2D-function-syntax"></a>

```
ST_Force2D(geom)
```

## 引數
<a name="ST_Force2D-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Force2D-function-return"></a>

`GEOMETRY`. 

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則會傳回空的幾何。

## 範例
<a name="ST_Force2D-function-examples"></a>

下列 SQL 會從 3DZ 幾何傳回 2D 幾何。

```
SELECT ST_AsEWKT(ST_Force2D(ST_GeomFromText('MULTIPOINT Z(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT((0 1),EMPTY,(2 3),(5 6))
```

# ST\$1Force3D
<a name="ST_Force3D-function"></a>

ST\$1Force3D 是 ST\$1Force3DZ 的別名。如需詳細資訊，請參閱[ST\$1Force3DZ](ST_Force3DZ-function.md)。

# ST\$1Force3DM
<a name="ST_Force3DM-function"></a>

ST\$1Force3DM 會傳回輸入幾何的 3DM 幾何。對於 2D 幾何，輸出幾何中非空點的 `m` 座標均設定為 `0`。對於 3DM 幾何，會傳回輸入幾何的副本。對於 3DZ 幾何，幾何會投影到 xy 笛卡爾平面，並且輸出幾何中非空點的 `m` 座標全部設定為 `0`。對於 4D 幾何，會將幾何投影至 xym 笛卡爾空間。輸入幾何中的空點在輸出幾何中仍然是空點。

## 語法
<a name="ST_Force3DM-function-syntax"></a>

```
ST_Force3DM(geom)
```

## 引數
<a name="ST_Force3DM-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Force3DM-function-return"></a>

`GEOMETRY`. 

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則會傳回空的幾何。

## 範例
<a name="ST_Force3DM-function-examples"></a>

下列 SQL 會從 3DZ 幾何傳回 3DM 幾何。

```
SELECT ST_AsEWKT(ST_Force3DM(ST_GeomFromText('MULTIPOINT Z(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT M ((0 1 0),EMPTY,(2 3 0),(5 6 0))
```

# ST\$1Force3DZ
<a name="ST_Force3DZ-function"></a>

ST\$1Force3DZ 會從輸入幾何傳回 3DZ 幾何。對於 2D 幾何，輸出幾何中非空點的 `z` 座標均設定為 `0`。對於 3DM 幾何，幾何會投影到 xy 笛卡爾平面，並且輸出幾何中非空點的 `z` 座標全部設定為 `0`。對於 3DZ 幾何，會傳回輸入幾何的副本。對於 4D 幾何，會將幾何投影至 xyz 笛卡爾空間。輸入幾何中的空點在輸出幾何中仍然是空點。

## 語法
<a name="ST_Force3DZ-function-syntax"></a>

```
ST_Force3DZ(geom)
```

## 引數
<a name="ST_Force3DZ-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Force3DZ-function-return"></a>

`GEOMETRY`. 

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則會傳回空的幾何。

## 範例
<a name="ST_Force3DZ-function-examples"></a>

下列 SQL 會從 3DM 幾何傳回 3DZ 幾何。

```
SELECT ST_AsEWKT(ST_Force3DZ(ST_GeomFromText('MULTIPOINT M(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT Z ((0 1 0),EMPTY,(2 3 0),(5 6 0))
```

# ST\$1Force4D
<a name="ST_Force4D-function"></a>

ST\$1Force4D 會傳回輸入幾何的 4D 幾何。對於 2D 幾何，輸出幾何中非空點的 `z` 和 `m` 座標均設定為 `0`。對於 3DM 幾何，輸出幾何中非空點的 `z` 座標均設定為 `0`。對於 3DZ 幾何，輸出幾何中非空點的 `m` 座標均設定為 `0`。對於 4D 幾何，會傳回輸入幾何的副本。輸入幾何中的空點在輸出幾何中仍然是空點。

## 語法
<a name="ST_Force4D-function-syntax"></a>

```
ST_Force4D(geom)
```

## 引數
<a name="ST_Force4D-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Force4D-function-return"></a>

`GEOMETRY`. 

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則會傳回空的幾何。

## 範例
<a name="ST_Force4D-function-examples"></a>

下列 SQL 會從 3DM 幾何傳回 4D 幾何。

```
SELECT ST_AsEWKT(ST_Force4D(ST_GeomFromText('MULTIPOINT M(0 1 2, EMPTY, 2 3 4, 5 6 7)')));
```

```
st_asewkt
-----------
  MULTIPOINT ZM ((0 1 0 2),EMPTY,(2 3 0 4),(5 6 0 7))
```

# ST\$1GeoHash
<a name="ST_GeoHash-function"></a>

ST\$1GeoHash 會傳回具有指定精確度的輸入點的 `geohash` 表示法。預設精確度為 20。如需 geohash 定義的相關資訊，請參閱 Wikipedia 中的 [Geohash](https://en.wikipedia.org/wiki/Geohash)。

## 語法
<a name="ST_GeoHash-function-syntax"></a>

```
ST_GeoHash(geom)
```

```
ST_GeoHash(geom, precision)
```

## 引數
<a name="ST_GeoHash-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *precision*   
`INTEGER` 資料類型的值。預設值為 20。

## 傳回類型
<a name="ST_GeoHash-function-return"></a>

`GEOMETRY`

函數會傳回輸入點的 `geohash` 表示。

如果輸入點為空，該函數傳回 null。

如果輸入幾何不是點，則函數會傳回錯誤。

## 範例
<a name="ST_GeoHash-function-examples"></a>

以下 SQL 會傳回輸入點的 geohash 表示法。

```
SELECT ST_GeoHash(ST_GeomFromText('POINT(45 -45)'), 25) AS geohash;
```

```
          geohash
---------------------------
 m000000000000000000000gzz
```

下列 SQL 傳回 null，因為輸入點是空的。

```
SELECT ST_GeoHash(ST_GeomFromText('POINT EMPTY'), 10) IS NULL AS result;
```

```
 result
---------
 true
```

# ST\$1GeogFromText
<a name="ST_GeogFromText-function"></a>

ST\$1GeogFromText 會從輸入幾何的已知文字 (WKT) 或擴充已知文字 (EWKT) 表示法建構地理物件。

## 語法
<a name="ST_GeogFromText-function-syntax"></a>

```
ST_GeogFromText(wkt_string)
```

## 引數
<a name="ST_GeogFromText-function-arguments"></a>

 *wkt\$1string*   
`VARCHAR` 資料類型的值，其為幾何的 WKT 或 EWKT 表示法。

## 傳回類型
<a name="ST_GeogFromText-function-return"></a>

`GEOGRAPHY`

如果 SRID 值設定為輸入中提供的值。如果未提供 SRID，則會設定為 `4326`。

如果 *wkt\$1string* 為 null，則傳回 null。

如果 *wkt\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeogFromText-function-examples"></a>

以下 SQL 會使用 SRID 值從地理物件建構多邊形。

```
SELECT ST_AsEWKT(ST_GeogFromText('SRID=4324;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))'));
```

```
  st_asewkt
------------------------------------------------
 SRID=4324;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))
```

以下 SQL 從地理物件建構一個多邊形。SRID 的值設定為 `4326`。

```
SELECT ST_AsEWKT(ST_GeogFromText('POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))'));
```

```
 st_asewkt
------------------------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,10 10,1 0,0 0))
```

# ST\$1GeogFromWKB
<a name="ST_GeogFromWKB-function"></a>

ST\$1GeogFromWKB 會從輸入地理的十六進位已知二進位 (WKB) 表示法建構地理物件。

## 語法
<a name="ST_GeogFromWKB-function-syntax"></a>

```
ST_GeogFromWKB(wkb_string)
```

## 引數
<a name="ST_GeogFromWKB-function-arguments"></a>

 *wkb\$1string*   
`VARCHAR` 資料類型的值，其為地理的十六進位 WKB 表示法。

## 傳回類型
<a name="ST_GeogFromWKB-function-return"></a>

`GEOGRAPHY`

如果提供 SRID 值，則會將設為提供的值。如果未提供 SRID，則會設定為 `4326`。

如果 *wkb\$1string* 為 null，則傳回 null。

如果 *wkb\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeogFromWKB-function-examples"></a>

下列 SQL 從十六進位 WKB 值建構地理。

```
SELECT ST_AsEWKT(ST_GeogFromWKB('01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));
```

```
 st_asewkt
------------------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeometryN
<a name="ST_GeometryN-function"></a>

ST\$1GeometryN 會傳回由輸入幾何的輸入索引指向的幾何，如下所示。
+ 如果輸入是點、linestring 或多邊形，則若索引等於一 (1)，傳回幾何，若索引不是一 (1)，傳回 Null。
+ 如果輸入是 multipoint、multilinestring、multipolygon 或幾何集合，則會傳回由輸入索引指向的點、linestring、多邊形或幾何集合。

索引是以一開始。結果的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_GeometryN-function-syntax"></a>

```
ST_GeometryN(geom, index)
```

## 引數
<a name="ST_GeometryN-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *索引*   
資料類型 `INTEGER` 的值，代表以一開始的索引位置。

## 傳回類型
<a name="ST_GeometryN-function-return"></a>

`GEOMETRY` 

如果 *geom* 或 *index* 為 Null，則會傳回 Null。

如果 *index* 超出範圍，則會傳回錯誤。

## 範例
<a name="ST_GeometryN-function-examples"></a>

下列 SQL 會傳回幾何集合中的幾何。

```
WITH tmp1(idx) AS (SELECT 1 UNION SELECT 2),
tmp2(g) AS (SELECT ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))'))
SELECT idx, ST_AsEWKT(ST_GeometryN(g, idx)) FROM tmp1, tmp2 ORDER BY idx;
```

```
 idx |          st_asewkt           
-----+------------------------------
   1 | POLYGON((0 0,10 0,0 10,0 0))
   2 | LINESTRING(20 10,20 0,10 0)
```

# ST\$1GeometryType
<a name="ST_GeometryType-function"></a>

ST\$1GeometryType 會將輸入幾何的子類型做為字串傳回。

對於 3DM、3DZ 和 4D 幾何輸入，ST\$1GeometryType 會傳回與 2D 幾何輸入相同的結果。

## 語法
<a name="ST_GeometryType-function-syntax"></a>

```
ST_GeometryType(geom)
```

## 引數
<a name="ST_GeometryType-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_GeometryType-function-return"></a>

`VARCHAR` 表示 *geom* 的子類型。

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 傳回的字串值 | 幾何子類型 | 
| --- | --- | 
| `ST_Point` | 在 *geom* 是 `POINT` 子類型時傳回  | 
| `ST_LineString` | 在 *geom* 是 `LINESTRING` 子類型時傳回  | 
| `ST_Polygon` | 在 *geom* 是 `POLYGON` 子類型時傳回  | 
| `ST_MultiPoint` | 在 *geom* 是 `MULTIPOINT` 子類型時傳回  | 
| `ST_MultiLineString` | 在 *geom* 是 `MULTILINESTRING` 子類型時傳回  | 
| `ST_MultiPolygon` | 在 *geom* 是 `MULTIPOLYGON` 子類型時傳回  | 
| `ST_GeometryCollection` | 在 *geom* 是 `GEOMETRYCOLLECTION` 子類型時傳回  | 

## 範例
<a name="ST_GeometryType-function-examples"></a>

以下 SQL 會傳回輸入 linestring 幾何的子類型。

```
SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_geometrytype
-------------
 ST_LineString
```

# ST\$1GeomFromEWKB
<a name="ST_GeomFromEWKB-function"></a>

ST\$1GeomFromEWKB 會從輸入幾何的擴充已知二進位 (EWKB) 表示法建構幾何物件。

ST\$1GeomFromEWKB 接受以 WKB 和 EWKB 十六進位格式撰寫的 3DZ、3DM 和 4D 幾何。

## 語法
<a name="ST_GeomFromEWKB-function-syntax"></a>

```
ST_GeomFromEWKB(ewkb_string)
```

## 引數
<a name="ST_GeomFromEWKB-function-arguments"></a>

 *ewkb\$1string*   
`VARCHAR` 資料類型的值，其為幾何的十六進位 EWKB 表示法。

## 傳回類型
<a name="ST_GeomFromEWKB-function-return"></a>

`GEOMETRY`

如果 *ewkb\$1string* 為 Null，則會傳回 Null。

如果 *ewkb\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromEWKB-function-examples"></a>

以下 SQL 會從 EWKB 值建構多邊形，並傳回多邊形的 EWKT 表示法。

```
SELECT ST_AsEWKT(ST_GeomFromEWKB('0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));
```

```
 st_asewkt
--------------------------------
 SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeomFromEWKT
<a name="ST_GeomFromEWKT-function"></a>

ST\$1GeomFromEWKT 會從輸入幾何的擴充已知文字 (EWKT) 表示法建構幾何物件。

ST\$1GeomFromEWKT 接受 3DZ、3DM 和 4D，其中幾何類型的前綴分別為 Z、M 或 ZM。

## 語法
<a name="ST_GeomFromEWKT-function-syntax"></a>

```
ST_GeomFromEWKT(ewkt_string)
```

## 引數
<a name="ST_GeomFromEWKT-function-arguments"></a>

 *ewkt\$1string*   
`VARCHAR` 資料類型的值，或計算結果為 `VARCHAR` 類型的運算式，也就是幾何的 EWKT 表示法。  
您可以使用 WKT 關鍵字 `EMPTY` 來指定空點、具有空點的多點或具有空點的幾何集合。以下範例會建立空點。  

```
ST_GeomFromEWKT('SRID=4326;POINT EMPTY');
```

## 傳回類型
<a name="ST_GeomFromEWKT-function-return"></a>

`GEOMETRY`

如果 *ewkt\$1string* 為 null，則傳回 null。

如果 *ewkt\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromEWKT-function-examples"></a>

下列 SQL 會從 EWKT 值建構 multilinestring，並傳回幾何。它也會傳回幾何的 ST\$1AsEWKT 結果。

```
SELECT ST_GeomFromEWKT('SRID=4326;MULTILINESTRING((1 0,1 0),(2 0,3 0),(4 0,5 0,6 0))') as geom, ST_AsEWKT(geom);
```

```
                                                                                                                                                       geom                                                                                                                                                       |                          st_asewkt                           
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------
 0105000020E610000003000000010200000002000000000000000000F03F0000000000000000000000000000F03F00000000000000000102000000020000000000000000000040000000000000000000000000000008400000000000000000010200000003000000000000000000104000000000000000000000000000001440000000000000000000000000000018400000000000000000 | SRID=4326;MULTILINESTRING((1 0,1 0),(2 0,3 0),(4 0,5 0,6 0))
```

# ST\$1GeomFromGeoHash
<a name="ST_GeomFromGeoHash-function"></a>

ST\$1GeomFromGeoHash 會從輸入幾何的 geohash 表示法建構幾何物件。ST\$1GeomFromGeoHash 會傳回空間參考識別碼 (SRID) 為零 (0) 的二維 (2D) 幾何。如需 geohash 格式的相關資訊，請參閱 Wikipedia 中的 [Geohash](https://en.wikipedia.org/wiki/Geohash)。

## 語法
<a name="ST_GeomFromGeoHash-function-syntax"></a>

```
ST_GeomFromGeoHash(geohash_string)
```

```
ST_GeomFromGeoHash(geohash_string, precision)
```

## 引數
<a name="ST_GeomFromGeoHash-function-arguments"></a>

 *geohash\$1string*   
`VARCHAR` 資料類型的值，或計算結果為 `VARCHAR` 類型的運算式，也就是幾何的 geohash 表示法。

 *precision*   
`INTEGER` 資料類型的值，代表 geohash 的精確度。該值是用作精確度的 geohash 的字元數。如果未指定該值，則小於零或大於 *geohash\$1string* 長度，則會使用 *geohash\$1string* 長度。

## 傳回類型
<a name="ST_GeomFromGeoHash-function-return"></a>

`GEOMETRY`

如果 *geohash\$1string* 為 null，則傳回 null。

如果 *geohash\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromGeoHash-function-examples"></a>

下列 SQL 會傳回高精確度的多邊形。

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646))
```

以下 SQL 會傳回高精確度的點。

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz00'));
```

```
 st_asewkt       
-----------------------
 POINT(-115.172816 36.114646)
```

下列 SQL 會傳回低精確度的多邊形。

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qq'));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.3125 35.15625,-115.3125 36.5625,-113.90625 36.5625,-113.90625 35.15625,-115.3125 35.15625))
```

下列 SQL 會傳回精確度為 3 的多邊形。

```
SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 3));
```

```
 st_asewkt       
-----------------------
 POLYGON((-115.3125 35.15625,-115.3125 36.5625,-113.90625 36.5625,-113.90625 35.15625,-115.3125 35.15625))
```

# ST\$1GeomFromGeoJSON
<a name="ST_GeomFromGeoJSON-function"></a>

ST\$1GeomFromGeoJSON 會從輸入幾何的 GeoJSON 表示法建構幾何物件。如需 GeoJSON 格式的相關資訊，請參閱 Wikipedia 中的 [GeoJSON](https://en.wikipedia.org/wiki/GeoJSON)。

如果至少有一個點具有三個或更多座標，則產生的幾何圖形為 3DZ，其中對於僅具有兩個座標的點，Z 分量為零。如果輸入 GeoJSON 中的所有點都包含兩個座標或為空，則 ST\$1GeomFromGeoJSON 會傳回 2D 幾何。傳回幾何的空間參考系統識別碼 (SRID) 一律為 4326。

## 語法
<a name="ST_GeomFromGeoJSON-function-syntax"></a>

```
ST_GeomFromGeoJSON(geojson_string)
```

## 引數
<a name="ST_GeomFromGeoJSON-function-arguments"></a>

 *geojson\$1string*   
`VARCHAR` 或 `SUPER` 資料類型的值，或評估為 `VARCHAR` 類型的表達式，也就是幾何的 GeoJSON 表示法。

## 傳回類型
<a name="ST_GeomFromGeoJSON-function-return"></a>

`GEOMETRY`

如果 *geojson\$1string* 為 null，則傳回 null。

如果 *geojson\$1string* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromGeoJSON-function-examples"></a>

以下 SQL 傳回輸入 GeoJSON 中表示的二維幾何。

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[1,2]}'));
```

```
 st_asewkt       
-----------------------
 SRID=4326;POINT(1 2)
```

以下 SQL 傳回輸入 GeoJSON 中表示的 3DZ 幾何。

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}'));
```

```
 st_asewkt  
------------------------------------------
 SRID=4326;LINESTRING Z (1 2 3,4 5 6,7 8 9)
```

當輸入 GeoJSON 中只有一個點具有三個座標而所有其他點都具有兩個座標時，以下 SQL 傳回 3DZ 幾何。

```
SELECT ST_AsEWKT(ST_GeomFromGeoJSON('{"type":"Polygon","coordinates":[[[0, 0],[0, 1, 8],[1, 0],[0, 0]]]}'));
```

```
 st_asewkt  
------------------------------------------------
 SRID=4326;POLYGON Z ((0 0 0,0 1 8,1 0 0,0 0 0))
```

# ST\$1GeomFromGeoSquare
<a name="ST_GeomFromGeoSquare-function"></a>

st\$1GeomfromFromsquare 會傳回涵蓋由輸入 geosquare 值所表示之區域的幾何。傳回的幾何永遠是二維的。若要計算 geosquare 值，請參閱 [ST\$1GeoSquare](ST_GeoSquare-function.md)。

## 語法
<a name="ST_GeomFromGeoSquare-function-syntax"></a>

```
ST_GeomFromGeoSquare(geosquare)
```

```
ST_GeomFromGeoSquare(geosquare, max_depth)
```

## 引數
<a name="ST_GeomFromGeoSquare-function-arguments"></a>

 *geosquare*   
`BIGINT` 資料類型的值或計算結果為 geosquare 值之 `BIGINT` 類型的運算式，該值描述在初始域上進行的細分序列以達到所需的平方。此值由 [ST\$1GeoSquare](ST_GeoSquare-function.md) 計算。

 *max\$1depth*   
`INTEGER` 資料類型的值，代表對初始域進行的域細分的最大數量。值必須等於或大於 `1`。

## 傳回類型
<a name="ST_GeomFromGeoSquare-function-return"></a>

`GEOMETRY`

如果 *geosquare* 無效，則函數會傳回錯誤。

如果輸入 *max\$1depth* 不在範圍內，則函數會傳回錯誤。

## 範例
<a name="ST_GeomFromGeoSquare-function-examples"></a>

下列 SQL 會從 geosquare 值傳回幾何。

```
SELECT ST_AsText(ST_GeomFromGeoSquare(797852));
```

```
 st_astext       
--------------------------------------------------------------------------------------------------------------------
 POLYGON((13.359375 52.3828125,13.359375 52.734375,13.7109375 52.734375,13.7109375 52.3828125,13.359375 52.3828125))
```

下列 SQL 會從 geosquare 值和最大深度 `3` 傳回幾何。

```
SELECT ST_AsText(ST_GeomFromGeoSquare(797852, 3));
```

```
 st_astext       
--------------------------------------
 POLYGON((0 45,0 90,45 90,45 45,0 45))
```

以下 SQL 首先透過指定 x 座標為經度、y 座標為緯度 (-122.3, 47.6) 來計算西雅圖的 geosquare 值。然後它傳回 geosquare 的多邊形。雖然輸出是二維幾何，但它可以用來計算經度和緯度的空間資料。

```
SELECT ST_AsText(ST_GeomFromGeoSquare(ST_GeoSquare(ST_Point(-122.3, 47.6))));
```

```
 st_astext
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
POLYGON((-122.335167014971 47.6080129947513,-122.335167014971 47.6080130785704,-122.335166931152 47.6080130785704,-122.335166931152 47.6080129947513,-122.335167014971 47.6080129947513))
```

# ST\$1GeomFromText
<a name="ST_GeomFromText-function"></a>

ST\$1GeomFromText 會從輸入幾何的已知文字 (WKT) 表示法建構幾何物件。

ST\$1GeomFromText 接受 3DZ、3DM 和 4D，其中幾何類型的前綴分別為 Z、M 或 ZM。

## 語法
<a name="ST_GeomFromText-function-syntax"></a>

```
ST_GeomFromText(wkt_string)
```

```
ST_GeomFromText(wkt_string, srid)
```

## 引數
<a name="ST_GeomFromText-function-arguments"></a>

 *wkt\$1string*   
`VARCHAR` 資料類型的值，其為幾何的 WKT 表示法。  
您可以使用 WKT 關鍵字 `EMPTY` 來指定空點、具有空點的多點或具有空點的幾何集合。下列範例使用一個空點和一個非空點建立多點。  

```
ST_GeomFromEWKT('MULTIPOINT(1 0,EMPTY)');
```

 *srid*   
`INTEGER` 資料類型的值，其為空間參考識別碼 (SRID)。如果有提供 SRID 值，則傳回的幾何便會包含此 SRID 值。否則，傳回幾何的 SRID 值會設為零 (0)。

## 傳回類型
<a name="ST_GeomFromText-function-return"></a>

`GEOMETRY`

如果 *wkt\$1string* 或 *srid* 為 Null，則會傳回 Null。

如果 *srid* 為負值，則會傳回 Null。

如果 *wkt\$1string* 無效，則會傳回錯誤。

如果 *srid* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromText-function-examples"></a>

以下 SQL 會從 WKT 表示法和 SRID 值建構幾何物件。

```
SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326);
```

```
st_geomfromtext
--------------------------------
0103000020E61000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000
```

# ST\$1GeomFromWKB
<a name="ST_GeomFromWKB-function"></a>

ST\$1GeomFromWKB 會從輸入幾何的十六進位已知二進位 (WKB) 表示法建構幾何物件。

ST\$1GeomFromWKB 接受以 WKB 十六進位格式撰寫的 3DZ、3DM 和 4D 幾何。

## 語法
<a name="ST_GeomFromWKB-function-syntax"></a>

```
ST_GeomFromWKB(wkb_string)
```

```
ST_GeomFromWKB(wkb_string, srid)
```

## 引數
<a name="ST_GeomFromWKB-function-arguments"></a>

 *wkb\$1string*   
`VARCHAR` 資料類型的值，其為幾何的十六進位 WKB 表示法。

 *srid*   
`INTEGER` 資料類型的值，其為空間參考識別碼 (SRID)。如果有提供 SRID 值，則傳回的幾何便會包含此 SRID 值。否則，傳回幾何的 SRID 值會設為 0。

## 傳回類型
<a name="ST_GeomFromWKB-function-return"></a>

`GEOMETRY`

如果 *wkb\$1string* 或 *srid* 為 Null，則會傳回 Null。

如果 *srid* 為負值，則會傳回 Null。

如果 *wkb\$1string* 無效，則會傳回錯誤。

如果 *srid* 無效，則會傳回錯誤。

## 範例
<a name="ST_GeomFromWKB-function-examples"></a>

以下 SQL 會從 WKB 值建構多邊形，並傳回多邊形的 WKT 表示法。

```
SELECT ST_AsText(ST_GeomFromWKB('01030000000100000005000000000000000000000000000000000000000000000000000000000000000000F03F000000000000F03F000000000000F03F000000000000F03F000000000000000000000000000000000000000000000000'));            
```

```
 st_astext
--------------------------------
 POLYGON((0 0,0 1,1 1,1 0,0 0))
```

# ST\$1GeoSquare
<a name="ST_GeoSquare-function"></a>

ST\$1GeoSquare 會遞迴地將域 ([-180, 180], [-90, 90]) 細分為指定深度的相等正方形區域 (稱為 *geosquares*)。細分以提供的點的位置為基礎。包含該點的其中一個 geosquare 會在每個步驟細分，直到達到最大深度為止。這個 geosquare 的選擇是穩定的，亦即函數結果僅取決於輸入參數。此函數傳回一個唯一值，用於識別該點所在的最終 geosquare。

ST\$1GeoSquare 接受一個 POINT，其中 x 座標代表經度，而 y 座標代表緯度。經度和緯度分別限制為 [-180, 180] 和 [-90, 90]。ST\$1GeoSquare 的輸出可以用作 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 函數的輸入。

地球赤道圓周有 360° 的弧線，分為兩個半球 (東半球和西半球)，每個半球都有從 0° 子午線開始的 180° 經線 (子午線)。按照慣例，當投影到笛卡爾平面上的 x 軸時，東經度是「\$1」(正) 座標，當投影到笛卡爾平面上的 x 軸時，西經度是「-」(負) 座標。地球赤道週長 0° 的南北各有 90° 緯度線，每條緯線都與地球赤道週長 0° 平行。依照慣例，投影到笛卡爾平面時，北緯線與「\$1」(正) y 軸相交，投影到笛卡爾平面時，南緯線與「-」(負) y 軸相交。將經線和緯線相交形成的球形網格轉換為投影到笛卡爾平面上的網格，該網格在笛卡爾平面上具有標準的正負 x 座標和正負 y 座標。

ST\$1GeoSquare 的目的是使用相同的代碼值標記或標示接近點。位於相同 geosquare 的點會接收相同的代碼值。Geosquare 用於將地理座標 (緯度和經度) 編碼為整數。較大的區域被劃分為網格，以在地圖上以不同的解析度描繪區域。Geosquare 可用於空間索引、空間分級、鄰近搜尋、位置搜尋以及建立唯一的地點識別碼。[ST\$1GeoHash](ST_GeoHash-function.md) 函數遵循類似的過程，將區域劃分為網格，但具有不同的編碼方式。

## 語法
<a name="ST_GeoSquare-function-syntax"></a>

```
ST_GeoSquare(geom)
```

```
ST_GeoSquare(geom, max_depth)
```

## 引數
<a name="ST_ST_GeoSquare-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 POINT 子類型的運算式。點的 x 座標 (經度) 必須在以下範圍內：`-180` - `180`。點的 y 座標 (緯度) 必須在以下範圍內：`-90` - `90`。

 *max\$1depth*   
`INTEGER` 資料類型的值。包含該點的域被遞歸細分的最大次數。值必須為介於 1 到 32 之間的整數。預設值為 32。子實際最終的細分數小於或等於指定的 *max\$1depth*。

## 傳回類型
<a name="ST_GeoSquare-function-return"></a>

`BIGINT`

此函數傳回一個唯一值，用於識別輸入點所在的最終 geosquare。

如果輸入 *geom* 不是點，則函數會傳回錯誤。

如果輸入點為空，則傳回值對 [ST\$1GeomFromGeoSquare](ST_GeomFromGeoSquare-function.md) 函數不是有效輸入。使用 [ST\$1IsEmpty](ST_IsEmpty-function.md) 函數可防止呼叫具有空點的 ST\$1GeoSquare。

如果輸入點不在範圍內，則函數會傳回錯誤。

如果輸入 *max\$1depth* 超出範圍，則函數會傳回錯誤。

## 範例
<a name="ST_ST_GeoSquare-function-examples"></a>

以下 SQL 會從輸入點傳回 geosquare。

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5));
```

```
  st_geosquare
-----------------------
 -4410772491521635895
```

下列 SQL 從最大深度為 `10` 的輸入點傳回 geosquare。

```
SELECT ST_GeoSquare(ST_Point(13.5, 52.5), 10);
```

```
 st_geosquare
--------------
 797852
```

# ST\$1InteriorRingN
<a name="ST_InteriorRingN-function"></a>

ST\$1InteriorRingN 會傳回與索引位置輸入多邊形的內環相對應的封閉 linestring。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_InteriorRingN-function-syntax"></a>

```
ST_InteriorRingN(geom, index)
```

## 引數
<a name="ST_InteriorRingN-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *索引*   
`INTEGER` 資料類型的值，代表以一開始索引的環形位置。

## 傳回類型
<a name="ST_InteriorRingN-function-return"></a>

`LINESTRING` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom* 或 *index* 為 Null，則會傳回 Null。

如果 *index* 超出範圍，則會傳回 Null。

如果 *geom* 不是多邊形，則會傳回 Null。

如果 *geom* 為空多邊形，則傳回 null。

## 範例
<a name="ST_InteriorRingN-function-examples"></a>

下列 SQL 會將多邊形的第二個環傳回為封閉的 linestring。

```
SELECT ST_AsEWKT(ST_InteriorRingN(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'),2));
```

```
st_asewkt
-----------
 LINESTRING(12 14,15 14,13 11,12 14)
```

# ST\$1Intersects
<a name="ST_Intersects-function"></a>

ST\$1Intersects 會在兩個輸入幾何的 2D 投影至少擁有一個相同點時傳回 True。

## 語法
<a name="ST_Intersects-function-syntax"></a>

```
ST_Intersects(geom1, geom2)
```

## 引數
<a name="ST_Intersects-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Intersects-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Intersects-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否和第二個多邊形交集。

```
SELECT ST_Intersects(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(2 2,2 5,5 5,5 2,2 2))'), ST_GeomFromText('MULTIPOINT((4 4),(6 6))'));
```

```
st_intersects              
-------------
 true
```

# ST\$1Intersection
<a name="ST_Intersection-function"></a>

ST\$1Intersection 會傳回代表兩個幾何的點集交集的幾何。也就是說，它會傳回兩個輸入幾何之間共用的部分。

## 語法
<a name="ST_Intersection-function-syntax"></a>

```
ST_Intersection(geom1, geom2)
```

## 引數
<a name="ST_Intersection-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Intersection-function-return"></a>

`GEOMETRY`

如果 *geom1* 和 *geom2* 不共用任何空間 (它們不相交)，則傳回空的幾何。

如果 *geom1* 或 *geom2* 為空，則會傳回空的幾何。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

如果 *geom1* 或 *geom2* 不是二維 (2D) 幾何，則會傳回錯誤。

## 範例
<a name="ST_Intersection-function-examples"></a>

下列 SQL 會傳回表示兩個輸入幾何交集的非空幾何。

```
SELECT ST_AsEWKT(ST_Intersection(ST_GeomFromText('polygon((0 0,100 100,0 200,0 0))'), ST_GeomFromText('polygon((0 0,10 0,0 10,0 0))')));
```

```
        st_asewkt        
-------------------------
 POLYGON((0 0,0 10,5 5,0 0))
```

當傳遞不連接 (非相交) 的輸入幾何時，下列 SQL 會傳回空的幾何。

```
SELECT ST_AsEWKT(ST_Intersection(ST_GeomFromText('linestring(0 100,0 0)'), ST_GeomFromText('polygon((1 0,10 0,1 10,1 0))')));
```

```
    st_asewkt     
------------------
 LINESTRING EMPTY
```

# ST\$1IsPolygonCCW
<a name="ST_IsPolygonCCW-function"></a>

如果輸入多邊形或多多邊形的 2D 投影是逆時針方向，則 ST\$1IsPolygonCCW 傳回 true。如果輸入幾何為點、linestring、多點或 multilinestring，則傳回 true。對於幾何集合，如果集合中的所有幾何圖形都是逆時針方向，則 ST\$1IsPolygonCCW 傳回 true。

## 語法
<a name="ST_IsPolygonCCW-function-syntax"></a>

```
ST_IsPolygonCCW(geom)
```

## 引數
<a name="ST_IsPolygonCCW-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsPolygonCCW-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsPolygonCCW-function-examples"></a>

以下 SQL 會檢查多邊形是否逆時針方向。

```
SELECT ST_IsPolygonCCW(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'));
```

```
 st_ispolygonccw
----------
 true
```

# ST\$1IsPolygonCW
<a name="ST_IsPolygonCW-function"></a>

如果輸入多邊形或多多邊形的 2D 投影是順時針方向，則 ST\$1IsPolygonCW 傳回 true。如果輸入幾何為點、linestring、多點或 multilinestring，則傳回 true。對於幾何集合，如果集合中的所有幾何圖形都是順時針旋轉，則 ST\$1IsPolygonCW 傳回 true。

## 語法
<a name="ST_IsPolygonCW-function-syntax"></a>

```
ST_IsPolygonCW(geom)
```

## 引數
<a name="ST_IsPolygonCW-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsPolygonCW-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsPolygonCW-function-examples"></a>

以下 SQL 會檢查多邊形是否順時針方向。

```
SELECT ST_IsPolygonCW(ST_GeomFromText('POLYGON((7 9,8 7,11 6,15 8,16 6,17 7,17 10,18 12,17 14,15 15,11 15,10 13,9 12,7 9),(9 9,10 10,11 11,11 10,10 8,9 9),(12 14,15 14,13 11,12 14))'));
```

```
 st_ispolygonccw
----------
 true
```

# ST\$1IsClosed
<a name="ST_IsClosed-function"></a>

ST\$1IsClosed 會在輸入幾何的 2D 投影封閉時傳回 True。下列規則定義了封閉幾何：
+ 輸入幾何是點或 multipoint。
+ 輸入幾何是 linestring，且 linestring 的起始點和結束點一致。
+ 輸入幾何是非空白的 multilinestring，且其所有的 linestring 都是封閉的。
+ 輸入幾何是非空白的多邊形，所有多邊形的環都是非空白的，且其所有環的起始點和結束點都一致。
+ 輸入幾何是非空白的 multipolygon，且其所有的多邊形都是封閉的。
+ 輸入幾何是非空白的幾何集合，且其所有的元件都是封閉的。

## 語法
<a name="ST_IsClosed-function-syntax"></a>

```
ST_IsClosed(geom)
```

## 引數
<a name="ST_IsClosed-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsClosed-function-return"></a>

`BOOLEAN`

如果 *geom* 是空點，則傳回 false。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsClosed-function-examples"></a>

以下 SQL 會檢查多邊形是否是封閉的。

```
SELECT ST_IsClosed(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_isclosed
-----------
 true
```

# ST\$1IsCollection
<a name="ST_IsCollection-function"></a>

ST\$1IsCollection 會在輸入幾何是以下其中一種子類型時傳回 True：`GEOMETRYCOLLECTION`、`MULTIPOINT`、`MULTILINESTRING` 或 `MULTIPOLYGON`。

## 語法
<a name="ST_IsCollection-function-syntax"></a>

```
ST_IsCollection(geom)
```

## 引數
<a name="ST_IsCollection-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsCollection-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsCollection-function-examples"></a>

以下 SQL 會檢查多邊形是否是集合。

```
SELECT ST_IsCollection(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_iscollection
-----------
 false
```

# ST\$1IsEmpty
<a name="ST_IsEmpty-function"></a>

ST\$1IsEmpty 會在輸入幾何為空白時傳回 True。如果幾何至少包含一個非空點，則該幾何不是空的。

如果輸入幾何至少有一個非空點，則 ST\$1IsEmpty 傳回 true。

## 語法
<a name="ST_IsEmpty-function-syntax"></a>

```
ST_IsEmpty(geom)
```

## 引數
<a name="ST_IsEmpty-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsEmpty-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsEmpty-function-examples"></a>

以下 SQL 會檢查指定多邊形是否空白。

```
SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'));
```

```
st_isempty
-----------
 false
```

# ST\$1IsRing
<a name="ST_IsRing-function"></a>

如果輸入 linestring 是環，則 ST\$1IsRing 傳回 true。如果 linestring 是封閉且簡單的，則為環。

## 語法
<a name="ST_IsRing-function-syntax"></a>

```
ST_IsRing(geom)
```

## 引數
<a name="ST_IsRing-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。幾何必須是 `LINESTRING`。

## 傳回類型
<a name="ST_IsRing-function-return"></a>

`BOOLEAN`

如果 *geom* 不是 `LINESTRING`，則會傳回錯誤。

## 範例
<a name="ST_IsRing-function-examples"></a>

下列 SQL 會檢查指定的 linestring 是否為環。

```
SELECT ST_IsRing(ST_GeomFromText('linestring(0 0, 1 1, 1 2, 0 0)'));
```

```
st_isring
-----------
 true
```

# ST\$1IsSimple
<a name="ST_IsSimple-function"></a>

如果輸入幾何的 2D 投影很簡單，則 ST\$1IsSimple 傳回 true。如需簡單幾何定義的相關資訊，請參閱[幾何簡單性](spatial-terminology.md#spatial-terminology-simplicity)。

## 語法
<a name="ST_IsSimple-function-syntax"></a>

```
ST_IsSimple(geom)
```

## 引數
<a name="ST_IsSimple-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsSimple-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsSimple-function-examples"></a>

下列 SQL 會檢查指定的 linestring 是否簡單。在這個範例中，它並不簡單，因為它具有自我相交。

```
SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(0 0,10 0,5 5,5 -5)'));
```

```
 st_issimple
-----------
 false
```

# ST\$1IsValid
<a name="ST_IsValid-function"></a>

如果輸入幾何的 2D 投影有效，則 ST\$1IsValid 傳回 true。如需有效幾何定義的相關資訊，請參閱[幾何有效性](spatial-terminology.md#spatial-terminology-validity)。

## 語法
<a name="ST_IsValid-function-syntax"></a>

```
ST_IsValid(geom)
```

## 引數
<a name="ST_IsValid-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_IsValid-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_IsValid-function-examples"></a>

以下 SQL 會檢查指定多邊形是否有效。在此範例中，多邊形無效，因為多邊形的內部並未簡單地連接。

```
SELECT ST_IsValid(ST_GeomFromText('POLYGON((0 0,10 0,10 10,0 10,0 0),(5 0,10 5,5 10,0 5,5 0))'));
```

```
 st_isvalid
-----------
 false
```

# ST\$1Length
<a name="ST_Length-function"></a>

對於線性幾何，ST\$1Length 傳回 2D 投影的笛卡爾長度。長度單位與表示輸入幾何座標的單位相同。對於點、multipoint 和面積幾何，此函數會傳回零 (0)。當輸入為幾何集合時，此函數會傳回集合中幾何的長度總和。

對於地理，ST\$1Length 會傳回在球體 (由 SRID 決定) 上所計算輸入線性地理之 2D 投影的測地線長度。長度的單位是公尺。對於點、multipoint 和面積地理，此函數會傳回零 (0)。當輸入為幾何集合時，此函數會傳回集合中地理的長度總和。

## 語法
<a name="ST_Length-function-syntax"></a>

```
ST_Length(geo)
```

## 引數
<a name="ST_Length-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_Length-function-return"></a>

`DOUBLE PRECISION`

如果 *geo* 為 null，則傳回 null。

如果找不到 SRID 值，則會傳回錯誤。

## 範例
<a name="ST_Length-function-examples"></a>

下列 SQL 會傳回 multilinestring 的笛卡爾長度。

```
SELECT ST_Length(ST_GeomFromText('MULTILINESTRING((0 0,10 0,0 10),(10 0,20 0,20 10))'));
```

```
st_length
--------------------------------
  44.142135623731
```

以下 SQL 會傳回幾何中 linestring 的長度。

```
SELECT ST_Length(ST_GeogFromText('SRID=4326;LINESTRING(5 0,6 0,4 0)'));
```

```
 st_length 
------------------
 333958.472379804
```

下列 SQL 會傳回地理中某個點的長度。

```
SELECT ST_Length(ST_GeogFromText('SRID=4326;POINT(4 5)'));
```

```
 st_length 
-----------
 0
```

# ST\$1LengthSphere
<a name="ST_LengthSphere-function"></a>

ST\$1LengthSphere 會傳回線性幾何的長度 (以公尺為單位)。對於點、多點幾何和面積幾何，ST\$1LengthSphere 會傳回 0。對於幾何集合，ST\$1LengthSphere 會傳回集合中線性幾何的總長度 (以公尺為單位)。

ST\$1LengthSphere 會將輸入幾何的每個點的座標解釋為經度和緯度 (以度為單位)。對於 3DZ、3DM 或 4D 幾何，僅使用前兩個座標。

## 語法
<a name="ST_LengthSphere-function-syntax"></a>

```
ST_LengthSphere(geom)
```

## 引數
<a name="ST_LengthSphere-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_LengthSphere-function-return"></a>

`DOUBLE PRECISION` 長度的單位是公尺。長度計算是根據地球的球形模型，其半徑是世界大地測量系統 (WGS) 84 地球橢球模型的地球平均半徑。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_LengthSphere-function-examples"></a>

下列範例 SQL 會計算 linestring 長度 (以公尺為單位)。

```
SELECT ST_LengthSphere(ST_GeomFromText('LINESTRING(10 10,45 45)'));
```

```
 st_lengthsphere  
------------------
 5127736.08292556
```

# ST\$1Length2D
<a name="ST_Length2D-function"></a>

ST\$1Length2D 是 ST\$1Length 的別名。如需詳細資訊，請參閱[ST\$1Length](ST_Length-function.md)。

# ST\$1LineFromMultiPoint
<a name="ST_LineFromMultiPoint-function"></a>

ST\$1LineFromMultiPoint 會從輸入 multipoint 幾何傳回 linestring。點的順序會保留下來。所傳回幾何的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_LineFromMultiPoint-function-syntax"></a>

```
ST_LineFromMultiPoint(geom)
```

## 引數
<a name="ST_LineFromMultiPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `MULTIPOINT`。

## 傳回類型
<a name="ST_LineFromMultiPoint-function-return"></a>

`GEOMETRY`

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則傳回 `LINESTRING`。

如果 *geom* 包含空點，則會忽略這些空點。

如果 *geom* 不是 `MULTIPOINT`，則會傳回錯誤。

## 範例
<a name="ST_LineFromMultiPoint-function-examples"></a>

下列 SQL 會從 multipoint 建立 linestring。

```
SELECT ST_AsEWKT(ST_LineFromMultiPoint(ST_GeomFromText('MULTIPOINT(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
 st_asewkt
---------------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5,0 5)
```

# ST\$1LineInterpolatePoint
<a name="ST_LineInterpolatePoint-function"></a>

ST\$1LineInterpolatePoint 會傳回沿線距線起點一小部分距離的點。

為了確定點相等，ST\$1LineInterpolatePoint 對輸入幾何的 2D 投影進行操作。如果輸入幾何為空，則會以與輸入相同的維度傳回其副本。對於 3DZ、3DM 和 4D 幾何，`z` 或 `m` 座標是點所在區段的 `z` 或 `m` 座標的平均值。

## 語法
<a name="ST_LineInterpolatePoint-function-syntax"></a>

```
ST_LineInterpolatePoint(geom, fraction)
```

## 引數
<a name="ST_LineInterpolatePoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型是 `LINESTRING`。

 *fraction*   
`DOUBLE PRECISION` 資料類型的值，表示沿線的 linestring 的點位置。該值是介於 0-1 (含) 範圍內的分數。

## 傳回類型
<a name="ST_LineInterpolatePoint-function-return"></a>

`POINT` 子類型的 `GEOMETRY`。

如果 *geom* 或 *fraction* 為 null，則傳回 null。

如果 *geom* 為空，則傳回空點。

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *fraction* 超出範圍，則會傳回錯誤。

如果 *geom* 不是 linestring，則會傳回錯誤。

## 範例
<a name="ST_LineInterpolatePoint-function-examples"></a>

下列 SQL 會傳回沿 linestring 中間的點。

```
SELECT ST_AsEWKT(ST_LineInterpolatePoint(ST_GeomFromText('LINESTRING(0 0, 5 5, 7 7, 10 10)'), 0.50));
```

```
st_asewkt
-----------
 POINT(5 5)
```

下列 SQL 會傳回沿 linestring 90% 的點。

```
SELECT ST_AsEWKT(ST_LineInterpolatePoint(ST_GeomFromText('LINESTRING(0 0, 5 5, 7 7, 10 10)'), 0.90));
```

```
st_asewkt
-----------
 POINT(9 9)
```

# ST\$1M
<a name="ST_M-function"></a>

ST\$1M 會傳回輸入點的 `m` 座標。

## 語法
<a name="ST_M-function-syntax"></a>

```
ST_M(point)
```

## 引數
<a name="ST_M-function-arguments"></a>

 *point*   
`GEOMETRY` 資料類型的 `POINT` 值。

## 傳回類型
<a name="ST_M-function-return"></a>

`m` 座標的 `DOUBLE PRECISION` 值。

如果 *point* 是 Null，則會傳回 Null。

如果 *point* 是 2D 或 3DZ 點，則傳回 null。

如果 *point* 是空點，則傳回 null。

如果 *point* 不是 `POINT`，則會傳回錯誤。

## 範例
<a name="ST_M-function-examples"></a>

以下 SQL 會傳回 3DZ 幾何中點的 `m` 座標。

```
SELECT ST_M(ST_GeomFromEWKT('POINT M (1 2 3)'));
```

```
st_m
-----------
 3
```

以下 SQL 會傳回 4D 幾何中點的 `m` 座標。

```
SELECT ST_M(ST_GeomFromEWKT('POINT ZM (1 2 3 4)'));
```

```
st_m
-----------
 4
```

# ST\$1MakeEnvelope
<a name="ST_MakeEnvelope-function"></a>

ST\$1MakeEnvelope 會傳回幾何，如下所示：
+ 如果輸入座標指定了一個點，則傳回的幾何為一個點。
+ 如果輸入座標指定了直線，則傳回的幾何為 linestring。
+ 否則，傳回的幾何為多邊形，其中輸入座標會指定方塊的左下角和右上角。

如果提供，則傳回幾何的空間參考系統識別碼 (SRID) 值將設定為輸入 SRID 值。

## 語法
<a name="ST_MakeEnvelope-function-syntax"></a>

```
ST_MakeEnvelope(xmin, ymin, xmax, ymax)
```

```
ST_MakeEnvelope(xmin, ymin, xmax, ymax, srid)
```

## 引數
<a name="ST_MakeEnvelope-function-arguments"></a>

 *xmin*   
`DOUBLE PRECISION` 資料類型的值。此值是方塊左下角的第一個座標。

 *ymin*   
`DOUBLE PRECISION` 資料類型的值。此值是方塊左下角的第二個座標。

 *xmax*   
`DOUBLE PRECISION` 資料類型的值。此值為方塊右上角的第一個座標。

 *ymax*   
`DOUBLE PRECISION` 資料類型的值。此值為方塊的右上角的第二個座標。

 *srid*   
`INTEGER` 資料類型的值，表示空間參考系統識別碼 (SRID)。如果未提供 SRID 值，則會將其設定為零。

## 傳回類型
<a name="ST_MakeEnvelope-function-return"></a>

`POINT`、`LINESTRING` 或 `POLYGON` 子類型的 `GEOMETRY`。

如果未設定 `srid`，則傳回幾何的 SRID 會設定為 `srid` 或零。

如果 *xmin*、*ymin*、*xmax*、*ymax* 或 *srid* 為 null，則傳回 null。

如果 *srid* 為負值，則會傳回錯誤。

## 範例
<a name="ST_MakeEnvelope-function-examples"></a>

下列 SQL 會傳回一個多邊形，表示由四個輸入座標值定義的包絡線。

```
SELECT ST_AsEWKT(ST_MakeEnvelope(2,4,5,7));
```

```
 st_astext
---------------
 POLYGON((2 4,2 7,5 7,5 4,2 4))
```

以下 SQL 會傳回一個多邊形，表示由四個輸入座標值和 SRID 值定義的包絡線。

```
SELECT ST_AsEWKT(ST_MakeEnvelope(2,4,5,7,4326));
```

```
 st_astext
----------------------------------
 SRID=4326;POLYGON((2 4,2 7,5 7,5 4,2 4))
```

# ST\$1MakeLine
<a name="ST_MakeLine-function"></a>

ST\$1MakeLine 會從輸入幾何建立 linestring。

傳回幾何的維度與輸入幾何的維度相同。兩個輸入幾何必須具有相同的維度。

## 語法
<a name="ST_MakeLine-function-syntax"></a>

```
ST_MakeLine(geom1, geom2)
```

## 引數
<a name="ST_MakeLine-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`、`LINESTRING` 或 `MULTIPOINT`。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`、`LINESTRING` 或 `MULTIPOINT`。

## 傳回類型
<a name="ST_MakeLine-function-return"></a>

`LINESTRING` 子類型的 `GEOMETRY`。

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 是空點或包含空點，則忽略這些空點。

如果 *geom1* 和 *geom2* 為空，則傳回空的 `LINESTRING`。

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom1* 和 *geom2* 具有不同的 SRID 值，則會傳回錯誤。

如果 *geom1* 或 *geom2* 不是 `POINT`、`LINESTRING` 或 `MULTIPOINT`，則會傳回錯誤。

如果 *geom1* 和 *geom2* 具有不同的維度，則會傳回錯誤。

## 範例
<a name="ST_MakeLine-function-examples"></a>

以下 SQL 會從兩個輸入 linestring 建構 linestring。

```
SELECT ST_MakeLine(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'), ST_GeomFromText('LINESTRING(88.29 39.07,88.42 39.26,88.27 39.31,88.29 39.07)'));
```

```
st_makeline
-----------
 010200000008000000C3F5285C8F52534052B81E85EB113D407B14AE47E15A5340C3F5285C8F423D40E17A14AE475153408FC2F5285C4F3D40C3F5285C8F52534052B81E85EB113D40C3F5285C8F125640295C8FC2F58843407B14AE47E11A5640E17A14AE47A14340E17A14AE4711564048E17A14AEA74340C3F5285C8F125640295C8FC2F5884340
```

# ST\$1MakePoint
<a name="ST_MakePoint-function"></a>

ST\$1MakePoint 會傳回座標值為輸入值的點幾何。

## 語法
<a name="ST_MakePoint-function-syntax"></a>

```
ST_MakePoint(x, y)
```

```
ST_MakePoint(x, y, z)
```

```
ST_MakePoint(x, y, z, m)
```

## 引數
<a name="ST_MakePoint-function-arguments"></a>

 *x*   
`DOUBLE PRECISION` 資料類型的值，表示第一個座標。

 *y*   
`DOUBLE PRECISION` 資料類型的值，表示第二個座標。

 *z*   
`DOUBLE PRECISION` 資料類型的值，表示第三個座標。

 *m*   
`DOUBLE PRECISION` 資料類型的值，表示第四個座標。

## 傳回類型
<a name="ST_MakePoint-function-return"></a>

`POINT` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值會設為 0。

如果 *x*、*y*、*z* 或 *m* 為 null，則傳回 null。

## 範例
<a name="ST_MakePoint-function-examples"></a>

以下 SQL 會傳回 `POINT` 子類型的 `GEOMETRY` 類型，其中包含提供的座標。

```
SELECT ST_AsText(ST_MakePoint(1,3));
```

```
st_astext
-----------
 POINT(1 3)
```

以下 SQL 會傳回 `POINT` 子類型的 `GEOMETRY` 類型，其中包含提供的座標。

```
SELECT ST_AsEWKT(ST_MakePoint(1, 2, 3));
```

```
st_asewkt
----------------
 POINT Z (1 2 3)
```

以下 SQL 會傳回 `POINT` 子類型的 `GEOMETRY` 類型，其中包含提供的座標。

```
SELECT ST_AsEWKT(ST_MakePoint(1, 2, 3, 4));
```

```
st_asewkt
-------------------
 POINT ZM (1 2 3 4)
```

# ST\$1MakePolygon
<a name="ST_MakePolygon-function"></a>

ST\$1MakePolygon 具有傳回多邊形的兩個變體。一個採用單一幾何，另一個採用兩個幾何。
+ 第一個變體的輸入是定義輸出多邊形外環的 linestring。
+ 第二個變體的輸入是 linestring 和 multilinestring。這兩個都是空的或封閉的。

  輸出多邊形的外環的邊界是輸入 linestring，而多邊形內環的邊界是輸入 multilinestring 中的 linestring。如果輸入 linestring 為空，則會傳回空多邊形。會忽略 multilinestring 中的空 linestring。產生幾何的空間參考系統識別碼 (SRID) 是兩個輸入幾何的公共 SRID。

傳回幾何的維度與輸入幾何的維度相同。外環和內環必須具有相同的維度。

## 語法
<a name="ST_MakePolygon-function-syntax"></a>

```
ST_MakePolygon(geom1)
```

```
ST_MakePolygon(geom1, geom2)
```

## 引數
<a name="ST_MakePolygon-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。*linestring* 的值必須是封閉或空的。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `MULTILINESTRING`。

## 傳回類型
<a name="ST_MakePolygon-function-return"></a>

`POLYGON` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 等於輸入的 SRID。

如果 *geom1* 或 *geom2* 為 null，則傳回 null。

如果 *geom1* 不是線串，則會傳回錯誤。

如果 *geom2* 不是 multilinestring，則會傳回錯誤。

如果 *geom1* 未封閉，則會傳回錯誤。

如果 *geom1* 是單點或未封閉，則會傳回錯誤。

如果 *geom2* 包含至少一個具有單一點或未封閉的 linestring，則會傳回錯誤。

如果 *geom1* 和 *geom2* 具有不同的 SRID 值，則會傳回錯誤。

如果 *geom1* 和 *geom2* 具有不同的維度，則會傳回錯誤。

## 範例
<a name="ST_MakePolygon-function-examples"></a>

以下 SQL 會從輸入 linestring 傳回多邊形。

```
SELECT ST_AsText(ST_MakePolygon(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)')));
```

```
 st_astext
---------------
POLYGON((77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07))
```

下列 SQL 會從封閉 linestring 和封閉 multilinestring 建立多邊形。Linestring 用於多邊形的外環。Multilinestring 中的 linestring 用於多邊形的內環。

```
SELECT ST_AsEWKT(ST_MakePolygon(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,0 10,0 0)'), ST_GeomFromText('MULTILINESTRING((1 1,1 2,2 1,1 1),(3 3,3 4,4 3,3 3))')));
```

```
 st_astext
----------------------------------
POLYGON((0 0,10 0,10 10,0 10,0 0),(1 1,1 2,2 1,1 1),(3 3,3 4,4 3,3 3))
```

# ST\$1MemSize
<a name="ST_MemSize-function"></a>

ST\$1MemSize 會傳回輸入幾何所使用的記憶體空間量 (以位元組為單位)。此大小取決於幾何的 Amazon Redshift 內部表示法，因此可能會在內部表示法變更時變更。您可以使用此大小，指出 Amazon Redshift 中幾何物件的相對大小。

## 語法
<a name="ST_MemSize-function-syntax"></a>

```
ST_MemSize(geom)
```

## 引數
<a name="ST_MemSize-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_MemSize-function-return"></a>

`INTEGER` 代表 *geom* 的固有維度。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_MemSize-function-examples"></a>

下列 SQL 會傳回幾何集合的記憶體大小。

```
SELECT ST_MemSize(ST_GeomFromText('GEOMETRYCOLLECTION(POLYGON((0 0,10 0,0 10,0 0)),LINESTRING(20 10,20 0,10 0))'))::varchar + ' bytes';
```

```
 ?column?  
-----------
 172 bytes
```

# ST\$1MMax
<a name="ST_MMax-function"></a>

ST\$1MMax 會傳回輸入幾何的 `m` 座標上限。

## 語法
<a name="ST_MMax-function-syntax"></a>

```
ST_MMax(geom)
```

## 引數
<a name="ST_MMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_MMax-function-return"></a>

`m` 座標上限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是 2D 或 3DZ 幾何，則傳回 null。

## 範例
<a name="ST_MMax-function-examples"></a>

以下 SQL 會傳回 3DM 幾何中 linestring 的最大 `m` 座標。

```
SELECT ST_MMax(ST_GeomFromEWKT('LINESTRING M (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_mmax
-----------
  8
```

以下 SQL 會傳回 4D 幾何中線串的最大 `m` 座標。

```
SELECT ST_MMax(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_mmax
-----------
  11
```

# ST\$1MMin
<a name="ST_MMin-function"></a>

ST\$1MMin 會傳回輸入幾何的 `m` 座標下限。

## 語法
<a name="ST_MMin-function-syntax"></a>

```
ST_MMin(geom)
```

## 引數
<a name="ST_MMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_MMin-function-return"></a>

`m` 座標下限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是 2D 或 3DZ 幾何，則傳回 null。

## 範例
<a name="ST_MMin-function-examples"></a>

以下 SQL 會傳回 3DM 幾何中 linestring 的最小 `m` 座標。

```
SELECT ST_MMin(ST_GeomFromEWKT('LINESTRING M (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_mmin
-----------
  2
```

以下 SQL 會傳回 4D 幾何中 linestring 的 `m` 座標下限。

```
SELECT ST_MMin(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_mmin
-----------
  3
```

# ST\$1Multi
<a name="ST_Multi-function"></a>

ST\$1Multi 會將幾何轉換為對應的多重類型。如果輸入幾何已經是多重類型或幾何集合，則會傳回其副本。如果輸入幾何是點、linestring 或多邊形，則會分別傳回包含輸入幾何的多點、multilinestring 或多重多邊形。

## 語法
<a name="ST_Multi-function-syntax"></a>

```
ST_Multi(geom)
```

## 引數
<a name="ST_Multi-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Multi-function-return"></a>

具有子類型 `MULTIPOINT`、`MULTILINESTRING`、`MULTIPOLYGON` 或 `GEOMETRYCOLLECTION` 的 `GEOMETRY`。

所傳回幾何的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_Multi-function-examples"></a>

下列 SQL 會從輸入多點傳回一個多點。

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('MULTIPOINT((1 2),(3 4))', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;MULTIPOINT((1 2),(3 4))
```

以下 SQL 會從輸入點傳回多點。

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('POINT(1 2)', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;MULTIPOINT((1 2))
```

下列 SQL 會從輸入幾何集合傳回幾何集合。

```
SELECT ST_AsEWKT(ST_Multi(ST_GeomFromText('GEOMETRYCOLLECTION(POINT(1 2),MULTIPOINT((1 2),(3 4)))', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;GEOMETRYCOLLECTION(POINT(1 2),MULTIPOINT((1 2),(3 4)))
```

# ST\$1NDims
<a name="ST_NDims-function"></a>

ST\$1NDims 會傳回幾何的座標維度。ST\$1NDims 不會考慮幾何的拓撲維度。相反地，它會根據幾何的維度傳回常數值。

## 語法
<a name="ST_NDims-function-syntax"></a>

```
ST_NDims(geom)
```

## 引數
<a name="ST_NDims-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_NDims-function-return"></a>

`INTEGER` 代表 *geom* 的固有維度。

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 傳回的值 | 輸入幾何的維度 | 
| --- | --- | 
| 2 | 2D | 
| 3 | 3DZ 或 3DM | 
| 4 | 4D | 

## 範例
<a name="ST_NDims-function-examples"></a>

下列 SQL 會傳回 2D linestring 的維度數。

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING(0 0,1 1,2 2,0 0)'));
```

```
st_ndims
-------------
 2
```

以下 SQL 會傳回 3DZ linestring 的維度數。

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING Z(0 0 3,1 1 3,2 2 3,0 0 3)'));
```

```
st_ndims
-------------
 3
```

下列 SQL 會傳回 3DM linestring 的維度數。

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING M(0 0 4,1 1 4,2 2 4,0 0 4)'));
```

```
st_ndims
-------------
 3
```

下列 SQL 會傳回 4D linestring 的維度數。

```
SELECT ST_NDims(ST_GeomFromText('LINESTRING ZM(0 0 3 4,1 1 3 4,2 2 3 4,0 0 3 4)'));
```

```
st_ndims
-------------
 4
```

# ST\$1NPoints
<a name="ST_NPoints-function"></a>

ST\$1NPoints 會回輸入幾何或地理中非空點的數量。

## 語法
<a name="ST_NPoints-function-syntax"></a>

```
ST_NPoints(geo)
```

## 引數
<a name="ST_NPoints-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_NPoints-function-return"></a>

`INTEGER`

如果 *geo* 是空點，則傳回 `0`。

如果 *geo* 為 null，則傳回 null。

## 範例
<a name="ST_NPoints-function-examples"></a>

以下 SQL 會傳回 linestring 中點的數量。

```
SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_npoints
-------------
 4
```

以下 SQL 會傳回地理中 linestring 中點的數量。

```
SELECT ST_NPoints(ST_GeogFromText('LINESTRING(110 40, 2 3, -10 80, -7 9)'));
```

```
st_npoints
-------------
 4
```

# ST\$1NRings
<a name="ST_NRings-function"></a>

ST\$1NRings 會傳回輸入幾何中的環數。

## 語法
<a name="ST_NRings-function-syntax"></a>

```
ST_NRings(geom)
```

## 引數
<a name="ST_NRings-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_NRings-function-return"></a>

`INTEGER`

如果 *geom* 為 Null，則會傳回 Null。

傳回的值如下。


| 傳回的值 | 幾何子類型 | 
| --- | --- | 
| 0 | 在 *geom* 是 `POINT`、`LINESTRING`、`MULTIPOINT` 或 `MULTILINESTRING` 子類型時傳回  | 
| 環的數量。 | 在 *geom* 是 `POLYGON` 或 `MULTIPOLYGON` 子類型時傳回 | 
| 所有元件中環的數量 | 在 *geom* 是 `GEOMETRYCOLLECTION` 子類型時傳回 | 

## 範例
<a name="ST_NRings-function-examples"></a>

以下 SQL 會傳回 multipolygon 中環的數量。

```
SELECT ST_NRings(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((0 0,-10 0,0 -10,0 0)))'));
```

```
 st_nrings
-------------
 2
```

# ST\$1NumGeometries
<a name="ST_NumGeometries-function"></a>

ST\$1NumGeometries 會傳回輸入幾何中幾何的數量。

## 語法
<a name="ST_NumGeometries-function-syntax"></a>

```
ST_NumGeometries(geom)
```

## 引數
<a name="ST_NumGeometries-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_NumGeometries-function-return"></a>

`INTEGER` 代表 *geom* 中的幾何數量。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是單一空幾何，則會傳回 `0`。

如果 *geom* 是單一非空幾何，則會傳回 `1`。

如果 *geom* 是 `GEOMETRYCOLLECTION` 或 `MULTI` 子類型，則會傳回幾何的數量。

## 範例
<a name="ST_NumGeometries-function-examples"></a>

以下 SQL 會傳回輸入 multilinestring 中的幾何數。

```
SELECT ST_NumGeometries(ST_GeomFromText('MULTILINESTRING((0 0,1 0,0 5),(3 4,13 26))'));
```

```
st_numgeometries
-------------
 2
```

# ST\$1NumInteriorRings
<a name="ST_NumInteriorRings-function"></a>

ST\$1NumInteriorRings 會傳回輸入多邊形幾何中的環數。

## 語法
<a name="ST_NumInteriorRings-function-syntax"></a>

```
ST_NumInteriorRings(geom)
```

## 引數
<a name="ST_NumInteriorRings-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_NumInteriorRings-function-return"></a>

`INTEGER`

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 不是多邊形，則會傳回 Null。

## 範例
<a name="ST_NumInteriorRings-function-examples"></a>

以下 SQL 會傳回輸入多邊形中的內部環數。

```
SELECT ST_NumInteriorRings(ST_GeomFromText('POLYGON((0 0,100 0,100 100,0 100,0 0),(1 1,1 5,5 1,1 1),(7 7,7 8,8 7,7 7))'));
```

```
 st_numinteriorrings
-------------
 2
```

# ST\$1NumPoints
<a name="ST_NumPoints-function"></a>

ST\$1NumPoints 會傳回輸入幾何中點的數量。

## 語法
<a name="ST_NumPoints-function-syntax"></a>

```
ST_NumPoints(geom)
```

## 引數
<a name="ST_NumPoints-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_NumPoints-function-return"></a>

`INTEGER`

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 不是子類型 `LINESTRING`，則會傳回 Null。

## 範例
<a name="ST_NumPoints-function-examples"></a>

以下 SQL 會傳回輸入 linestring 中點的數量。

```
SELECT ST_NumPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_numpoints
-------------
4
```

下列 SQL 會傳回 Null，因為輸入 *geom* 不是子類型 `LINESTRING`。

```
SELECT ST_NumPoints(ST_GeomFromText('MULTIPOINT(1 2,3 4)'));
```

```
st_numpoints
-------------
```

# ST\$1Perimeter
<a name="ST_Perimeter-function"></a>

對於輸入面幾何，ST\$1Perimeter 會傳回 2D 投影的笛卡爾周長 (邊界的長度)。周長單位與表示輸入幾何座標的單位相同。對於點、multipoint 和線形幾何，此函數會傳回零 (0)。當輸入為幾何集合時，此函數會傳回集合中幾何的周長總和。

對於輸入地理，ST\$1Perimeter 會傳回在球體 (由 SRID 決定) 上所計算輸入面積地理之 2D 投影的測地週長 (邊界長度)。周長的單位是公尺。對於點、multipoint 和線形地理，此函數會傳回零 (0)。當輸入為幾何集合時，此函數會傳回集合中地理的周長總和。

## 語法
<a name="ST_Perimeter-function-syntax"></a>

```
ST_Perimeter(geo)
```

## 引數
<a name="ST_Perimeter-function-arguments"></a>

 *geo*   
`GEOMETRY` 或 `GEOGRAPHY` 資料類型的值，或是評估為 `GEOMETRY` 或 `GEOGRAPHY` 類型的運算式。

## 傳回類型
<a name="ST_Perimeter-function-return"></a>

`DOUBLE PRECISION`

如果 *geo* 為 null，則傳回 null。

如果找不到 SRID 值，則會傳回錯誤。

## 範例
<a name="ST_Perimeter-function-examples"></a>

下列 SQL 會傳回 multipolygon 的笛卡爾周長。

```
SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_perimeter
--------------------------------
    68.2842712474619
```

下列 SQL 會傳回 multipolygon 的笛卡爾周長。

```
SELECT ST_Perimeter(ST_GeomFromText('MULTIPOLYGON(((0 0,10 0,0 10,0 0)),((10 0,20 0,20 10,10 0)))'));
```

```
 st_perimeter
--------------------------------
    68.2842712474619
```

以下 SQL 會傳回地理中多邊形的周長。

```
SELECT ST_Perimeter(ST_GeogFromText('SRID=4326;POLYGON((0 0,1 0,0 1,0 0))'));
```

```
 st_perimeter 
------------------
 378790.428393693
```

下列 SQL 會傳回地理中 linestring 的周長。

```
SELECT ST_Perimeter(ST_GeogFromText('SRID=4326;LINESTRING(5 0,10 0)'));
```

```
 st_perimeter 
--------------
 0
```

# ST\$1Perimeter2D
<a name="ST_Perimeter2D-function"></a>

ST\$1Perimeter2D 是 ST\$1Perimeter 的別名。如需詳細資訊，請參閱[ST\$1Perimeter](ST_Perimeter-function.md)。

# ST\$1Point
<a name="ST_Point-function"></a>

ST\$1Point 會傳回輸入座標值中的點幾何。

## 語法
<a name="ST_Point-function-syntax"></a>

```
ST_Point(x, y)
```

## 引數
<a name="ST_Point-function-arguments"></a>

 *x*   
`DOUBLE PRECISION` 資料類型的值，表示第一個座標。

 *y*   
`DOUBLE PRECISION` 資料類型的值，表示第二個座標。

## 傳回類型
<a name="ST_Point-function-return"></a>

`POINT` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值會設為 0。

如果 *x* 或 *y* 為 Null，則會傳回 Null。

## 範例
<a name="ST_Point-function-examples"></a>

以下 SQL 會從輸入座標建構點幾何。

```
SELECT ST_AsText(ST_Point(5.0, 7.0));
```

```
st_astext
-------------
POINT(5 7)
```

# ST\$1PointN
<a name="ST_PointN-function"></a>

ST\$1PointN 會傳回 linestring 中索引值指定的點。負索引值會從 linestring 結尾向後算起，以便 -1 是最後一個點。

傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_PointN-function-syntax"></a>

```
ST_PointN(geom, index)
```

## 引數
<a name="ST_PointN-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

 *索引*   
資料類型 `INTEGER` 的值，代表 linestring 中某點的索引。

## 傳回類型
<a name="ST_PointN-function-return"></a>

`POINT` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值會設為 0。

如果 *geom* 或 *index* 為 Null，則會傳回 Null。

如果 *index* 超出範圍，則會傳回 Null。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 不是 `LINESTRING`，則會傳回 Null。

## 範例
<a name="ST_PointN-function-examples"></a>

下列 SQL 將六點 `LINESTRING` 的擴充已知文字 (EWKT) 表示法傳回至 `GEOMETRY` 物件，並傳回 linestring 索引 5 中的點。

```
SELECT ST_AsEWKT(ST_PointN(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5,0 0)',4326), 5));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 5)
```

# ST\$1Points
<a name="ST_Points-function"></a>

ST\$1Points 會傳回包含輸入幾何中所有非空點的多點幾何。ST\$1Points 不會移除輸入中重複的點，包括環形幾何的起點和終點。

## 語法
<a name="ST_Points-function-syntax"></a>

```
ST_Points(geom)
```

## 引數
<a name="ST_Points-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Points-function-return"></a>

`MULTIPOINT` 子類型的 `GEOMETRY`。

傳回幾何的空間參考系統識別碼 (SRID) 值與 *geom* 相同。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空，則傳回空的多點。

## 範例
<a name="ST_Points-function-examples"></a>

下列 SQL 範例會從輸入幾何建構多點幾何。結果為包含輸入幾何中非空點的多點幾何。

```
SELECT ST_AsEWKT(ST_Points(ST_SetSRID(ST_GeomFromText('LINESTRING(1 0,2 0,3 0)'), 4326)));
```

```
st_asewkt
-------------
SRID=4326;MULTIPOINT((1 0),(2 0),(3 0))
```

```
SELECT ST_AsEWKT(ST_Points(ST_SetSRID(ST_GeomFromText('MULTIPOLYGON(((0 0,1 0,0 1,0 0)))'), 4326)));
```

```
st_asewkt
-------------
SRID=4326;MULTIPOINT((0 0),(1 0),(0 1),(0 0))
```

# ST\$1Polygon
<a name="ST_Polygon-function"></a>

ST\$1Polygon 會傳回多邊形幾何，該幾何的外部環是輸入的 linestring，且其值為空間參考系統識別碼 (SRID) 的輸入。

傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_Polygon-function-syntax"></a>

```
ST_Polygon(linestring, srid)
```

## 引數
<a name="ST_Polygon-function-arguments"></a>

 *linestring*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是表示 linestring 的 `LINESTRING`。*linestring* 的值必須是封閉的。

 *srid*   
`INTEGER` 資料類型的值，表示 SRID。

## 傳回類型
<a name="ST_Polygon-function-return"></a>

`POLYGON` 子類型的 `GEOMETRY`。

傳回幾何的 SRID 值會設為 *srid*。

如果 *linestring* 或 *srid* 為 Null，則會傳回 Null。

如果 *linestring* 不是 linestring，則會傳回錯誤。

如果 *linestring* 並非封閉，則會傳回錯誤。

如果 *srid* 為負值，則會傳回錯誤。

## 範例
<a name="ST_Polygon-function-examples"></a>

以下 SQL 會使用 SRID 值建構多邊形。

```
SELECT ST_AsEWKT(ST_Polygon(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'),4356));
```

```
st_asewkt
-------------
 SRID=4356;POLYGON((77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07))
```

# ST\$1RemovePoint
<a name="ST_RemovePoint-function"></a>

ST\$1RemovePoint 會傳回 linestring 幾何，其具有已移除索引位置之幾何圖形的點。

索引是以零開始。結果的空間參考系統識別碼 (SRID) 與輸入幾何相同。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_RemovePoint-function-syntax"></a>

```
ST_RemovePoint(geom, index)
```

## 引數
<a name="ST_RemovePoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

 *索引*   
資料類型 `INTEGER` 的值，代表以零開始的索引位置。

## 傳回類型
<a name="ST_RemovePoint-function-return"></a>

`GEOMETRY` 

如果 *geom* 或 *index* 為 Null，則會傳回 Null。

如果 *geom* 不是子類型 `LINESTRING`，則會傳回錯誤。

如果 *index* 超出範圍，則會傳回錯誤。索引位置的有效值介於 0 與 `ST_NumPoints(geom)` 減 1 之間。

## 範例
<a name="ST_RemovePoint-function-examples"></a>

下列 SQL 會移除 linestring 中的最後一個點。

```
WITH tmp(g) AS (SELECT ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326))
SELECT ST_AsEWKT(ST_RemovePoint(g, ST_NumPoints(g) - 1)) FROM tmp;
```

```
   st_asewkt
-----------------------------------------
 SRID=4326;LINESTRING(0 0,10 0,10 10,5 5)
```

# ST\$1Reverse
<a name="ST_Reverse-function"></a>

ST\$1Reverse 會反轉線性和面積幾何的頂點順序。對於點或多點幾何，會傳回原始幾何的副本。對於幾何集合，ST\$1Reverse 會反轉集合中每個幾何的頂點順序。

傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_Reverse-function-syntax"></a>

```
ST_Reverse(geom)
```

## 引數
<a name="ST_Reverse-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Reverse-function-return"></a>

`GEOMETRY` 

所傳回幾何的空間參考系統識別碼 (SRID) 與輸入幾何的 SRID 相同。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_Reverse-function-examples"></a>

以下 SQL 會反轉 linestring 中點的順序。

```
SELECT ST_AsEWKT(ST_Reverse(ST_GeomFromText('LINESTRING(1 0,2 0,3 0,4 0)', 4326)));
```

```
    st_asewkt
------------------------------------
  SRID=4326;LINESTRING(4 0,3 0,2 0,1 0)
```

# ST\$1SetPoint
<a name="ST_SetPoint-function"></a>

ST\$1SetPoint 傳回一個 linestring，其中包含相對於索引指定之輸入 linestring 位置的更新座標。新座標是輸入點的座標。

傳回幾何的維度與 *geom1* 值的維度相同。如果 *geom1* 和 *geom2* 具有不同的維度，則將 *geom2* 投影到 *geom1* 的維度。

## 語法
<a name="ST_SetPoint-function-syntax"></a>

```
ST_SetPoint(geom1, index, geom2)
```

## 引數
<a name="ST_SetPoint-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

 *索引*   
`INTEGER` 資料類型的值，代表索引的位置。`0` 是指 linestring 左邊的第一個點，`1` 是指第二點，以此類推。索引可以是負值。`-1` 是指 linestring 右側的第一個點，`-2` 是指 linestring 右側的第二個點，以此類推。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `POINT`。

## 傳回類型
<a name="ST_SetPoint-function-return"></a>

`GEOMETRY`

如果 *geom2* 是空點，則傳回 *geom1*。

如果 *geom1*、*geom2* 或 *index* 為 Null，則會傳回 Null。

如果 *geom1* 不是線串，則會傳回錯誤。

如果 *index* 不在有效的索引範圍內，則傳回錯誤。

如果 *geom2* 不是點，則會傳回錯誤。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

## 範例
<a name="ST_SetPoint-function-examples"></a>

下列 SQL 會傳回一個新的 linestring，在這裡我們將輸入 linestring 的第二個點設定為指定點。

```
SELECT ST_AsText(ST_SetPoint(ST_GeomFromText('LINESTRING(1 2, 3 2, 5 2, 1 2)'), 2, ST_GeomFromText('POINT(7 9)')));
```

```
st_astext              
-------------
 LINESTRING(1 2,3 2,7 9,1 2)
```

下列 SQL 範例會傳回一個新的 linestring，在這裡我們將 linestring 右側的第三個點 (索引為負) 設定為指定點。

```
SELECT ST_AsText(ST_SetPoint(ST_GeomFromText('LINESTRING(1 2, 3 2, 5 2, 1 2)'), -3, ST_GeomFromText('POINT(7 9)')));
```

```
st_astext              
-------------
 LINESTRING(1 2,7 9,5 2,1 2)
```

# ST\$1SetSRID
<a name="ST_SetSRID-function"></a>

ST\$1SetSRID 會傳回與輸入幾何相同的幾何，但其會使用空間參考系統識別碼 (SRID) 的值輸入進行更新。

## 語法
<a name="ST_SetSRID-function-syntax"></a>

```
ST_SetSRID(geom, srid)
```

## 引數
<a name="ST_SetSRID-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *srid*   
`INTEGER` 資料類型的值，表示 SRID。

## 傳回類型
<a name="ST_SetSRID-function-return"></a>

`GEOMETRY`

傳回幾何的 SRID 值會設為 *srid*。

如果 *geom* 或 *srid* 為 Null，則會傳回 Null。

如果 *srid* 為負值，則會傳回錯誤。

## 範例
<a name="ST_SetSRID-function-examples"></a>

以下 SQL 會設定 linestring 的 SRID 值。

```
SELECT ST_AsEWKT(ST_SetSRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'),50));
```

```
st_asewkt
-------------
 SRID=50;LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)
```

# ST\$1Simplify
<a name="ST_Simplify-function"></a>

ST\$1Simplify 會使用具有指定公差的 Ramer-Douglas-Peucker 演算法，傳回輸入幾何的簡化副本。可能不會保留輸入幾何的拓樸。如需演算法的相關資訊，請參閱 Wikipedia 中的 [Ramer-Douglas-Peucker 演算法](https://en.wikipedia.org/wiki/Ramer–Douglas–Peucker_algorithm)。

當 ST\$1Simplify 計算距離以簡化幾何時，ST\$1Simplify 會對輸入幾何的 2D 投影進行操作。

## 語法
<a name="ST_Simplify-function-syntax"></a>

```
ST_Simplify(geom, tolerance)
```

## 引數
<a name="ST_Simplify-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *tolerance*   
`DOUBLE PRECISION` 資料類型的值，代表 Ramer-Douglas-Peucker 演算法的公差等級。如果 *tolerance* 為負數，則使用零。

## 傳回類型
<a name="ST_Simplify-function-return"></a>

`GEOMETRY`. 

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

傳回幾何的維度與輸入幾何的維度相同。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_Simplify-function-examples"></a>

以下 SQL 透過 Ramer-Douglas-Peucker 演算法使用歐幾里德距離容差 1 來簡化輸入 linestring。距離的單位與幾何座標的單位相同。

```
SELECT ST_AsEWKT(ST_Simplify(ST_GeomFromText('LINESTRING(0 0,1 2,1 1,2 2,2 1)'), 1));
```

```
 st_asewkt
-----------
LINESTRING(0 0,1 2,2 1)
```

# ST\$1SRID
<a name="ST_SRID-function"></a>

ST\$1SRID 會傳回輸入幾何的空間參考系統識別碼 (SRID)。如需 SRID 的相關資訊，請參閱[在 Amazon Redshift 中查詢空間資料](geospatial-overview.md)。

## 語法
<a name="ST_SRID-function-syntax"></a>

```
ST_SRID(geom)
```

## 引數
<a name="ST_SRID-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_SRID-function-return"></a>

`INTEGER`，代表 *geom* 的 SRID 值。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_SRID-function-examples"></a>

以下 SQL 會傳回設定為 SRID `4326` 之 linestring 的 SRID 值。

```
SELECT ST_SRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)',4326));
```

```
st_srid
-------------
 4326
```

下列 SQL 會傳回建構時未設定之 linestring 的 SRID 值。這會導致 SRID 值變成 `0`。

```
SELECT ST_SRID(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_srid
-------------
 0
```

# ST\$1StartPoint
<a name="ST_StartPoint-function"></a>

ST\$1StartPoint 會傳回 linestring 的第一個點。結果的空間參考系統識別碼 (SRID) 值與輸入幾何的 SRID 值相同。傳回幾何的維度與輸入幾何的維度相同。

## 語法
<a name="ST_StartPoint-function-syntax"></a>

```
ST_StartPoint(geom)
```

## 引數
<a name="ST_StartPoint-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。子類型必須是 `LINESTRING`。

## 傳回類型
<a name="ST_StartPoint-function-return"></a>

`GEOMETRY` 

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 不是 `LINESTRING`，則會傳回 Null。

## 範例
<a name="ST_StartPoint-function-examples"></a>

下列 SQL 將四點 `LINESTRING` 的擴充已知文字 (EWKT) 表示法傳回至 `GEOMETRY` 物件，並傳回 linestring 的起點。

```
SELECT ST_AsEWKT(ST_StartPoint(ST_GeomFromText('LINESTRING(0 0,10 0,10 10,5 5,0 5)',4326)));
```

```
st_asewkt
-------------
 SRID=4326;POINT(0 0)
```

# ST\$1Touches
<a name="ST_Touches-function"></a>

ST\$1Touches 會在兩個輸入幾何的 2D 投影接觸時傳回 true。如果兩個幾何圖形非空白、相交，且沒有共同的內部點，則它們會接觸。

## 語法
<a name="ST_Touches-function-syntax"></a>

```
ST_Touches(geom1, geom2)
```

## 引數
<a name="ST_Touches-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Touches-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Touches-function-examples"></a>

下列 SQL 會檢查多邊形是否接觸 linestring。

```
SELECT ST_Touches(ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))'), ST_GeomFromText('LINESTRING(20 10,20 0,10 0)'));
```

```
 st_touches              
-------------
 t
```

# ST\$1Transform
<a name="ST_Transform-function"></a>

ST\$1Transform 會傳回一個新幾何，其座標在由輸入空間參考系統識別碼 (SRID) 定義的空間參考系統中進行轉換。

## 語法
<a name="ST_Transform-function-syntax"></a>

```
ST_Transform(geom, srid)
```

## 引數
<a name="ST_Transform-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *srid*   
`INTEGER` 資料類型的值，表示 SRID。

## 傳回類型
<a name="ST_Transform-function-return"></a>

`GEOMETRY`.

傳回幾何的 SRID 值會設為 *srid*。

如果 *geom* 或 *srid* 為 Null，則會傳回 Null。

如果與輸入 *geom* 相關聯的 SRID 值不存在，則傳回錯誤。

如果 *srid* 不存在，則會傳回錯誤。

## 範例
<a name="ST_Transform-function-examples"></a>

下列 SQL 會轉換空白幾何集合的 SRID。

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY', 3857), 4326));
```

```
             st_asewkt
------------------------------------
 SRID=4326;GEOMETRYCOLLECTION EMPTY
```

以下 SQL 會轉換 linestring 的 SRID。

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('LINESTRING(110 40, 2 3, -10 80, -7 9, -22 -33)', 4326), 26918));
```

```
                                                                                            st_asewkt
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=26918;LINESTRING(73106.6977300955 15556182.9688576,14347201.5059964 1545178.32934967,1515090.41262989 9522193.25115316,10491250.83295 2575457.28410878,5672303.72135968 -5233682.61176205)
```

下列 SQL 會轉換一個多邊形的 SRID。

```
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromText('POLYGON Z ((-10 10 -7, -65 10 -6, -10 64 -5, -10 10 -7), (-11 11 5, -11 12 6, -12 11 7, -11 11 5))', 6989), 6317));
```

```
                                                                                                                                                                                                                      st_asewkt
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 SRID=6317;POLYGON Z ((6186430.2771091 -1090834.57212608 1100247.33216237,2654831.67853801 -5693304.90741276 1100247.50581055,2760987.41750022 -486836.575101877 5709710.44137268,6186430.2771091 -1090834.57212608 1100247.33216237),(6146675.25029258 -1194792.63532103 1209007.1115113,6125027.87562215 -1190584.81194058 1317403.77865723,6124888.99555252 -1301885.3455052 1209007.49312929,6146675.25029258 -1194792.63532103 1209007.1115113))
```

# ST\$1Union
<a name="ST_Union-function"></a>

ST\$1Union 會傳回代表兩個幾何聯集的幾何。也就是說，它會合併輸入幾何，以產生沒有重疊的結果幾何。

## 語法
<a name="ST_Union-function-syntax"></a>

```
ST_Union(geom1, geom2)
```

## 引數
<a name="ST_Union-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Union-function-return"></a>

`GEOMETRY`

傳回幾何的空間參考系統識別碼 (SRID) 值是輸入幾何的 SRID 值。

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 或 *geom2* 為空，則會傳回空的幾何。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合、linestring 或 multilinestring，則會傳回錯誤。

如果 *geom1* 或 *geom2* 不是二維 (2D) 幾何，則會傳回錯誤。

## 範例
<a name="ST_Union-function-examples"></a>

下列 SQL 會傳回表示兩個輸入幾何聯集的非空幾何。

```
SELECT ST_AsEWKT(ST_Union(ST_GeomFromText('POLYGON((0 0,100 100,0 200,0 0))'), ST_GeomFromText('POLYGON((0 0,10 0,0 10,0 0))')));
```

```
        st_asewkt        
-------------------------
 POLYGON((0 0,0 200,100 100,5 5,10 0,0 0))
```

# ST\$1Within
<a name="ST_Within-function"></a>

ST\$1Within 會在第一個輸入幾何的 2D 投影位於第二個輸入幾何的 2D 投影中時傳回 true。

例如，如果 `A` 中的每個點都是 `B` 中的點，且其內部沒有非空白的交集，則幾何 `A` 便位於幾何 `B` 中。

ST\$1Within(`A`, `B`) 與 ST\$1Contains(`B`, `A`) 相等。

## 語法
<a name="ST_Within-function-syntax"></a>

```
ST_Within(geom1, geom2)
```

## 引數
<a name="ST_Within-function-arguments"></a>

 *geom1*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。這個值會和 *geom2* 比較，以判斷其是否位於 *geom2* 內。

 *geom2*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_Within-function-return"></a>

`BOOLEAN`

如果 *geom1* 或 *geom2* 為 Null，則會傳回 Null。

如果 *geom1* 和 *geom2* 的空間參考系統識別碼 (SRID) 值不同，則會傳回錯誤。

如果 *geom1* 或 *geom2* 是幾何集合，則會傳回錯誤。

## 範例
<a name="ST_Within-function-examples"></a>

以下 SQL 會檢查第一個多邊形是否位於第二個多邊形中。

```
SELECT ST_Within(ST_GeomFromText('POLYGON((0 2,1 1,0 -1,0 2))'), ST_GeomFromText('POLYGON((-1 3,2 1,0 -3,-1 3))'));
```

```
st_within
-----------
 true
```

# ST\$1X
<a name="ST_X-function"></a>

ST\$1X 會傳回輸入點的第一個座標。

## 語法
<a name="ST_X-function-syntax"></a>

```
ST_X(point)
```

## 引數
<a name="ST_X-function-arguments"></a>

 *point*   
`GEOMETRY` 資料類型的 `POINT` 值。

## 傳回類型
<a name="ST_X-function-return"></a>

第一個座標的 `DOUBLE PRECISION` 值。

如果 *point* 是 Null，則會傳回 Null。

如果 *point* 是空點，則傳回 null。

如果 *point* 不是 `POINT`，則會傳回錯誤。

## 範例
<a name="ST_X-function-examples"></a>

以下 SQL 會傳回點的第一個座標。

```
SELECT ST_X(ST_Point(1,2));
```

```
st_x
-----------
 1.0
```

# ST\$1XMax
<a name="ST_XMax-function"></a>

ST\$1XMax 會傳回輸入幾何的第一個座標上限。

## 語法
<a name="ST_XMax-function-syntax"></a>

```
ST_XMax(geom)
```

## 引數
<a name="ST_XMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_XMax-function-return"></a>

第一個座標上限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_XMax-function-examples"></a>

以下 SQL 會傳回 linestring 最大的第一個座標。

```
SELECT ST_XMax(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_xmax
-----------
 77.42
```

# ST\$1XMin
<a name="ST_XMin-function"></a>

ST\$1XMin 會傳回輸入幾何的第一個座標下限。

## 語法
<a name="ST_XMin-function-syntax"></a>

```
ST_XMin(geom)
```

## 引數
<a name="ST_XMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_XMin-function-return"></a>

第一個座標下限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_XMin-function-examples"></a>

以下 SQL 會傳回 linestring 最小的第一個座標。

```
SELECT ST_XMin(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_xmin
-----------
 77.27
```

# ST\$1Y
<a name="ST_Y-function"></a>

ST\$1Y 會傳回輸入點的第二個座標。

## 語法
<a name="ST_Y-function-syntax"></a>

```
ST_Y(point)
```

## 引數
<a name="ST_Y-function-arguments"></a>

 *point*   
`GEOMETRY` 資料類型的 `POINT` 值。

## 傳回類型
<a name="ST_Y-function-return"></a>

第二個座標的 `DOUBLE PRECISION` 值。

如果 *point* 是 Null，則會傳回 Null。

如果 *point* 是空點，則傳回 null。

如果 *point* 不是 `POINT`，則會傳回錯誤。

## 範例
<a name="ST_Y-function-examples"></a>

以下 SQL 會傳回點的第二個座標。

```
SELECT ST_Y(ST_Point(1,2));
```

```
st_y
-----------
 2.0
```

# ST\$1YMax
<a name="ST_YMax-function"></a>

ST\$1YMax 會傳回輸入幾何的第二個座標上限。

## 語法
<a name="ST_YMax-function-syntax"></a>

```
ST_YMax(geom)
```

## 引數
<a name="ST_YMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_YMax-function-return"></a>

第二個座標上限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_YMax-function-examples"></a>

以下 SQL 會傳回 linestring 最大的第二個座標。

```
SELECT ST_YMax(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_ymax
-----------
 29.31
```

# ST\$1YMin
<a name="ST_YMin-function"></a>

ST\$1YMin 會傳回輸入幾何的第二個座標下限。

## 語法
<a name="ST_YMin-function-syntax"></a>

```
ST_YMin(geom)
```

## 引數
<a name="ST_YMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_YMin-function-return"></a>

第二個座標下限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="ST_YMin-function-examples"></a>

以下 SQL 會傳回 linestring 最小的第二個座標。

```
SELECT ST_YMin(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
```

```
st_ymin
-----------
 29.07
```

# ST\$1Z
<a name="ST_Z-function"></a>

ST\$1Z 會傳回輸入點的 `z` 座標。

## 語法
<a name="ST_Z-function-syntax"></a>

```
ST_Z(point)
```

## 引數
<a name="ST_Z-function-arguments"></a>

 *point*   
`GEOMETRY` 資料類型的 `POINT` 值。

## 傳回類型
<a name="ST_Z-function-return"></a>

`m` 座標的 `DOUBLE PRECISION` 值。

如果 *point* 是 Null，則會傳回 Null。

如果 *point* 是 2D 或 3DM 點，則傳回 null。

如果 *point* 是空點，則傳回 null。

如果 *point* 不是 `POINT`，則會傳回錯誤。

## 範例
<a name="ST_Z-function-examples"></a>

以下 SQL 會傳回 3DZ 幾何中點的 `z` 座標。

```
SELECT ST_Z(ST_GeomFromEWKT('POINT Z (1 2 3)'));
```

```
st_z
-----------
 3
```

以下 SQL 會傳回 4D 幾何中點的 `z` 座標。

```
SELECT ST_Z(ST_GeomFromEWKT('POINT ZM (1 2 3 4)'));
```

```
st_z
-----------
 3
```

# ST\$1ZMax
<a name="ST_ZMax-function"></a>

ST\$1ZMax 會傳回輸入幾何的 `z` 座標上限。

## 語法
<a name="ST_ZMax-function-syntax"></a>

```
ST_ZMax(geom)
```

## 引數
<a name="ST_ZMax-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_ZMax-function-return"></a>

`z` 座標上限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是 2D 或 3DM 幾何，則傳回 null。

## 範例
<a name="ST_ZMax-function-examples"></a>

以下 SQL 會傳回 3DZ 幾何中 linestring 的最大 `z` 座標。

```
SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING Z (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_zmax
-----------
  8
```

以下 SQL 會傳回 4D 幾何中線串的最大 `z` 座標。

```
SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_zmax
-----------
  10
```

# ST\$1ZMin
<a name="ST_ZMin-function"></a>

ST\$1ZMin 會傳回輸入幾何的 `z` 座標下限。

## 語法
<a name="ST_ZMin-function-syntax"></a>

```
ST_ZMin(geom)
```

## 引數
<a name="ST_ZMin-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="ST_ZMin-function-return"></a>

`z` 座標下限的 `DOUBLE PRECISION` 值。

如果 *geom* 為空白，則會傳回 Null。

如果 *geom* 為 Null，則會傳回 Null。

如果 *geom* 是 2D 或 3DM 幾何，則傳回 null。

## 範例
<a name="ST_ZMin-function-examples"></a>

以下 SQL 會傳回 3DZ 幾何中 linestring 的最小 `z` 座標。

```
SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING Z (0 1 2, 3 4 5, 6 7 8)'));
```

```
st_zmin
-----------
  2
```

以下 SQL 會傳回 4D 幾何中 linestring 的 `z` 座標下限。

```
SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING ZM (0 1 2 3, 4 5 6 7, 8 9 10 11)'));
```

```
st_zmin
-----------
  2
```

# SupportsBBox
<a name="SupportsBBox-function"></a>

如果輸入幾何支援使用預先計算的週框方塊進行編碼，SupportsBBox 會傳回 true。如需週框方塊支援的相關資訊，請參閱[邊界框](spatial-terminology.md#spatial-terminology-bounding-box)。

## 語法
<a name="SupportsBBox-function-syntax"></a>

```
SupportsBBox(geom)
```

## 引數
<a name="SupportsBBox-function-arguments"></a>

 *geom*   
`GEOMETRY` 資料類型的值，或是評估為 `GEOMETRY` 類型的表達式。

## 傳回類型
<a name="SupportsBBox-function-return"></a>

`BOOLEAN`

如果 *geom* 為 Null，則會傳回 Null。

## 範例
<a name="SupportsBBox-function-examples"></a>

下列 SQL 會傳回 true，因為輸入點幾何支援使用週框方塊進行編碼。

```
SELECT SupportsBBox(AddBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
supportsbbox
--------------
t
```

下列 SQL 會傳回 false，因為輸入點幾何不支援使用週框方塊進行編碼。

```
SELECT SupportsBBox(DropBBox(ST_GeomFromText('POLYGON((0 0,1 0,0 1,0 0))')));
```

```
supportsbbox
--------------
f
```

# 字串函數
<a name="String_functions_header"></a>

**Topics**
+ [\$1\$1 (串連) 運算子](r_concat_op.md)
+ [ASCII 函數](r_ASCII.md)
+ [BPCHARCMP 函數](r_BPCHARCMP.md)
+ [BTRIM 函數](r_BTRIM.md)
+ [BTTEXT\$1PATTERN\$1CMP 函數](r_BTTEXT_PATTERN_CMP.md)
+ [CHAR\$1LENGTH 函數](r_CHAR_LENGTH.md)
+ [CHARACTER\$1LENGTH 函數](r_CHARACTER_LENGTH.md)
+ [CHARINDEX 函數](r_CHARINDEX.md)
+ [CHR 函數](r_CHR.md)
+ [COLLATE 函數](r_COLLATE.md)
+ [CONCAT 函數](r_CONCAT.md)
+ [CRC32 函數](crc32-function.md)
+ [DIFFERENCE 函數](DIFFERENCE.md)
+ [INITCAP 函數](r_INITCAP.md)
+ [LEFT 和 RIGHT 函數](r_LEFT.md)
+ [LEN 函數](r_LEN.md)
+ [LENGTH 函數](r_LENGTH.md)
+ [LOWER 函數](r_LOWER.md)
+ [LPAD 和 RPAD 函數](r_LPAD.md)
+ [LTRIM 函數](r_LTRIM.md)
+ [OCTETINDEX 函數](OCTETINDEX.md)
+ [OCTET\$1LENGTH 函數](r_OCTET_LENGTH.md)
+ [POSITION 函數](r_POSITION.md)
+ [QUOTE\$1IDENT 函數](r_QUOTE_IDENT.md)
+ [QUOTE\$1LITERAL 函數](r_QUOTE_LITERAL.md)
+ [REGEXP\$1COUNT 函數](REGEXP_COUNT.md)
+ [REGEXP\$1INSTR 函數](REGEXP_INSTR.md)
+ [REGEXP\$1REPLACE 函數](REGEXP_REPLACE.md)
+ [REGEXP\$1SUBSTR 函數](REGEXP_SUBSTR.md)
+ [REPEAT 函數](r_REPEAT.md)
+ [REPLACE 函數](r_REPLACE.md)
+ [REPLICATE 函數](r_REPLICATE.md)
+ [REVERSE 函數](r_REVERSE.md)
+ [RTRIM 函數](r_RTRIM.md)
+ [SOUNDEX 函數](SOUNDEX.md)
+ [SPLIT\$1PART 函數](SPLIT_PART.md)
+ [STRPOS 函數](r_STRPOS.md)
+ [STRTOL 函數](r_STRTOL.md)
+ [SUBSTRING 函數](r_SUBSTRING.md)
+ [TEXTLEN 函數](r_TEXTLEN.md)
+ [TRANSLATE 函數](r_TRANSLATE.md)
+ [TRIM 函數](r_TRIM.md)
+ [UPPER 函數](r_UPPER.md)

字串函數處理和操作字元字串，或評估為字元字串的表達式。當這些函數中的 *string* 引數是常值時，必須以單引號括住。支援的資料類型包括 CHAR 和 VARCHAR。

下節提供所支援函數的函數名稱、語法及描述。字串的所有偏移都是以一開始。
<a name="string-functions-deprecated"></a>
**已取代的僅限領導節點函數**  
下列字串函數已棄用，因為它們只在領導者節點上執行。如需詳細資訊，請參閱[僅限領導節點函數](c_SQL_functions_leader_node_only.md)
+ GET\$1BYTE
+ SET\$1BIT
+ SET\$1BYTE
+ TO\$1ASCII

# \$1\$1 (串連) 運算子
<a name="r_concat_op"></a>

串連 `||` 符號兩側的兩個運算式，並傳回串連後的運算式。

類似於 [CONCAT 函數](r_CONCAT.md)。

**注意**  
如果其中一個或兩個運算式都為 null，則串連的結果為 `NULL`。

## 語法
<a name="r_concat_op-synopsis"></a>

```
expression1 || expression2
```

## 引數
<a name="r_concat_op-arguments"></a>

 *expression1*   
`CHAR` 字串、`VARCHAR` 字串、二進位運算式或計算結果為其中一種類型的運算式。

 *expression2*   
`CHAR` 字串、`VARCHAR` 字串、二進位運算式或計算結果為其中一種類型的運算式。

## 傳回類型
<a name="r_concat_op-return-type"></a>

 字串的傳回類型與輸入引數的類型相同。例如，串連兩個 `VARCHAR` 類型的字串會傳回一個 `VARCHAR` 類型的字串。

## 範例
<a name="r_concat_op-example"></a>

 下列範例使用 TICKIT 範例資料庫中的 USERS 和 VENUE 表格。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要串連 USERS 資料表中的 FIRSTNAME 和 LASTNAME 欄位，請使用下列範例。

```
SELECT (firstname || ' ' || lastname) as fullname
FROM users
ORDER BY 1
LIMIT 10;

+-----------------+
|    fullname     |
+-----------------+
| Aaron Banks     |
| Aaron Booth     |
| Aaron Browning  |
| Aaron Burnett   |
| Aaron Casey     |
| Aaron Cash      |
| Aaron Castro    |
| Aaron Dickerson |
| Aaron Dixon     |
| Aaron Dotson    |
+-----------------+
```

 若要串連可能包含 Null 的欄，請使用 [NVL 和 COALESCE 函數](r_NVL_function.md)表達式。下列範例使用 NVL，只要遇到 `NULL` 就傳回 `0`。

```
SELECT (venuename || ' seats ' || NVL(venueseats, 0)) as seating
FROM venue
WHERE venuestate = 'NV' or venuestate = 'NC'
ORDER BY 1
LIMIT 10;

+-------------------------------------+
|               seating               |
+-------------------------------------+
| Ballys Hotel seats 0                |
| Bank of America Stadium seats 73298 |
| Bellagio Hotel seats 0              |
| Caesars Palace seats 0              |
| Harrahs Hotel seats 0               |
| Hilton Hotel seats 0                |
| Luxor Hotel seats 0                 |
| Mandalay Bay Hotel seats 0          |
| Mirage Hotel seats 0                |
| New York New York seats 0           |
+-------------------------------------+
```

# ASCII 函數
<a name="r_ASCII"></a>

ASCII 函數傳回指定字串中第一個字元的 ASCII 代碼或 Unicode 代碼點。如果字串為空，該函數傳回 `0`。如果字串為空，它傳回 `NULL`。

## 語法
<a name="r_ASCII-synopsis"></a>

```
ASCII('string')
```

## 引數
<a name="r_ASCII-arguments"></a>

 *string*   
`CHAR` 字串或 `VARCHAR` 字串。

## 傳回類型
<a name="r_ASCII-return-type"></a>

 INTEGER 

## 範例
<a name="r_ASCII-examples"></a>

若要傳回 `NULL`，請使用下列範例。如果兩個引數相同，則 NULLIF 函數傳回 `NULL`，因此 ASCII 函數的輸入引數是 `NULL`。如需詳細資訊，請參閱[NULLIF 函數](r_NULLIF_function.md)。

```
SELECT ASCII(NULLIF('',''));

+-------+
| ascii |
+-------+
|  NULL |
+-------+
```

若要傳回 ASCII 碼 0，請使用下列範例。

```
SELECT ASCII('');

+-------+
| ascii |
+-------+
|     0 |
+-------+
```

若要傳回單字 amazon 的第一個字母的 ASCII 代碼 97，請使用下列範例。

```
SELECT ASCII('amazon');

+-------+
| ascii |
+-------+
|    97 |
+-------+
```

若要傳回單字 Amazon 的第一個字母的 ASCII 代碼 65，請使用下列範例。

```
SELECT ASCII('Amazon');

+-------+
| ascii |
+-------+
|    65 |
+-------+
```

# BPCHARCMP 函數
<a name="r_BPCHARCMP"></a>

比較兩個字串的值並傳回整數。如果字串相同，則函數會傳回 `0`。如果第一個字串的字母順序較大，則函數會傳回 `1`。如果第二個字串較大，則函數會傳回 `-1`。

如果是多位元組字元，則根據位元組編碼來比較。

[BTTEXT\$1PATTERN\$1CMP 函數](r_BTTEXT_PATTERN_CMP.md) 的同義詞。

## 語法
<a name="r_BPCHARCMP-synopsis"></a>

```
BPCHARCMP(string1, string2)
```

## 引數
<a name="r_BPCHARCMP-arguments"></a>

 *string1*   
`CHAR` 字串或 `VARCHAR` 字串。

 *string2*   
`CHAR` 字串或 `VARCHAR` 字串。

## 傳回類型
<a name="r_BPCHARCMP-return-type"></a>

 INTEGER 

## 範例
<a name="r_BPCHARCMP-examples"></a>

 下列範例使用 TICKIT 範例資料庫中的 USERS 表格。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要針對 USERS 資料表中的前十個項目，按字母順序判斷使用者的名字是否大於使用者的姓氏，請使用下列範例。對於 FIRSTNAME 字串的字母順序比 LASTNAME 字串更後面的那些項目，函數會傳回 `1`。如果 LASTNAME 的字母順序比 FIRSTNAME 更後面，函數會傳回 `-1`。

```
SELECT userid, firstname, lastname, BPCHARCMP(firstname, lastname)
FROM users
ORDER BY 1, 2, 3, 4
LIMIT 10;

+--------+-----------+-----------+-----------+
| userid | firstname | lastname  | bpcharcmp |
+--------+-----------+-----------+-----------+
|      1 | Rafael    | Taylor    |        -1 |
|      2 | Vladimir  | Humphrey  |         1 |
|      3 | Lars      | Ratliff   |        -1 |
|      4 | Barry     | Roy       |        -1 |
|      5 | Reagan    | Hodge     |         1 |
|      6 | Victor    | Hernandez |         1 |
|      7 | Tamekah   | Juarez    |         1 |
|      8 | Colton    | Roy       |        -1 |
|      9 | Mufutau   | Watkins   |        -1 |
|     10 | Naida     | Calderon  |         1 |
+--------+-----------+-----------+-----------+
```

若要傳回 USERS 資料表中函數傳回 `0` 的所有項目，請使用下列範例。當 FIRSTNAME 等於 LASTNAME 時，函數傳回 `0`。

```
SELECT userid, firstname, lastname,
BPCHARCMP(firstname, lastname)
FROM users 
WHERE BPCHARCMP(firstname, lastname)=0
ORDER BY 1, 2, 3, 4;

+--------+-----------+----------+-----------+
| userid | firstname | lastname | bpcharcmp |
+--------+-----------+----------+-----------+
|     62 | Chase     | Chase    |         0 |
|   4008 | Whitney   | Whitney  |         0 |
|  12516 | Graham    | Graham   |         0 |
|  13570 | Harper    | Harper   |         0 |
|  16712 | Cooper    | Cooper   |         0 |
|  18359 | Chase     | Chase    |         0 |
|  27530 | Bradley   | Bradley  |         0 |
|  31204 | Harding   | Harding  |         0 |
+--------+-----------+----------+-----------+
```

# BTRIM 函數
<a name="r_BTRIM"></a>

BTRIM 函數修剪字串，包括移除開頭和結尾空格，或移除符合選用指定字串的開頭和結尾字元。

## 語法
<a name="r_BTRIM-synopsis"></a>

```
BTRIM(string [, trim_chars ] )
```

## 引數
<a name="r_BTRIM-arguments"></a>

 *string*   
要修剪的輸入 VARCHAR 字串。

 *trim\$1chars*   
包含要比對之字元的 VARCHAR 字串。

## 傳回類型
<a name="r_BTRIM-return-type"></a>

BTRIM 函數傳回 VARCHAR 字串。

## 範例
<a name="r_BTRIM-examples"></a>

下列範例從字串 `' abc '` 中修剪開頭和結尾空格：

```
select '     abc    ' as untrim, btrim('     abc    ') as trim;

untrim    | trim
----------+------
   abc    | abc
```

下列範例從字串 `'xyzaxyzbxyzcxyz'` 中移除開頭和結尾 `'xyz'` 字串。開頭和結尾的 `'xyz'` 已移除，但出現在字串內的部分則未移除。

```
select 'xyzaxyzbxyzcxyz' as untrim,
btrim('xyzaxyzbxyzcxyz', 'xyz') as trim;

     untrim      |   trim
-----------------+-----------
 xyzaxyzbxyzcxyz | axyzbxyzc
```

下列範例會從符合 *trim \$1chars* 清單 `'tes'` 中任何字元的字串 `'setuphistorycassettes'` 中移除開頭和結尾部分。任何出現在輸入字串開頭或結尾的 *trim\$1chars* 清單中另一個字元前的 `t`、`e` 或 `s` 都會被移除。

```
SELECT btrim('setuphistorycassettes', 'tes');

     btrim      
-----------------
 uphistoryca
```

# BTTEXT\$1PATTERN\$1CMP 函數
<a name="r_BTTEXT_PATTERN_CMP"></a>

BPCHARCMP 函數的同義詞。

如需詳細資訊，請參閱 [BPCHARCMP 函數](r_BPCHARCMP.md)。

# CHAR\$1LENGTH 函數
<a name="r_CHAR_LENGTH"></a>

LEN 函數的同義詞。

請參閱 [LEN 函數](r_LEN.md)。

# CHARACTER\$1LENGTH 函數
<a name="r_CHARACTER_LENGTH"></a>

LEN 函數的同義詞。

請參閱 [LEN 函數](r_LEN.md)。

# CHARINDEX 函數
<a name="r_CHARINDEX"></a>

傳回指定子字串在一個字串內的位置。

如需相似函數，請參閱 [POSITION 函數](r_POSITION.md) 和 [STRPOS 函數](r_STRPOS.md)。

## 語法
<a name="r_CHARINDEX-synopsis"></a>

```
CHARINDEX( substring, string )
```

## 引數
<a name="charindex-arguments"></a>

 *substring*   
在 *string* 內要搜尋的子字串。

 *string*   
要搜尋的字串或欄。

## 傳回類型
<a name="charindex-return-type"></a>

 INTEGER   
CHARINDEX 函數傳回對應於子字串位置的 `INTEGER` (以 1 開始，不是以零開始)。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。如果在字串內找不到子字串，CHARINDEX 會傳回 `0`。

## 範例
<a name="sub-charindex-usage-notes-examples"></a>

若要顯示字串 `fish` 在單字 `dog` 內的位置，請使用下列範例。

```
SELECT CHARINDEX('fish', 'dog');

+-----------+
| charindex |
+-----------+
|         0 |
+-----------+
```

若要顯示字串 `fish` 在單字 `dogfish` 內的位置，請使用下列範例。

```
SELECT CHARINDEX('fish', 'dogfish');

+-----------+
| charindex |
+-----------+
|         4 |
+-----------+
```

 以下範例使用 TICKIT 範例資料庫中的 SALES 資料表。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 SALES 資料表中傳回佣金超過 999.00 的不同銷售交易次數，請使用下列範例。此命令透過檢查佣金值開頭的小數是否超過 4 位元來計算大於 999.00 的佣金。

```
SELECT DISTINCT CHARINDEX('.', commission), COUNT (CHARINDEX('.', commission))
FROM sales 
WHERE CHARINDEX('.', commission) > 4 
GROUP BY CHARINDEX('.', commission)
ORDER BY 1,2;

+-----------+-------+
| charindex | count |
+-----------+-------+
|         5 |   629 |
+-----------+-------+
```

# CHR 函數
<a name="r_CHR"></a>

CHR 函數傳回符合輸入參數指定之 ASCII 字碼指標值的字元。

## 語法
<a name="r_CHR-synopsis"></a>

```
CHR(number)
```

## 引數
<a name="r_CHR-argument"></a>

 *number*   
輸入參數是代表 ASCII 字碼指標值的 `INTEGER`。

## 傳回類型
<a name="r_CHR-return-type"></a>

 CHAR   
如果 ASCII 字元符合輸入值，CHR 函數會傳回 `CHAR` 字串。如果輸入數字沒有相符的 ASCII，函數會傳回 `NULL`。

## 範例
<a name="r_CHR-example"></a>

若要傳回與 ASCII 碼點 0 對應的字元，請使用下列範例。請注意，CHR 函數會針對輸入 `0` 傳回 `NULL`。

```
SELECT CHR(0);

+-----+
| chr |
+-----+
|     |
+-----+
```

若要傳回與 ASCII 碼點 65 對應的字元，請使用下列範例。

```
SELECT CHR(65);

+-----+
| chr |
+-----+
| A   |
+-----+
```

若要傳回以大寫 A (ASCII 字碼指標 65) 開頭的活動名稱，請使用下列範例。下列範例使用 TICKIT 範例資料庫中的 EVENT 資料表。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
SELECT DISTINCT eventname FROM event
WHERE SUBSTRING(eventname, 1, 1)=CHR(65) LIMIT 5;

+-----------------------+
|       eventname       |
+-----------------------+
| A Catered Affair      |
| As You Like It        |
| A Man For All Seasons |
| Alan Jackson          |
| Armando Manzanero     |
+-----------------------+
```

# COLLATE 函數
<a name="r_COLLATE"></a>

COLLATE 函數會覆寫字串欄或運算式的定序。

如需如何使用資料庫定序建立資料表的資訊，請參閱[CREATE TABLE](r_CREATE_TABLE_NEW.md)。

如需如何使用資料庫定序建立資料庫的資訊，請參閱[CREATE DATABASE](r_CREATE_DATABASE.md)。

## 語法
<a name="r_COLLATE-synopsis"></a>

```
COLLATE( string, 'case_sensitive' | 'cs' | 'case_insensitive' | 'ci');
```

## 引數
<a name="r_COLLATE-argument"></a>

 *string*   
您要覆寫的字串欄或運算式。

 *'case\$1sensitive'* \$1 *'cs'* \$1 *'case\$1insensitive'* \$1 *'ci'*  
定序名稱的字串常數。Amazon Redshift 僅針對此參數支援下列值：  
+  *case\$1sensitive* 
+  *cs* 
+  *case\$1insensitive* 
+  *ci* 
*case\$1sensitive* 和 *cs* 可互換，並產生相同的結果。同樣地，*case\$1insensitive* 和 *ci* 可互換，並產生相同的結果。

## 傳回類型
<a name="r_COLLATE-return-type"></a>

COLLATE 函式會傳回 `VARCHAR`、`CHAR` 或 `SUPER`，取決於第一個輸入表達式類型。此函數只會變更第一個輸入引數的定序，而不會變更其輸出值。

## 範例
<a name="r_COLLATE-example"></a>

若要建立資料表 T 並將資料表 T 中的 col1 定義為 `case_sensitive`，請使用下列範例。

```
CREATE TABLE T ( col1 Varchar(20) COLLATE case_sensitive );

INSERT INTO T VALUES ('john'),('JOHN');
```

 當您執行第一個查詢時，Amazon Redshift 只會傳回 `john`。在 col1 上執行 COLLATE 函數之後，定序會變成 `case_insensitive`。第二個查詢會傳回 `john` 和 `JOHN`。

```
SELECT * FROM T WHERE col1 = 'john';

+------+
| col1 |
+------+
| john |
+------+

SELECT * FROM T WHERE COLLATE(col1, 'case_insensitive') = 'john';

+------+
| col1 |
+------+
| john |
| JOHN |
+------+
```

若要建立資料表 A 並將資料表 A 中的 col1 定義為 `case_insensitive`，請使用下列範例。

```
CREATE TABLE A ( col1 Varchar(20) COLLATE case_insensitive );

INSERT INTO A VALUES ('john'),('JOHN');
```

 當您執行第一個查詢時，Amazon Redshift 會同時傳回 `john` 和 `JOHN`。在 col1 上執行 COLLATE 函數之後，定序會變成 `case_sensitive`。第二個查詢只會傳回 `john`。

```
SELECT * FROM A WHERE col1 = 'john';

+------+
| col1 |
+------+
| john |
| JOHN |
+------+

SELECT * FROM A WHERE COLLATE(col1, 'case_sensitive') = 'john';

+------+
| col1 |
+------+
| john |
+------+
```

# CONCAT 函數
<a name="r_CONCAT"></a>

CONCAT 函數會串連兩個運算式，並傳回產生的運算式。若要串連兩個以上的運算式，請使用巢狀 CONCAT 函數。兩個運算式之間的串連運算子 (`||`) 產生與 CONCAT 函數相同的結果。

## 語法
<a name="r_CONCAT-synopsis"></a>

```
CONCAT ( expression1, expression2 )
```

## 引數
<a name="r_CONCAT-arguments"></a>

 *expression1*、*expression2*   
這兩個引數都可以是固定長度的字元字串、可變長度字串、二進位運算式或計算結果為這些輸入之一的運算式。

## 傳回類型
<a name="r_CONCAT-return-type"></a>

 CONCAT 傳回一個運算式。運算式的資料類型與輸入引數的類型相同。

如果輸入運算式的類型不同，Amazon Redshift 會嘗試以隱含方式輸入轉換其中一個運算式。如果無法轉換數值，系統會傳回一個錯誤。

## 使用須知
<a name="r_CONCAT-usage-notes"></a>
+ 對於 CONCAT 函數和串連運算子，如果一個或兩個運算式為 Null，則串連的結果為 Null。

## 範例
<a name="r_CONCAT-examples"></a>

下列範例串連兩個字元常值：

```
SELECT CONCAT('December 25, ', '2008');

concat
-------------------
December 25, 2008
(1 row)
```

下列查詢 (使用 `||` 運算子，而不是 CONCAT) 產生相同的結果：

```
SELECT 'December 25, '||'2008';

?column?
-------------------
December 25, 2008
(1 row)
```

下列範例會使用另一個 CONCAT 函數內的巢狀 CONCAT 函數來連接三個字元字串：

```
SELECT CONCAT('Thursday, ', CONCAT('December 25, ', '2008'));

concat
-----------------------------
Thursday, December 25, 2008
(1 row)
```

若要串連可能包含 NULL 的欄，請使用 [NVL 和 COALESCE 函數](r_NVL_function.md)，當遇到 NULL 時會傳回指定值。下列範例使用 NVL，只要遇到 NULL 就傳回 0。

```
SELECT CONCAT(venuename, CONCAT(' seats ', NVL(venueseats, 0))) AS seating
FROM venue WHERE venuestate = 'NV' OR venuestate = 'NC'
ORDER BY 1
LIMIT 5;

seating                            
-----------------------------------
Ballys Hotel seats 0               
Bank of America Stadium seats 73298
Bellagio Hotel seats 0             
Caesars Palace seats 0             
Harrahs Hotel seats 0              
(5 rows)
```

下列查詢串連 VENUE 資料表中的 CITY 和 STATE 值：

```
SELECT CONCAT(venuecity, venuestate)
FROM venue
WHERE venueseats > 75000
ORDER BY venueseats;

concat
-------------------
DenverCO
Kansas CityMO
East RutherfordNJ
LandoverMD
(4 rows)
```

下列查詢使用巢狀 CONCAT 函數。此查詢串連 VENUE 資料表中的 CITY 和 STATE 值，但以逗號和空格來分隔產生的字串：

```
SELECT CONCAT(CONCAT(venuecity,', '),venuestate)
FROM venue
WHERE venueseats > 75000
ORDER BY venueseats;

concat
---------------------
Denver, CO
Kansas City, MO
East Rutherford, NJ
Landover, MD
(4 rows)
```

下列範例會串連兩個二進位運算式。其中 `abc` 是二進位值 (以十六進位表示 `616263`)，且 `def` 是二進位值 (使用十六進位表示 `646566`)。結果會自動顯示為二進位值的十六進位表示。

```
SELECT CONCAT('abc'::VARBYTE, 'def'::VARBYTE);

concat
-------------------
616263646566
```

# CRC32 函數
<a name="crc32-function"></a>

CRC32 是用於錯誤檢測的函數。函數使用 CRC32 演算法來偵測來源和目標資料之間的變更。CRC32 函數將可變長度字串轉換為 8 個字元的字串，此為 32 位元二進位序列之十六進位值的文字表示法。若要偵測來源與目標資料之間的變更，請在來源資料上使用 CRC32 函數並儲存輸出。然後，在目標資料上使用 CRC32 函數，並將該輸出與來源資料的輸出進行比較。如果資料沒有被修改，輸出將是相同的，如果資料被修改，輸出將不同。

## 語法
<a name="crc32-function-syntax"></a>

```
CRC32(string)
```

## 引數
<a name="crc32-function-arguments"></a>

 *string*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

## 傳回類型
<a name="crc32-function-return-type"></a>

CRC32 函數傳回 8 個字元的字串，此為 32 位元二進位序列之十六進位值的文字表示法。Amazon Redshift CRC32 函數以 CRC-32C 多項式為基礎。

## 範例
<a name="crc32-function-example"></a>

為了顯示字串 `Amazon Redshift` 的 8 位值。

```
SELECT CRC32('Amazon Redshift');

+----------+
|  crc32   |
+----------+
| f2726906 |
+----------+
```

# DIFFERENCE 函數
<a name="DIFFERENCE"></a>

DIFFERENCE 函數比較兩個字串的 American Soundex 代碼。該函數傳回 `INTEGER`，以指示 Soundex 代碼之間的比對字元的數量。

 一個 Soundex 代碼是一個四個字元長的字串。Soundex 代碼代表單詞的發音方式，而不是拼寫方式。例如，`Smith` 和 `Smyth` 具有相同的 Soundex 代碼。

## 語法
<a name="DIFFERENCE-synopsis"></a>

```
DIFFERENCE(string1, string2)
```

## 引數
<a name="DIFFERENCE-arguments"></a>

 *string1*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

 *string2*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

## 傳回類型
<a name="DIFFERENCE-return-type"></a>

 INTEGER   
DIFFERENCE 函數傳回 0-4 之間的 `INTEGER` 值，用於計算兩個字串的 American Soundex 代碼中比對字元的數量。Soundex 代碼有 4 個字元，因此當字串的 American Soundex 代碼值的所有 4 個字元都相同時，DIFFERENCE 函數會傳回 `4`。如果兩個字串中的一個為空，則 DIFFERENCE 傳回 `0`。如果字串都不包含有效字元，該函數傳回 `1`。DIFFERENCE 函數只會轉換英文字母小寫或大寫 ASCII 字元，包括 a-z 和 A-Z。DIFFERENCE 會忽略其他字元。

## 範例
<a name="DIFFERENCE-examples"></a>

若要比較字串 `%` 和 `@` 的 Soundex 值，請使用下列範例。該函數傳回 `1`，因為字串都不包含有效的字元。

```
SELECT DIFFERENCE('%', '@');

+------------+
| difference |
+------------+
|          1 |
+------------+
```

若要比較 `Amazon` 的 Soundex 值和一個空字串，請使用下列範例。該函數傳回 `0`，因為兩個字串中的一個是空的。

```
SELECT DIFFERENCE('Amazon', '');

+------------+
| difference |
+------------+
|          0 |
+------------+
```

若要比較字串 `Amazon` 和 `Ama` 的 Soundex 值，請使用下列範例。該函數傳回 `2`，因為字串的 Soundex 值的 2 個字元是相同的。

```
SELECT DIFFERENCE('Amazon', 'Ama');

+------------+
| difference |
+------------+
|          2 |
+------------+
```

若要比較字串 `Amazon` 和 `+-*/%Amazon` 的 Soundex 值，請使用下列範例。該函數傳回 `4`，因為字串的 Soundex 值的所有 4 個字元都是相同的。請注意，函數會忽略第二個字串中的無效字元 `+-*/%`。

```
SELECT DIFFERENCE('Amazon', '+-*/%Amazon');

+------------+
| difference |
+------------+
|          4 |
+------------+
```

若要比較字串 `AC/DC` 和 `Ay See Dee See` 的 Soundex 值，請使用下列範例。函數傳回 `4`，因為字串的 Soundex 值的所有 4 個字元都相同。

```
SELECT DIFFERENCE('AC/DC', 'Ay See Dee See');

+------------+
| difference |
+------------+
|          4 |
+------------+
```

# INITCAP 函數
<a name="r_INITCAP"></a>

將指定字串中每個單字的第一個字母變成大寫。INITCAP 支援 UTF-8 多位元組字元，每個字元最多 4 個位元組。

## 語法
<a name="r_INITCAP-synopsis"></a>

```
INITCAP(string)
```

## 引數
<a name="r_INITCAP-argument"></a>

 *string*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

## 傳回類型
<a name="r_INITCAP-return-type"></a>

VARCHAR

## 使用須知
<a name="r_INITCAP_usage_notes"></a>

INITCAP 函數將字串中每個單字的第一個字母變成大寫，而後續任何字母都變成 (或保持) 小寫。因此，必須了解哪些字元 (除了空白字元) 做為單字分隔符號。*單字分隔符號*字元是任何非英數字元，包括標點符號、記號及控制字元。以下所有字元都是單字分隔符號：

```
! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` { | } ~ 
```

Tab、新行字元、換頁、換行及歸位也是單字分隔符號。

## 範例
<a name="r_INITCAP-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 和 USERS 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將 CATDESC 欄中每個單字的首字母變成大寫，請使用下列範例。

```
SELECT catid, catdesc, INITCAP(catdesc)
FROM category
ORDER BY 1, 2, 3;

+-------+--------------------------------------------+--------------------------------------------+
| catid |                  catdesc                   |                  initcap                   |
+-------+--------------------------------------------+--------------------------------------------+
|     1 | Major League Baseball                      | Major League Baseball                      |
|     2 | National Hockey League                     | National Hockey League                     |
|     3 | National Football League                   | National Football League                   |
|     4 | National Basketball Association            | National Basketball Association            |
|     5 | Major League Soccer                        | Major League Soccer                        |
|     6 | Musical theatre                            | Musical Theatre                            |
|     7 | All non-musical theatre                    | All Non-Musical Theatre                    |
|     8 | All opera and light opera                  | All Opera And Light Opera                  |
|     9 | All rock and pop music concerts            | All Rock And Pop Music Concerts            |
|    10 | All jazz singers and bands                 | All Jazz Singers And Bands                 |
|    11 | All symphony, concerto, and choir concerts | All Symphony, Concerto, And Choir Concerts |
+-------+--------------------------------------------+--------------------------------------------+
```

若要顯示 INITCAP 函數不保留非單字開頭的大寫字元，請使用下列範例。例如，字串 `MLB` 會變成 `Mlb`。

```
SELECT INITCAP(catname)
FROM category
ORDER BY catname;

+-----------+
|  initcap  |
+-----------+
| Classical |
| Jazz      |
| Mlb       |
| Mls       |
| Musicals  |
| Nba       |
| Nfl       |
| Nhl       |
| Opera     |
| Plays     |
| Pop       |
+-----------+
```

若要將空格以外的非英數字元顯示為文字分隔符號，請使用下列範例。每個字串中的幾個字母將被大寫。

```
SELECT email, INITCAP(email)
FROM users
ORDER BY userid DESC LIMIT 5;

+------------------------------------+------------------------------------+
|               email                |              initcap               |
+------------------------------------+------------------------------------+
| urna.Ut@egetdictumplacerat.edu     | Urna.Ut@Egetdictumplacerat.Edu     |
| nibh.enim@egestas.ca               | Nibh.Enim@Egestas.Ca               |
| in@Donecat.ca                      | In@Donecat.Ca                      |
| sodales@blanditviverraDonec.ca     | Sodales@Blanditviverradonec.Ca     |
| sociis.natoque.penatibus@vitae.org | Sociis.Natoque.Penatibus@Vitae.Org |
+------------------------------------+------------------------------------+
```

# LEFT 和 RIGHT 函數
<a name="r_LEFT"></a>

這些函數從字元字串最左邊或最右邊傳回指定的字元數。

數目以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。

## 語法
<a name="r_LEFT-synopsis"></a>

```
LEFT( string,  integer )

RIGHT( string,  integer )
```

## 引數
<a name="r_LEFT-arguments"></a>

 *string*   
`CHAR` 字串、`VARCHAR` 字串或任何計算結果為 `CHAR` 或 `VARCHAR` 字串的運算式。

 *integer*   
正整數。

## 傳回類型
<a name="r_LEFT-return-type"></a>

VARCHAR

## 範例
<a name="r_LEFT-example"></a>

下列範例會使用 TICKIT 範例資料庫中 EVENT 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 ID 介於 1000 和 1005 之間的活動名稱中，傳回最左邊 5 個和最右邊 5 個字元，請使用下列範例。

```
SELECT eventid, eventname,
LEFT(eventname,5) AS left_5,
RIGHT(eventname,5) AS right_5
FROM event
WHERE eventid BETWEEN 1000 AND 1005
ORDER BY 1;

+---------+----------------+--------+---------+
| eventid |   eventname    | left_5 | right_5 |
+---------+----------------+--------+---------+
|    1000 | Gypsy          | Gypsy  | Gypsy   |
|    1001 | Chicago        | Chica  | icago   |
|    1002 | The King and I | The K  | and I   |
|    1003 | Pal Joey       | Pal J  | Joey    |
|    1004 | Grease         | Greas  | rease   |
|    1005 | Chicago        | Chica  | icago   |
+---------+----------------+--------+---------+
```

# LEN 函數
<a name="r_LEN"></a>

以字元數傳回指定字串的長度。

## 語法
<a name="r_LEN-synopsis"></a>

LEN 是 [LENGTH 函數](r_LENGTH.md)、[CHAR\$1LENGTH 函數](r_CHAR_LENGTH.md)、[CHARACTER\$1LENGTH 函數](r_CHARACTER_LENGTH.md) 及 [TEXTLEN 函數](r_TEXTLEN.md) 的同義詞。

```
LEN(expression)
```

## 引數
<a name="r_LEN-argument"></a>

 *表達式*   
`CHAR` 字串、`VARCHAR` 字串、`VARBYTE` 運算式或隱含評估為 `CHAR`、`VARCHAR` 或 `VARBYTE` 類型的運算式。

## 傳回類型
<a name="r_LEN-return-type"></a>

 INTEGER   
LEN 函數傳回整數，表示輸入字串中的字元數。  
如果輸入字串是字串，則 LEN 函數會傳回多位元組字串中的實際字元數，而不是位元組數。例如，需要 `VARCHAR(12)` 欄來儲存三個四位元組中文字元。LEN 函數針對此相同字串傳回 `3`。若要取得字串的長度 (以位元組為單位)，請使用 [OCTET\$1LENGTH](r_OCTET_LENGTH.md) 函數。

## 使用須知
<a name="r_LEN_usage_notes"></a>

如果 *expression* 是 `CHAR` 字串，不計算結尾空格。

如果 *expression* 是 `VARCHAR` 字串，則計算結尾空格。

## 範例
<a name="r_LEN-example"></a>

若要傳回字串 `français` 中的位元組數和字元數，請使用下列範例。

```
SELECT OCTET_LENGTH('français'), 
LEN('français');

+--------------+-----+
| octet_length | len |
+--------------+-----+
|            9 |   8 |
+--------------+-----+
```

若要在不使用 OCTET\$1LENGTH 函數的情況下傳回字串 `français` 中的位元組數和字元數，請使用下列範例。如需更多資訊，請參閱[CAST 函數](r_CAST_function.md)。

```
SELECT LEN(CAST('français' AS VARBYTE)) as bytes, LEN('français');

+-------+-----+
| bytes | len |
+-------+-----+
|     9 |   8 |
+-------+-----+
```

若要傳回沒有結尾空格的字串 `cat` 中的字元數、具有三個結尾空格的 `cat ` 中的字元數、將具有三個結尾空格的 `cat ` 轉換為長度為 6 的 `CHAR`，以及將具有三個結尾空格的 `cat ` 轉換為長度為 6 的 `VARCHAR`，請使用以下範例。請注意，該函數不會計算 `CHAR` 字串的結尾空格，但會計算 `VARCHAR` 字串的結尾空格。

```
SELECT LEN('cat'), LEN('cat   '), LEN(CAST('cat   ' AS CHAR(6))) AS len_char, LEN(CAST('cat   ' AS VARCHAR(6))) AS len_varchar;

+-----+-----+----------+-------------+
| len | len | len_char | len_varchar |
+-----+-----+----------+-------------+
|   3 |   6 |        3 |           6 |
+-----+-----+----------+-------------+
```

下列範例使用 TICKIT 範例資料庫中 VENUE 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要傳回 VENUE 資料表中前十個最長的會場名稱，請使用下列範例。

```
SELECT venuename, LEN(venuename)
FROM venue
ORDER BY 2 DESC, 1
LIMIT 10;

+-----------------------------------------+-----+
|                venuename                | len |
+-----------------------------------------+-----+
| Saratoga Springs Performing Arts Center |  39 |
| Lincoln Center for the Performing Arts  |  38 |
| Nassau Veterans Memorial Coliseum       |  33 |
| Jacksonville Municipal Stadium          |  30 |
| Rangers BallPark in Arlington           |  29 |
| University of Phoenix Stadium           |  29 |
| Circle in the Square Theatre            |  28 |
| Hubert H. Humphrey Metrodome            |  28 |
| Oriole Park at Camden Yards             |  27 |
| Dick's Sporting Goods Park              |  26 |
+-----------------------------------------+-----+
```

# LENGTH 函數
<a name="r_LENGTH"></a>

LEN 函數的同義詞。

請參閱 [LEN 函數](r_LEN.md)。

# LOWER 函數
<a name="r_LOWER"></a>

將字串轉換成小寫。LOWER 支援 UTF-8 多位元組字元，每個字元最多 4 個位元組。

## 語法
<a name="r_LOWER-synopsis"></a>

```
LOWER(string)
```

## 引數
<a name="r_LOWER-argument"></a>

 *string*   
評估為 `VARCHAR` 類型的 `VARCHAR` 字串或運算式。

## 傳回類型
<a name="r_LOWER-return-type"></a>

 string   
LOWER 函數傳回與輸入字串的資料類型相同的字串。例如，如果輸入是 `CHAR` 字串，該函數將傳回 `CHAR` 字串。

## 範例
<a name="r_LOWER-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將 CATNAME 欄中的 `VARCHAR` 字串轉換為小寫，請使用下列範例。

```
SELECT catname, LOWER(catname) FROM category ORDER BY 1,2;

+-----------+-----------+
|  catname  |   lower   |
+-----------+-----------+
| Classical | classical |
| Jazz      | jazz      |
| MLB       | mlb       |
| MLS       | mls       |
| Musicals  | musicals  |
| NBA       | nba       |
| NFL       | nfl       |
| NHL       | nhl       |
| Opera     | opera     |
| Plays     | plays     |
| Pop       | pop       |
+-----------+-----------+
```

# LPAD 和 RPAD 函數
<a name="r_LPAD"></a>

這些函數根據指定的長度，將字元附加到字串的前面或後面。

## 語法
<a name="r_LPAD-synopsis"></a>

```
LPAD(string1, length, [ string2 ])
```

```
RPAD(string1, length, [ string2 ])
```

## 引數
<a name="r_LPAD-arguments"></a>

 *string1*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

 *長度*   
整數，定義函數結果的長度。字串長度以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。如果 *string1* 比指定的長度更長，則會截斷 (從右邊)。如果 *length* 是零或負數，則函數結果為空字串。

 *string2*   
(選用) 附加到 *string1* 前面或後面的一或多個字元。如果未指定此引數，則使用空格。

## 傳回類型
<a name="r_LPAD-return-type"></a>

VARCHAR

## 範例
<a name="r_LPAD-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 EVENT 資料表中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將一組指定的活動名稱截斷至 20 個字元，並在較短名稱的前面附加空格，請使用下列範例。

```
SELECT LPAD(eventname, 20) FROM event
WHERE eventid BETWEEN 1 AND 5 ORDER BY 1;

+---------------------+
|         lpad        |
+---------------------+
|              Salome |
|        Il Trovatore |
|       Boris Godunov |
|     Gotterdammerung |
|La Cenerentola (Cind |
+-----------------------+
```

若要將同一組活動名稱截斷至 20 個字元，但在較短名稱的後面附加 `0123456789`，請使用下列範例。

```
SELECT RPAD(eventname, 20,'0123456789') FROM event
WHERE eventid BETWEEN 1 AND 5 ORDER BY 1;

+----------------------+
|         rpad         |
+----------------------+
| Boris Godunov0123456 |
| Gotterdammerung01234 |
| Il Trovatore01234567 |
| La Cenerentola (Cind |
| Salome01234567890123 |
+----------------------+
```

# LTRIM 函數
<a name="r_LTRIM"></a>

從字串開頭修剪字元。刪除只包含在修剪字元清單中的字元的最長字串。當修剪字元沒有出現在輸入字串中時，就會完成修剪。

## 語法
<a name="r_LTRIM-synopsis"></a>

```
LTRIM( string [, trim_chars] )
```

## 引數
<a name="r_LTRIM-arguments"></a>

 *string*   
要修剪的字串資料行、運算式或字串常值。

 *trim\$1chars*   
字串欄、運算式或字串常值，代表要從 *string* 開頭修剪的字元。如果未指定，則會使用空格作為修剪字元。

## 傳回類型
<a name="r_LTRIM-return-type"></a>

LTRIM 函數會傳回與輸入 *string* 的資料類型相同的字元字串 (CHAR 或 VARCHAR)。

## 範例
<a name="r_LTRIM-example"></a>

下列範例從 `listime` 欄中擷取年份。字串常值 `'2008-'` 中的修剪字元表示要從左側修剪的字元。如果使用修剪字元 `'028-'`，則可以得到相同的結果。

```
select listid, listtime, ltrim(listtime, '2008-')
from listing
order by 1, 2, 3
limit 10;            

listid |      listtime       |     ltrim
-------+---------------------+----------------
     1 | 2008-01-24 06:43:29 | 1-24 06:43:29
     2 | 2008-03-05 12:25:29 | 3-05 12:25:29
     3 | 2008-11-01 07:35:33 | 11-01 07:35:33
     4 | 2008-05-24 01:18:37 | 5-24 01:18:37
     5 | 2008-05-17 02:29:11 | 5-17 02:29:11
     6 | 2008-08-15 02:08:13 | 15 02:08:13
     7 | 2008-11-15 09:38:15 | 11-15 09:38:15
     8 | 2008-11-09 05:07:30 | 11-09 05:07:30
     9 | 2008-09-09 08:03:36 | 9-09 08:03:36
    10 | 2008-06-17 09:44:54 | 6-17 09:44:54
```

當 *trim\$1chars* 中任何字元出現在 *string* 開頭時，LTRIM 會移除這些字元。下列範例修剪 VENUENAME (這是 VARCHAR 欄) 開頭出現的 'C'、'D' 和 'G' 字元。

```
select venueid, venuename, ltrim(venuename, 'CDG')
from venue
where venuename like '%Park'
order by 2
limit 7;             

venueid | venuename                  | btrim                    
--------+----------------------------+--------------------------
    121 | ATT Park                   | ATT Park                
    109 | Citizens Bank Park         | itizens Bank Park        
    102 | Comerica Park              | omerica Park             
      9 | Dick's Sporting Goods Park | ick's Sporting Goods Park
     97 | Fenway Park                | Fenway Park              
    112 | Great American Ball Park   | reat American Ball Park  
    114 | Miller Park                | Miller Park
```

下列範例使用修剪字元 `2`，這是從 `venueid` 欄擷取的。

```
select ltrim('2008-01-24 06:43:29', venueid) 
from venue where venueid=2;              

ltrim
------------------
008-01-24 06:43:29
```

下列範例不會修剪任何字元，因為在 `'0'` 修剪字元之前找到 `2`。

```
select ltrim('2008-01-24 06:43:29', '0');              

ltrim
-------------------
2008-01-24 06:43:29
```

下列範例會使用預設的空格修剪字元，並從字串的開頭修剪兩個空格。

```
select ltrim('  2008-01-24 06:43:29');              

ltrim
-------------------
2008-01-24 06:43:29
```

# OCTETINDEX 函數
<a name="OCTETINDEX"></a>

所述 OCTETINDEX 函數傳回一個字串作為一個位元組數中的子字串的位置。

## 語法
<a name="OCTETINDEX-synopsis"></a>

```
OCTETINDEX(substring, string)
```

## 引數
<a name="OCTETINDEX-arguments"></a>

 *substring*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

 *string*   
`CHAR` 字串、`VARCHAR` 字串或隱含評估為 `CHAR` 或 `VARCHAR` 類型的運算式。

## 傳回類型
<a name="OCTETINDEX-return-type"></a>

 INTEGER   
OCTETINDEX 函式會傳回與 *string* 中 *substring* 位置相對應的 `INTEGER` 值作為位元組數目，其中 *string* 中的第一個字元會計算為 1。如果 *string* 不包含多位元組字元，結果會等於 CHARINDEX 函數的結果。如果 *string* 不包含 *substring*，則函數會傳回 `0`。如果 *substring* 為空，則函數會傳回 `1`。

## 範例
<a name="OCTETINDEX-examples"></a>

若要傳回字串 `q` 中子字串的位置`Amazon Redshift`，請使用下列範例。此範例會傳回 `0`，因為 *substring* 不在 *string* 中。

```
SELECT OCTETINDEX('q', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          0 |
+------------+
```

若要傳回字串 中空子字串的位置`Amazon Redshift`，請使用下列範例。這個範例會傳回 `1`，因為 *substring* 是空的。

```
SELECT OCTETINDEX('', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          1 |
+------------+
```

若要傳回字串 `Redshift` 中子字串的位置`Amazon Redshift`，請使用下列範例。這個範例會傳回 `8`，因為 *substring* 是從 *string* 的第八個位元組開始。

```
SELECT OCTETINDEX('Redshift', 'Amazon Redshift');

+------------+
| octetindex |
+------------+
|          8 |
+------------+
```

若要傳回字串 `Redshift` 中子字串的位置`Amazon Redshift`，請使用下列範例。這個範例會傳回 `21`，因為 *string* 的前六個字元是雙位元組字元。

```
SELECT OCTETINDEX('Redshift', 'Άμαζον Amazon Redshift');

+------------+
| octetindex |
+------------+
|         21 |
+------------+
```

# OCTET\$1LENGTH 函數
<a name="r_OCTET_LENGTH"></a>

傳回指定字串的長度 (以位元組為單位)。

## 語法
<a name="r_OCTET_LENGTH-synopsis"></a>

```
OCTET_LENGTH(expression)
```

## 引數
<a name="r_OCTET_LENGTH-argument"></a>

 *表達式*   
`CHAR` 字串、`VARCHAR` 字串、`VARBYTE` 運算式或隱含評估為 `CHAR`、`VARCHAR` 或 `VARBYTE` 類型的運算式。

## 傳回類型
<a name="r_OCTET_LENGTH-return-type"></a>

 INTEGER   
OCTET\$1LENGTH 函數傳回整數，表示輸入字串中的位元組數。  
如果輸入字串是字元字串，則 [LEN](r_LEN.md) 函數會傳回多位元組字串中的實際字元數，而不是位元組數。例如，需要 `VARCHAR(12)` 欄來儲存三個四位元組中文字元。OCTET\$1LENGTH 函數將針對該字串傳回 `12`，而 LEN 函數會針對相同的字串傳回 `3`。

## 使用須知
<a name="r_OCTET_LENGTH_usage_notes"></a>

如果 *expression* 是 `CHAR` 字串，該函數傳回 `CHAR` 字串的長度。例如，`CHAR(6)` 輸入的輸出是 `CHAR(6)`。

如果 *expression* 是 `VARCHAR` 字串，則計算結尾空格。

## 範例
<a name="r_OCTET_LENGTH-example"></a>

若要在具有三個結尾空格的字串 `francais` 轉換為 `CHAR` 和 `VARCHAR` 類型時傳回位元組數，請使用下列範例。如需更多資訊，請參閱[CAST 函數](r_CAST_function.md)。

```
SELECT OCTET_LENGTH(CAST('francais   ' AS CHAR(15))) AS octet_length_char, OCTET_LENGTH(CAST('francais   ' AS VARCHAR(15))) AS octet_length_varchar;

+-------------------+----------------------+
| octet_length_char | octet_length_varchar |
+-------------------+----------------------+
|                15 |                   11 |
+-------------------+----------------------+
```

若要傳回字串 `français` 中的位元組數和字元數，請使用下列範例。

```
SELECT OCTET_LENGTH('français'), LEN('français');

+--------------+-----+
| octet_length | len |
+--------------+-----+
|            9 |   8 |
+--------------+-----+
```

若要在字串 `français` 轉換為 `VARBYTE` 時傳回位元組數，請使用下列範例。

```
SELECT OCTET_LENGTH(CAST('français' AS VARBYTE));

+--------------+
| octet_length |
+--------------+
|            9 |
+--------------+
```

# POSITION 函數
<a name="r_POSITION"></a>

傳回指定子字串在一個字串內的位置。

如需相似函數，請參閱 [CHARINDEX 函數](r_CHARINDEX.md) 和 [STRPOS 函數](r_STRPOS.md)。

## 語法
<a name="position-synopsis"></a>

```
POSITION(substring IN string )
```

## 引數
<a name="r_POSITION-arguments"></a>

 *substring*   
在 *string* 內要搜尋的子字串。

 *string*   
要搜尋的字串或欄。

## 傳回類型
<a name="position-return-type"></a>

POSITION 函數傳回對應於子字串位置的 `INTEGER` (以 1 開始，不是以零開始)。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。如果在字串內找不到子字串，POSITION 會傳回 `0`。

## 範例
<a name="sub-r_POSITION_usage_notes-examples"></a>

若要顯示字串 `fish` 在單字 `dog` 內的位置，請使用下列範例。

```
SELECT POSITION('fish' IN 'dog');

+-----------+
|  position |
+-----------+
|         0 |
+-----------+
```

若要顯示字串 `fish` 在單字 `dogfish` 內的位置，請使用下列範例。

```
SELECT POSITION('fish' IN 'dogfish');

+-----------+
|  position |
+-----------+
|         4 |
+-----------+
```

 以下範例使用 TICKIT 範例資料庫中的 SALES 資料表。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 SALES 資料表中傳回佣金超過 999.00 的不同銷售交易次數，請使用下列範例。此命令透過檢查佣金值開頭的小數是否超過 4 位元來計算大於 999.00 的佣金。

```
SELECT DISTINCT POSITION('.' IN commission), COUNT (POSITION('.' IN commission))
FROM sales 
WHERE POSITION('.' IN commission) > 4 
GROUP BY POSITION('.' IN commission)
ORDER BY 1,2;

+-----------+-------+
|  position | count |
+-----------+-------+
|         5 |   629 |
+-----------+-------+
```

# QUOTE\$1IDENT 函數
<a name="r_QUOTE_IDENT"></a>

QUOTE\$1IDENT 函數或會將指定的字串傳回為帶有開頭雙引號和結尾雙引號的字串。函數輸出可以用作 SQL 陳述式中的識別碼。該函數適當地加倍任何嵌入的雙引號。

只有在必須建立有效識別碼時、當字串包含非識別碼字元時，或否則會變為小寫時，QUOTE\$1IDENT 才會增加雙引號。若要一律傳回以單引號括住的字串，請使用 [QUOTE\$1LITERAL](r_QUOTE_LITERAL.md)。

## 語法
<a name="r_QUOTE_IDENT-synopsis"></a>

```
QUOTE_IDENT(string)
```

## 引數
<a name="r_QUOTE_IDENT-argument"></a>

 *string*   
`CHAR` 或 `VARCHAR` 字串。

## 傳回類型
<a name="r_QUOTE_IDENT-return-type"></a>

QUOTE\$1IDENT 函數傳回與輸入*字串*相同類型的字串。

## 範例
<a name="r_QUOTE_IDENT-example"></a>

若要傳回含雙引號的字串 `"CAT"`，請使用下列範例。

```
SELECT QUOTE_IDENT('"CAT"');

+-------------+
| quote_ident |
+-------------+
| """CAT"""   |
+-------------+
```

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要傳回以引號括住的 CATNAME 欄，請使用下列範例。

```
SELECT catid, QUOTE_IDENT(catname)
FROM category
ORDER BY 1,2;

+-------+-------------+
| catid | quote_ident |
+-------+-------------+
|     1 | "MLB"       |
|     2 | "NHL"       |
|     3 | "NFL"       |
|     4 | "NBA"       |
|     5 | "MLS"       |
|     6 | "Musicals"  |
|     7 | "Plays"     |
|     8 | "Opera"     |
|     9 | "Pop"       |
|    10 | "Jazz"      |
|    11 | "Classical" |
+-------+-------------+
```

# QUOTE\$1LITERAL 函數
<a name="r_QUOTE_LITERAL"></a>

QUOTE\$1LITERAL 函數將指定的字串做為單引號括住的字串傳回，可供 SQL 陳述式中做為字串常值。如果輸入參數是數字，QUOTE\$1LITERAL 會將輸入參數視為字串。適當地將任何內嵌單引號和反斜線加倍。

## 語法
<a name="r_QUOTE_LITERAL-synopsis"></a>

```
QUOTE_LITERAL(string)
```

## 引數
<a name="r_QUOTE_LITERAL-argument"></a>

 *string*   
`CHAR` 或 `VARCHAR` 字串。

## 傳回類型
<a name="r_QUOTE_LITERAL-return-type"></a>

QUOTE\$1LITERAL 函數傳回與輸入*字串*的資料類型相同的 `CHAR` 或 `VARCHAR` 字串。

## 範例
<a name="r_QUOTE_LITERAL-example"></a>

若要傳回含有單引號的字串 `''CAT''`，請使用下列範例。

```
SELECT QUOTE_LITERAL('''CAT''');

+---------------+
| quote_literal |
+---------------+
| '''CAT'''     |
+---------------+
```

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要傳回以單引號括住的 CATNAME 欄，請使用下列範例。

```
SELECT catid, QUOTE_LITERAL(catname)
FROM category
ORDER BY 1,2;

+-------+---------------+
| catid | quote_literal |
+-------+---------------+
|     1 | 'MLB'         |
|     2 | 'NHL'         |
|     3 | 'NFL'         |
|     4 | 'NBA'         |
|     5 | 'MLS'         |
|     6 | 'Musicals'    |
|     7 | 'Plays'       |
|     8 | 'Opera'       |
|     9 | 'Pop'         |
|    10 | 'Jazz'        |
|    11 | 'Classical'   |
+-------+---------------+
```

若要傳回以單引號括住的 CATID 欄，請使用下列範例。

```
SELECT QUOTE_LITERAL(catid), catname
FROM category
ORDER BY 1,2;

+---------------+-----------+
| quote_literal |  catname  |
+---------------+-----------+
| '1'           | MLB       |
| '10'          | Jazz      |
| '11'          | Classical |
| '2'           | NHL       |
| '3'           | NFL       |
| '4'           | NBA       |
| '5'           | MLS       |
| '6'           | Musicals  |
| '7'           | Plays     |
| '8'           | Opera     |
| '9'           | Pop       |
+---------------+-----------+
```

# REGEXP\$1COUNT 函數
<a name="REGEXP_COUNT"></a>

在字串中搜尋規則運算式模式，並傳回整數指出所指定模式出現在字串中的次數。如果找不到相符項目，則函數會傳回 `0`。如需規則表達式的詳細資訊，請參閱 [POSIX 運算子](pattern-matching-conditions-posix.md) 和維基百科中的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression)。

## 語法
<a name="REGEXP_COUNT-synopsis"></a>

```
REGEXP_COUNT( source_string, pattern [, position [, parameters ] ] )
```

## 引數
<a name="REGEXP_COUNT-arguments"></a>

 *source\$1string*   
`CHAR` 或 `VARCHAR` 字串。

 *pattern*   
代表規則表達式模式的 UTF-8 字串常值。如需詳細資訊，請參閱[POSIX 運算子](pattern-matching-conditions-posix.md)。

 *position*   
(選用) 正 `INTEGER`，表示在 *source\$1string* 內開始搜尋的位置。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。預設值為 `1`。如果 *position* 小於 `1`，則從 *source\$1string* 的第一個字元開始搜尋。如果 *position* 大於 *source\$1string* 中的字元數，則結果為 `0`。

 *參數*   
(選用) 一或多個字串常值，表示函數如何比對模式。可能值如下：  
+ c - 進行區分大小寫比對。預設是使用區分大小寫比對。
+ i - 進行不區分大小寫比對。
+ p - 使用 Perl 相容規則運算式 (PCRE) 方言解釋此模式。如需 PCRE 的詳細資訊，請參閱維基百科中的 [Perl 相容規則表達式](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)。

## 傳回類型
<a name="REGEXP_COUNT-return-type"></a>

INTEGER

## 範例
<a name="REGEXP_COUNT-examples"></a>

若要計算三字母序列出現的次數，請使用下列範例。

```
SELECT REGEXP_COUNT('abcdefghijklmnopqrstuvwxyz', '[a-z]{3}');

+--------------+
| regexp_count |
+--------------+
|            8 |
+--------------+
```

若要使用不區分大小寫的比對來計算字串 `FOX` 的出現次數，請使用下列範例。

```
SELECT REGEXP_COUNT('the fox', 'FOX', 1, 'i');

+--------------+
| regexp_count |
+--------------+
|            1 |
+--------------+
```

若要使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞，請使用下列範例。此範例使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。此範例會計算此類字詞的出現次數，並使用區分大小寫的比對。

```
SELECT REGEXP_COUNT('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 'p');

+--------------+
| regexp_count |
+--------------+
|            2 |
+--------------+
```

若要使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞，請使用下列範例。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的內涵。此範例會計算此類字詞的出現次數，但與前一個範例不同，因為它使用不區分大小寫的比對。

```
SELECT REGEXP_COUNT('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 'ip');

+--------------+
| regexp_count |
+--------------+
|            3 |
+--------------+
```

下列範例會使用 TICKIT 範例資料庫中 USERS 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要計算頂層網域名稱為 `org` 或 `edu` 的次數，請使用下列範例。

```
SELECT email, REGEXP_COUNT(email,'@[^.]*\.(org|edu)') FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------+
|                     email                     | regexp_count |
+-----------------------------------------------+--------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu |            1 |
| Suspendisse.tristique@nonnisiAenean.edu       |            1 |
| amet.faucibus.ut@condimentumegetvolutpat.ca   |            0 |
| sed@lacusUtnec.ca                             |            0 |
+-----------------------------------------------+--------------+
```

# REGEXP\$1INSTR 函數
<a name="REGEXP_INSTR"></a>

在字串中搜尋規則表達式模式，並傳回整數指出相符子字串的開始位置或結尾位置。如果找不到相符項目，則函數會傳回 `0`。REGEXP\$1INSTR 類似於 [POSITION](r_POSITION.md) 函數，但可讓您在字串中搜尋規則表達式模式。如需規則表達式的詳細資訊，請參閱 [POSIX 運算子](pattern-matching-conditions-posix.md) 和維基百科中的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression)。

## 語法
<a name="REGEXP_INSTR-synopsis"></a>

```
REGEXP_INSTR( source_string, pattern [, position [, occurrence] [, option [, parameters ] ] ] ] )
```

## 引數
<a name="REGEXP_INSTR-arguments"></a>

 *source\$1string*   
要搜尋的字串表達式，例如欄名。

 *pattern*   
代表規則表達式模式的 UTF-8 字串常值。如需詳細資訊，請參閱[POSIX 運算子](pattern-matching-conditions-posix.md)。

 *position*   
(選用) 正 `INTEGER`，表示在 *source\$1string* 內開始搜尋的位置。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。預設值為 `1`。如果 *position* 小於 `1`，則從 *source\$1string* 的第一個字元開始搜尋。如果 *position* 大於 *source\$1string* 中的字元數，則結果為 `0`。

 *occurrence*   
(選用) 正 `INTEGER`，表示要使用哪一個出現的模式。REGEXP\$1INSTR 略過前 `occurrence-1` 個相符項目。預設值為 `1`。如果 *occurrence* 小於 `1` 或大於 *source\$1string* 中的字元數，則忽略搜尋，且結果為 `0`。

 *option*   
(選用) 此值指出要傳回相符項目第一個字元的位置 (`0`)，還是相符項目後第一個字元的位置 (`1`)。非零值與 `1` 相同。預設值為 `0`。

 *參數*   
(選用) 一或多個字串常值，表示函數如何比對模式。可能值如下：  
+ c - 進行區分大小寫比對。預設是使用區分大小寫比對。
+ i - 進行不區分大小寫比對。
+ e - 使用子運算式擷取子字串。

  如果 *pattern* 包含子表達式，REGEXP\$1INSTR 使用 *pattern* 中的第一個子表達式來比對子字串。REGEXP\$1INSTR 只考慮第一個子表達式；忽略其他子表達式。如果模式沒有子表達式，REGEXP\$1INSTR 會忽略 'e' 參數。
+ p - 使用 Perl 相容規則運算式 (PCRE) 方言解釋此模式。如需 PCRE 的詳細資訊，請參閱維基百科中的 [Perl 相容規則表達式](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)。

## 傳回類型
<a name="REGEXP_INSTR-return-type"></a>

Integer

## 範例
<a name="REGEXP_INSTR-examples"></a>

下列範例使用 TICKIT 範例資料庫中 USERS 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要搜尋網域名稱開頭的 `@` 字元，並傳回第一個相符項目的開始位置，請使用以下範例。

```
SELECT email, REGEXP_INSTR(email, '@[^.]*')
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------+
|                     email                     | regexp_instr |
+-----------------------------------------------+--------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu |           21 |
| Suspendisse.tristique@nonnisiAenean.edu       |           22 |
| amet.faucibus.ut@condimentumegetvolutpat.ca   |           17 |
| sed@lacusUtnec.ca                             |            4 |
+-----------------------------------------------+--------------+
```

若要搜尋單字 `Center` 的變體，並傳回第一個相符項目的開始位置，請使用以下範例。

```
SELECT venuename, REGEXP_INSTR(venuename,'[cC]ent(er|re)$')
FROM venue
WHERE REGEXP_INSTR(venuename,'[cC]ent(er|re)$') > 0
ORDER BY venueid LIMIT 4;

+-----------------------+--------------+
|       venuename       | regexp_instr |
+-----------------------+--------------+
| The Home Depot Center |           16 |
| Izod Center           |            6 |
| Wachovia Center       |           10 |
| Air Canada Centre     |           12 |
+-----------------------+--------------+
```

若要使用不區分大小寫的比對邏輯來尋找字串 `FOX` 第一次出現的開始位置，請使用下列範例。

```
SELECT REGEXP_INSTR('the fox', 'FOX', 1, 1, 0, 'i');

+--------------+
| regexp_instr |
+--------------+
|            5 |
+--------------+
```

若要使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞，請使用下列範例。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。此範例會尋找第二個此類字詞的開始位置。

```
SELECT REGEXP_INSTR('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'p');

+--------------+
| regexp_instr |
+--------------+
|           21 |
+--------------+
```

若要使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞，請使用下列範例。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。此範例會尋找第二個這類字詞的開始位置，但與前一個範例不同，因為它使用不區分大小寫的比對。

```
SELECT REGEXP_INSTR('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 0, 'ip');

+--------------+
| regexp_instr |
+--------------+
|           15 |
+--------------+
```

# REGEXP\$1REPLACE 函數
<a name="REGEXP_REPLACE"></a>

在字串中搜尋規則表達式模式，並以指定的字串取代每一個出現的模式。REGEXP\$1REPLACE 類似於 [REPLACE 函數](r_REPLACE.md)，但可讓您在字串中搜尋規則表達式模式。如需規則表達式的詳細資訊，請參閱 [POSIX 運算子](pattern-matching-conditions-posix.md) 和維基百科中的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression)。

REGEXP\$1REPLACE 類似於 [TRANSLATE 函數](r_TRANSLATE.md) 和 [REPLACE 函數](r_REPLACE.md)，但 TRANSLATE 會進行多次單一字元替換，REPLACE 會將一整個字串替換成另一個字串，而 REGEXP\$1REPLACE 可讓您在字串中搜尋規則表達式模式。

## 語法
<a name="REGEXP_REPLACE-synopsis"></a>

```
REGEXP_REPLACE( source_string, pattern [, replace_string [ , position [, parameters ] ] ] )
```

## 引數
<a name="REGEXP_REPLACE-arguments"></a>

 *source\$1string*   
要搜尋的 `CHAR` 或 `VARCHAR` 字串運算式，例如欄名。

 *pattern*   
代表規則表達式模式的 UTF-8 字串常值。如需詳細資訊，請參閱[POSIX 運算子](pattern-matching-conditions-posix.md)。

*replace\$1string*  
(選用) `CHAR` 或 `VARCHAR` 字串運算式 (例如欄名)，用於搜尋每一個出現的模式。預設為空字串 ( "" )。

 *position*   
(選用) 正整數，表示在 *source\$1string* 內開始搜尋的位置。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。預設值為 `1`。如果 *position* 小於 `1`，則從 *source\$1string* 的第一個字元開始搜尋。如果 *position* 大於 *source\$1string* 中的字元數，則結果為 *source\$1string*。

 *參數*   
(選用) 一或多個字串常值，表示函數如何比對模式。可能值如下：  
+ c - 進行區分大小寫比對。預設是使用區分大小寫比對。
+ i - 進行不區分大小寫比對。
+ p - 使用 Perl 相容規則運算式 (PCRE) 方言解釋此模式。如需 PCRE 的詳細資訊，請參閱維基百科中的 [Perl 相容規則表達式](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)。

## 傳回類型
<a name="REGEXP_REPLACE-return-type"></a>

VARCHAR

如果 *pattern* 或 *replace\$1string* 為 `NULL`，函數會傳回 `NULL`。

## 範例
<a name="REGEXP_REPLACE-examples"></a>

若要使用不區分大小寫的比對取代值 `quick brown fox` 內所有出現的字串 `FOX`，請使用下列範例。

```
SELECT REGEXP_REPLACE('the fox', 'FOX', 'quick brown fox', 1, 'i');

+---------------------+
|   regexp_replace    |
+---------------------+
| the quick brown fox |
+---------------------+
```

下列範例會使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。若要以值 `[hidden]` 取代這類字詞的每個出現值，請使用下列範例。

```
SELECT REGEXP_REPLACE('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', '[hidden]', 1, 'p');

+-------------------------------+
|        regexp_replace         |
+-------------------------------+
| [hidden] plain A1234 [hidden] |
+-------------------------------+
```

下列範例會使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。若要以值 `[hidden]` 取代這類字詞的每個出現值，但與前面的範例不同之處在於它使用不區分大小寫的比對，請使用下列範例。

```
SELECT REGEXP_REPLACE('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', '[hidden]', 1, 'ip');

+----------------------------------+
|          regexp_replace          |
+----------------------------------+
| [hidden] plain [hidden] [hidden] |
+----------------------------------+
```

下列範例使用 TICKIT 範例資料庫中 USERS 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從電子郵件地中刪除 `@` 和網域名稱，請使用下列範例。

```
SELECT email, REGEXP_REPLACE(email, '@.*\\.(org|gov|com|edu|ca)$')
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+-----------------------+
|                     email                     |    regexp_replace     |
+-----------------------------------------------+-----------------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu | Etiam.laoreet.libero  |
| Suspendisse.tristique@nonnisiAenean.edu       | Suspendisse.tristique |
| amet.faucibus.ut@condimentumegetvolutpat.ca   | amet.faucibus.ut      |
| sed@lacusUtnec.ca                             | sed                   |
+-----------------------------------------------+-----------------------+
```

若要以 `internal.company.com` 取代電子郵件地址的網域名稱，請使用下列範例。

```
SELECT email, REGEXP_REPLACE(email, '@.*\\.[[:alpha:]]{2,3}','@internal.company.com') 
FROM users
ORDER BY userid LIMIT 4;

+-----------------------------------------------+--------------------------------------------+
|                     email                     |               regexp_replace               |
+-----------------------------------------------+--------------------------------------------+
| Etiam.laoreet.libero@sodalesMaurisblandit.edu | Etiam.laoreet.libero@internal.company.com  |
| Suspendisse.tristique@nonnisiAenean.edu       | Suspendisse.tristique@internal.company.com |
| amet.faucibus.ut@condimentumegetvolutpat.ca   | amet.faucibus.ut@internal.company.com      |
| sed@lacusUtnec.ca                             | sed@internal.company.com                   |
+-----------------------------------------------+--------------------------------------------+
```

# REGEXP\$1SUBSTR 函數
<a name="REGEXP_SUBSTR"></a>

搜尋規則運算式模式，傳回字串中的字元。REGEXP\$1SUBSTR 類似於 [SUBSTRING 函數](r_SUBSTRING.md) 函數，但可讓您在字串中搜尋規則表達式模式。如果函數不能比對規則運算式與字串中的任何字元，則傳回一個空字串。如需規則表達式的詳細資訊，請參閱 [POSIX 運算子](pattern-matching-conditions-posix.md) 和維基百科中的[規則表達式](https://en.wikipedia.org/wiki/Regular_expression)。

## 語法
<a name="REGEXP_SUBSTR-synopsis"></a>

```
REGEXP_SUBSTR( source_string, pattern [, position [, occurrence [, parameters ] ] ] )
```

## 引數
<a name="REGEXP_SUBSTR-arguments"></a>

 *source\$1string*   
要搜尋的字串運算式。

 *pattern*   
代表規則表達式模式的 UTF-8 字串常值。如需詳細資訊，請參閱[POSIX 運算子](pattern-matching-conditions-posix.md)。

 *position*   
正整數，表示在 *source\$1string* 內開始搜尋的位置。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。預設為 1。如果 *position* 小於 1，則從 *source\$1string* 的第一個字元開始搜尋。如果 *position* 大於 *source\$1string* 中的字元數，則結果為空字串 ("")。

 *occurrence*   
正整數，表示要使用哪一個出現的模式。REGEXP\$1SUBSTR 略過前 *occurrence* -1 個相符項目。預設為 1。如果 *occurrence* 小於 1 或大於 *source\$1string* 中的字元數，則會忽略搜尋且結果為空白。

 *參數*   
一或多個字串常值，表示函數如何比對模式。可能值如下：  
+ c - 進行區分大小寫比對。預設是使用區分大小寫比對。
+ i - 進行不區分大小寫比對。
+ e - 使用子運算式擷取子字串。

   如果 *pattern* 包含子表達式，REGEXP\$1SUBSTR 使用 *pattern* 中的第一個子表達式來比對子字串。子運算式是用括號括起來的模式中的運算式。例如，對於模式 `'This is a '`，會比對第一個運算式和字串 `'This is a (\\w+)'` 後跟一個單詞。具有 `e` 參數的 REGEXP\$1SUBSTR 不會傳回 *pattern*，而是僅傳回子運算式內的字串。

  REGEXP\$1SUBSTR 只考慮第一個子表達式；忽略其他子表達式。如果模式沒有子表達式，REGEXP\$1SUBSTR 會忽略 'e' 參數。
+ p - 使用 Perl 相容規則運算式 (PCRE) 方言解釋此模式。如需 PCRE 的詳細資訊，請參閱維基百科中的 [Perl 相容規則表達式](https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions)。

## 傳回類型
<a name="REGEXP_SUBSTR-return-type"></a>

VARCHAR

## 範例
<a name="REGEXP_SUBSTR-examples"></a>

下列範例傳回電子郵件地址在 @ 和網域域名之間的部分。查詢的 `users` 資料來自 Amazon Redshift 範例資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
SELECT email, regexp_substr(email,'@[^.]*')
FROM users
ORDER BY userid LIMIT 4;

                     email                     |      regexp_substr
-----------------------------------------------+--------------------------
 Suspendisse.tristique@nonnisiAenean.edu       | @nonnisiAenean
 amet.faucibus.ut@condimentumegetvolutpat.ca   | @condimentumegetvolutpat
 sed@lacusUtnec.ca                             | @lacusUtnec
 Cum@accumsan.com                              | @accumsan
```

下列範例會使用不區分大小寫的比對，傳回與第一次出現的字串 `FOX` 相對應的輸入部分。

```
SELECT regexp_substr('the fox', 'FOX', 1, 1, 'i');

 regexp_substr
---------------
 fox
```

下列範例會使用不區分大小寫的比對，傳回與第二次出現的字串 `FOX` 相對應的輸入部分。結果為空白 (非 null，長度 0)，因為沒有第二次出現。

```
SELECT regexp_substr('the fox', 'FOX', 1, 2, 'i');

 regexp_substr
---------------
```

下列範例會傳回以小寫字母開頭之輸入的第一部分。這在函數上與沒有 `c` 參數的相同 SELECT 陳述式完全相同。

```
SELECT regexp_substr('THE SECRET CODE IS THE LOWERCASE PART OF 1931abc0EZ.', '[a-z]+', 1, 1, 'c');

 regexp_substr
---------------
 abc
```

下列範例會使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。此範例會傳回對應於第二個這類字詞的輸入部分。

```
SELECT regexp_substr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 'p');

 regexp_substr
---------------
 a1234
```

下列範例會使用 PCRE 方言撰寫的模式來尋找至少包含一個數字和一個小寫字母的字詞。它使用 `?=` 運算子，該運算子在 PCRE 中具有特定的前瞻內涵。此範例會傳回與第二個此類字詞對應的輸入部分，但與前一個範例不同，因為它使用不區分大小寫的比對。

```
SELECT regexp_substr('passwd7 plain A1234 a1234', '(?=[^ ]*[a-z])(?=[^ ]*[0-9])[^ ]+', 1, 2, 'ip');

 regexp_substr
---------------
 A1234
```

下列範例會使用子運算式，使用不區分大小寫的比對來尋找符合模式 `'this is a (\\w+)'` 的第二個字串。它傳回括號內的子運算式。

```
SELECT regexp_substr(
               'This is a cat, this is a dog. This is a mouse.',
               'this is a (\\w+)', 1, 2, 'ie');
           
 regexp_substr
---------------
 dog
```

# REPEAT 函數
<a name="r_REPEAT"></a>

將字串重複指定的次數。如果輸入參數是數值，REPEAT 會將輸入參數視為字串。

[REPLICATE 函數](r_REPLICATE.md) 的同義詞。

## 語法
<a name="r_REPEAT-synopsis"></a>

```
REPEAT(string, integer)
```

## 引數
<a name="r_REPEAT-arguments"></a>

 *string*   
第一個輸入參數是要重複的字串。

 *integer*   
第二個參數是 `INTEGER`，表示字串重複的次數。

## 傳回類型
<a name="r_REPEAT-return-type"></a>

VARCHAR

## 範例
<a name="r_REPEAT-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將 CATEGORY 資料表中 CATID 欄的值重複三次，請使用下列範例。

```
SELECT catid, REPEAT(catid,3)
FROM category
ORDER BY 1,2;

+-------+--------+
| catid | repeat |
+-------+--------+
|     1 |    111 |
|     2 |    222 |
|     3 |    333 |
|     4 |    444 |
|     5 |    555 |
|     6 |    666 |
|     7 |    777 |
|     8 |    888 |
|     9 |    999 |
|    10 | 101010 |
|    11 | 111111 |
+-------+--------+
```

下列範例示範產生最多 16，000，000 個位元組的字串：

```
SELECT 
    LEN(REPEAT('X', 5000000)) AS five_million_bytes,
    LEN(REPEAT('Y', 16000000)) AS sixteen_million_bytes;

 five_million_bytes  | sixteen_million_bytes
----------+-----------
 5000000  | 16000000
```

# REPLACE 函數
<a name="r_REPLACE"></a>

以其他指定的字元取代一組字元在現有字串內出現的所有地方。

REPLACE 類似於 [TRANSLATE 函數](r_TRANSLATE.md) 和 [REGEXP\$1REPLACE 函數](REGEXP_REPLACE.md)，但 TRANSLATE 會進行多次單一字元替換，REGEXP\$1REPLACE 可讓您在字串中搜尋規則表達式模式，而 REPLACE 會將一整個字串替換成另一個字串。

## 語法
<a name="r_REPLACE-synopsis"></a>

```
REPLACE(string, old_chars, new_chars)
```

## 引數
<a name="r_REPLACE-arguments"></a>

 *string*   
要搜尋的 `CHAR` 或 `VARCHAR` 字串 

 *old\$1chars*   
要取代的 `CHAR` 或 `VARCHAR` 字串 

 *new\$1chars*   
新的 `CHAR` 或 `VARCHAR` 字串，用來取代 *old\$1string*。

## 傳回類型
<a name="r_REPLACE-return-type"></a>

VARCHAR  
如果 *old\$1chars* 或 *new\$1chars* 為 `NULL`，則結果為 `NULL`。

## 範例
<a name="r_REPLACE-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將 CATGROUP 欄位中的字串 `Shows` 轉換為 `Theatre`，請使用下列範例。

```
SELECT catid, catgroup, REPLACE(catgroup, 'Shows', 'Theatre')
FROM category
ORDER BY 1,2,3;

+-------+----------+----------+
| catid | catgroup | replace  |
+-------+----------+----------+
|     1 | Sports   | Sports   |
|     2 | Sports   | Sports   |
|     3 | Sports   | Sports   |
|     4 | Sports   | Sports   |
|     5 | Sports   | Sports   |
|     6 | Shows    | Theatre  |
|     7 | Shows    | Theatre  |
|     8 | Shows    | Theatre  |
|     9 | Concerts | Concerts |
|    10 | Concerts | Concerts |
|    11 | Concerts | Concerts |
+-------+----------+----------+
```

# REPLICATE 函數
<a name="r_REPLICATE"></a>

REPEAT 函數的同義詞。

請參閱 [REPEAT 函數](r_REPEAT.md)。

# REVERSE 函數
<a name="r_REVERSE"></a>

REVERSE 函數操作字串並傳回相反順序的字元。例如，`reverse('abcde')` 傳回 `edcba`。此函數適用於數值和日期資料類型，以及字元資料類型；不過，在大部分情況下，字元字串有實用值。

## 語法
<a name="r_REVERSE-synopsis"></a>

```
REVERSE( expression )
```

## 引數
<a name="r_REVERSE-argument"></a>

 *表達式*   
具有字元、日期、時間戳記或數值資料類型的運算式，代表字元反轉的目標。所有運算式都會隱含轉換為 `VARCHAR` 字串。`CHAR` 字串中的結尾空格會遭到忽略。

## 傳回類型
<a name="r_REVERSE-return-type"></a>

VARCHAR

## 範例
<a name="r_REVERSE-examples"></a>

下列範例使用來自 TICKIT 範例資料庫中 USERS 和 SALES 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 USERS 資料表中選取五個不同城市名稱及其對應的反轉名稱，請使用下列範例。

```
SELECT DISTINCT city AS cityname, REVERSE(cityname)
FROM users 
ORDER BY city LIMIT 5;

+----------+----------+
| cityname | reverse  |
+----------+----------+
| Aberdeen | needrebA |
| Abilene  | enelibA  |
| Ada      | adA      |
| Agat     | tagA     |
| Agawam   | mawagA   |
+----------+----------+
```

若要選取五個銷售 ID 及其對應的反轉 ID (轉換為字元字串)，請使用下列範例。

```
SELECT salesid, REVERSE(salesid)
FROM sales 
ORDER BY salesid DESC LIMIT 5;

+---------+---------+
| salesid | reverse |
+---------+---------+
|  172456 |  654271 |
|  172455 |  554271 |
|  172454 |  454271 |
|  172453 |  354271 |
|  172452 |  254271 |
+---------+---------+
```

# RTRIM 函數
<a name="r_RTRIM"></a>

RTRIM 函數從字串結尾修剪一組指定的字元。移除只包含修剪字元清單中字元的最長字串。當修剪字元沒有出現在輸入字串中時，就會完成修剪。

## 語法
<a name="r_RTRIM-synopsis"></a>

```
RTRIM( string, trim_chars )
```

## 引數
<a name="r_RTRIM-arguments"></a>

 *string*   
要修剪的字串資料行、運算式或字串常值。

 *trim\$1chars*   
字串欄、運算式或字串常值，代表要從 *string* 結尾修剪的字元。如果未指定，則會使用空格作為修剪字元。

## 傳回類型
<a name="r_RTRIM-return-type"></a>

與 *string* 引數的資料類型相同的字串。

## 範例
<a name="r_RTRIM-example"></a>

下列範例從字串 `' abc '` 中修剪開頭和結尾空格：

```
select '     abc    ' as untrim, rtrim('     abc    ') as trim;

untrim    | trim
----------+------
   abc    |    abc
```

下列範例從字串 `'xyzaxyzbxyzcxyz'` 中移除結尾 `'xyz'` 字串。結尾的 `'xyz'` 已移除，但出現在字串內的部分則未移除。

```
select 'xyzaxyzbxyzcxyz' as untrim,
rtrim('xyzaxyzbxyzcxyz', 'xyz') as trim;

     untrim      |   trim
-----------------+-----------
 xyzaxyzbxyzcxyz | xyzaxyzbxyzc
```

下列範例會從符合 *trim \$1chars* 清單 `'tes'` 中任何字元的字串 `'setuphistorycassettes'` 中移除結尾部分。任何出現在輸入字串結尾的 *trim\$1chars* 清單中另一個字元前的 `t`、`e` 或 `s` 都會被移除。

```
SELECT rtrim('setuphistorycassettes', 'tes');

     rtrim      
-----------------
 setuphistoryca
```

下列範例修剪 VENUENAME 結尾出現的 'Park' 這幾個字元：

```
select venueid, venuename, rtrim(venuename, 'Park')
from venue
order by 1, 2, 3
limit 10;

venueid |         venuename          |          rtrim
--------+----------------------------+-------------------------
      1 | Toyota Park                | Toyota
      2 | Columbus Crew Stadium      | Columbus Crew Stadium
      3 | RFK Stadium                | RFK Stadium
      4 | CommunityAmerica Ballpark  | CommunityAmerica Ballp
      5 | Gillette Stadium           | Gillette Stadium
      6 | New York Giants Stadium    | New York Giants Stadium
      7 | BMO Field                  | BMO Field
      8 | The Home Depot Center      | The Home Depot Cente
      9 | Dick's Sporting Goods Park | Dick's Sporting Goods
     10 | Pizza Hut Park             | Pizza Hut
```

請注意，當 `P`、`a`、`r` 或 `k` 其中任何字元出現在 VENUENAME 的結尾時，RTRIM 會移除這些字元。

# SOUNDEX 函數
<a name="SOUNDEX"></a>

SOUNDEX 函數傳回 American Soundex 值，該值由輸入字串的第一個字母後面跟著代表您指定字串的英文發音的 3 位元發音編碼組成。例如，`Smith` 和 `Smyth` 具有相同的 Soundex 值。

## 語法
<a name="SOUNDEX-synopsis"></a>

```
SOUNDEX(string)
```

## 引數
<a name="SOUNDEX-arguments"></a>

 *string*   
您可以指定要轉換為 American Soundex 代碼值的 `CHAR` 或 `VARCHAR` 字串。

## 傳回類型
<a name="SOUNDEX-return-type"></a>

VARCHAR(4)

## 使用須知
<a name="r_SOUNDEX_usage_notes"></a>

SOUNDEX 函數只會轉換英文字母小寫和大寫 ASCII 字元，包括 A-z 和 A-Z。SOUNDEX 會忽略其他字元。SOUNDEX 傳回由空格分隔的多個單詞的字串的單個 Soundex 值。

```
SELECT SOUNDEX('AWS Amazon');
            
+---------+
| soundex |
+---------+
| A252    |
+---------+
```

SOUNDEX 傳回一個空字串，如果輸入字串不包含任何英文字母。

```
SELECT SOUNDEX('+-*/%');

+---------+
| soundex |
+---------+
|         |
+---------+
```

## 範例
<a name="SOUNDEX-examples"></a>

若要傳回 `Amazon` 的 Soundex 值，請使用下列範例。

```
SELECT SOUNDEX('Amazon');

+---------+
| soundex |
+---------+
| A525    |
+---------+
```

若要傳回 `smith` 和 `smyth` 的 Soundex 值，請使用下列範例。請注意，聲音值是相同的。

```
SELECT SOUNDEX('smith'), SOUNDEX('smyth');

+-------+-------+
| smith | smyth |
+-------+-------+
| S530  | S530  |
+-------+-------+
```

# SPLIT\$1PART 函數
<a name="SPLIT_PART"></a>

在指定分隔符號之處分割字串，並傳回指定位置的部分。

## 語法
<a name="SPLIT_PART-synopsis"></a>

```
SPLIT_PART(string, delimiter, position)
```

## 引數
<a name="SPLIT_PART-arguments"></a>

 *string*   
要分割的字串資料欄、運算式或字串常值。字串可以是 CHAR 或 VARCHAR。

 *delimiter*   
分隔符號字串，表示輸入 *string* 的部分。  
如果 *delimiter* 是常值，請以單引號括住。

 *position*   
要傳回之*字串*部分的位置 (從 1 起算)。必須是大於 0 的整數。如果 *position* 大於字串部分的數目，SPLIT\$1PART 會傳回空字串。如果在 *string* 中找不到 *delimiter*，則傳回的值包含指定部分的內容，這可能是整個 *string* 或空值。

## 傳回類型
<a name="SPLIT_PART-return-type"></a>

CHAR 或 VARCHAR 字串，與*字串*參數相同。

## 範例
<a name="SPLIT_PART-examples"></a>

下列範例會使用 `$` 分隔符號將字串常值分割成多個部分，並傳回第二部分。

```
select split_part('abc$def$ghi','$',2)

split_part
----------
def
```

以下範例將使用 `$` 分隔符號將字串常值分割成多個部分。它傳回一個空字串，因為沒有找到部分 `4`。

```
select split_part('abc$def$ghi','$',4)

split_part
----------
```

以下範例將使用 `#` 分隔符號將字串常值分割成多個部分。它傳回整個字串，這是第一部分，因為沒有找到分隔符號。

```
select split_part('abc$def$ghi','#',1)

split_part
------------
abc$def$ghi
```

下列範例將時間戳記欄位 LISTTIME 分割成年、月、日元素。

```
select listtime, split_part(listtime,'-',1) as year,
split_part(listtime,'-',2) as month, 
split_part(split_part(listtime,'-',3),' ',1) as day 
from listing limit 5;

      listtime       | year | month | day
---------------------+------+-------+------
 2008-03-05 12:25:29 | 2008 | 03    | 05
 2008-09-09 08:03:36 | 2008 | 09    | 09
 2008-09-26 05:43:12 | 2008 | 09    | 26
 2008-10-04 02:00:30 | 2008 | 10    | 04
 2008-01-06 08:33:11 | 2008 | 01    | 06
```

下列範例選取 LISTTIME 時間戳記欄位，依 `'-'` 字元分割以取得月份 (LISTTIME 字串的第二部分)，然後計算每月的項目數：

```
select split_part(listtime,'-',2) as month, count(*)
from listing
group by split_part(listtime,'-',2)
order by 1, 2;

 month | count
-------+-------
    01 | 18543
    02 | 16620
    03 | 17594
    04 | 16822
    05 | 17618
    06 | 17158
    07 | 17626
    08 | 17881
    09 | 17378
    10 | 17756
    11 | 12912
    12 | 4589
```

# STRPOS 函數
<a name="r_STRPOS"></a>

傳回子字串在指定字串內的位置。

如需相似函數，請參閱 [CHARINDEX 函數](r_CHARINDEX.md) 和 [POSITION 函數](r_POSITION.md)。

## 語法
<a name="r_STRPOS-synopsis"></a>

```
STRPOS(string, substring )
```

## 引數
<a name="r_STRPOS-arguments"></a>

 *string*   
第一個輸入參數是要搜尋的 `CHAR` 或 `VARCHAR` 字串。

 *substring*   
第二個參數是在 *string* 內要搜尋的子字串。

## 傳回類型
<a name="r_STRPOS-return-type"></a>

INTEGER  
STRPOS 函數傳回對應於*子字串*位置的 `INTEGER` (以 1 開始，不是以零開始)。位置以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。

## 使用須知
<a name="r_STRPOS_usage_notes"></a>

如果在 *string* 內找不到 *substring*，STRPOS 會傳回 `0`。

```
SELECT STRPOS('dogfish', 'fist');

+--------+
| strpos |
+--------+
|      0 |
+--------+
```

## 範例
<a name="r_STRPOS-examples"></a>

若要顯示 `fish` 內 `dogfish` 的位置，請使用下列範例。

```
SELECT STRPOS('dogfish', 'fish');

+--------+
| strpos |
+--------+
|      4 |
+--------+
```

下列範例會使用 TICKIT 範例資料庫中 SALES 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要從 SALES 資料表中傳回 COMMISSION 超過 999.00 的銷售交易次數，請使用下列範例。

```
SELECT DISTINCT STRPOS(commission, '.'),
COUNT (STRPOS(commission, '.'))
FROM sales
WHERE STRPOS(commission, '.') > 4
GROUP BY STRPOS(commission, '.')
ORDER BY 1, 2;

+--------+-------+
| strpos | count |
+--------+-------+
|      5 |   629 |
+--------+-------+
```

# STRTOL 函數
<a name="r_STRTOL"></a>

將指定底數之數字的字串表達式轉換為等同的整數值。轉換的值必須在帶正負號的 64 位元範圍內。

## 語法
<a name="r_STRTOL-syntax"></a>

```
STRTOL(num_string, base)
```

## 引數
<a name="r_STRTOL-arguments"></a>

 *num\$1string*   
要轉換之數字的字串表達式。如果 *num\$1string* 是空的 ( `''` )，或開頭為 Null 字元 (`'\0'`)，則轉換的值為 `0`。如果 *num\$1string* 是含有 NULL 值的欄，STRTOL 會傳回 `NULL`。字串的開頭可以有任何數量的空格，後面可選擇接著單一加號 '`+`' 或減號 '`-`' 來表示正或負。預設為 '`+`'。如果 *base* 是 `16`，字串可選擇以 '`0x`' 開頭。

*base*  
`INTEGER` 介於 2 和 36 之間。

## 傳回類型
<a name="r_STRTOL-return-type"></a>

BIGINT  
如果 *num\$1string* 為空，則函數傳回 `NULL`。

## 範例
<a name="r_STRTOL-examples"></a>

若要將字串和基值對轉換為整數，請使用下列範例。

```
SELECT STRTOL('0xf',16);

+--------+
| strtol |
+--------+
|     15 |
+--------+

SELECT STRTOL('abcd1234',16);

+------------+
|   strtol   |
+------------+
| 2882343476 |
+------------+

SELECT STRTOL('1234567', 10);

+---------+
| strtol  |
+---------+
| 1234567 |
+---------+

SELECT STRTOL('1234567', 8);

+--------+
| strtol |
+--------+
| 342391 |
+--------+

SELECT STRTOL('110101', 2);

+--------+
| strtol |
+--------+
|     53 |
+--------+

SELECT STRTOL('\0', 2);

+--------+
| strtol |
+--------+
|      0 |
+--------+
```

# SUBSTRING 函數
<a name="r_SUBSTRING"></a>

根據指定的開始位置傳回字串的子集。

如果輸入是字串，則提取的開始位置和字元數是以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。如果輸入是二進位運算式，則開始位置和提取的子字串是以位元組為基礎。您不能指定負長度，但可以指定負的開始位置。

## 語法
<a name="r_SUBSTRING-synopsis"></a>

```
SUBSTRING(character_string FROM start_position [ FOR number_characters ] )
```

```
SUBSTRING(character_string, start_position, number_characters )
```

```
SUBSTRING(binary_expression, start_byte, number_bytes )
```

```
SUBSTRING(binary_expression, start_byte )
```

## 引數
<a name="r_SUBSTRING-arguments"></a>

 *character\$1string*   
供進行搜尋的字串。非字元資料類型視為字串。

 *start\$1position*   
在字串內要開始擷取的位置，從 1 開始。*start\$1position* 以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。這可以是負數。

 *number\$1characters*   
要擷取的字元數 (子字串的長度)。*number\$1characters* 以字元數為基礎，而不是位元組，所以多位元組字元視為單一字元。這不能是負數。

 *binary\$1expression*   
要搜尋之資料類型 VARBYTE 的 binary\$1expression。

 *start\$1byte*   
在二進位運算式內要開始擷取的位置，從 1 開始。這可以是負數。

 *number\$1bytes*   
要擷取的位元組數，即子字串的長度。此數字不可以是負數。

## 傳回類型
<a name="r_SUBSTRING-return-type"></a>

VARCHAR 或 VARBYTE 取決於輸入。

## 使用須知
<a name="r_SUBSTRING_usage_notes"></a>

以下是如何使用 *start\$1position* 和 *number\$1characters* 從字串中的各個位置提取子字串的一些範例。

下列範例傳回從第六個字元開始的四個字元的字串。

```
select substring('caterpillar',6,4);
substring
-----------
pill
(1 row)
```

如果 *start\$1position* \$1 *number\$1characters* 超過 *string* 的長度，SUBSTRING 會傳回從 *start\$1position* 開始到字串結尾的子字串。例如：

```
select substring('caterpillar',6,8);
substring
-----------
pillar
(1 row)
```

如果 `start_position` 是負數或 0，SUBSTRING 函數會傳回從字串第一個字元開始且長度為 `start_position` \$1 `number_characters` -1 的子字串。例如：

```
select substring('caterpillar',-2,6);
substring
-----------
cat
(1 row)
```

如果 `start_position` \$1 `number_characters` -1 小於或等於零，SUBSTRING 會傳回空字串。例如：

```
select substring('caterpillar',-5,4);
substring
-----------

(1 row)
```

## 範例
<a name="r_SUBSTRING-examples"></a>

下列範例從 LISTING 資料表的 LISTTIME 字串中傳回月份：

```
select listid, listtime,
substring(listtime, 6, 2) as month
from listing
order by 1, 2, 3
limit 10;

 listid |      listtime       | month
--------+---------------------+-------
      1 | 2008-01-24 06:43:29 | 01
      2 | 2008-03-05 12:25:29 | 03
      3 | 2008-11-01 07:35:33 | 11
      4 | 2008-05-24 01:18:37 | 05
      5 | 2008-05-17 02:29:11 | 05
      6 | 2008-08-15 02:08:13 | 08
      7 | 2008-11-15 09:38:15 | 11
      8 | 2008-11-09 05:07:30 | 11
      9 | 2008-09-09 08:03:36 | 09
     10 | 2008-06-17 09:44:54 | 06
(10 rows)
```

下列範例同上，但使用 FROM...FOR 選項：

```
select listid, listtime,
substring(listtime from 6 for 2) as month
from listing
order by 1, 2, 3
limit 10;

 listid |      listtime       | month
--------+---------------------+-------
      1 | 2008-01-24 06:43:29 | 01
      2 | 2008-03-05 12:25:29 | 03
      3 | 2008-11-01 07:35:33 | 11
      4 | 2008-05-24 01:18:37 | 05
      5 | 2008-05-17 02:29:11 | 05
      6 | 2008-08-15 02:08:13 | 08
      7 | 2008-11-15 09:38:15 | 11
      8 | 2008-11-09 05:07:30 | 11
      9 | 2008-09-09 08:03:36 | 09
     10 | 2008-06-17 09:44:54 | 06
(10 rows)
```

如果字串可能包含雙位元組字元，則您無法使用 SUBSTRING 來肯定地擷取字串的字首，因為您需要根據位元組數來指定雙位元組字串的長度，而不是字元數。若要根據位元組長度來擷取字串的開頭部分，您可以將字串 CAST 成為 VARCHAR(*byte\$1length*) 以截斷字串，其中 *byte\$1length* 是所需的長度。下列範例從 `'Fourscore and seven'` 字串中擷取前 5 個位元組。

```
select cast('Fourscore and seven' as varchar(5));

varchar
-------
Fours
```

下列範例顯示二進位值 `abc` 的負開始位置。因為開始位置是 -3，所以子字串是從二進位值的開頭提取的。結果自動顯示為二進位子字串的十六進位表示形式。

```
select substring('abc'::varbyte, -3);

 substring
-----------
 616263
```

下列範例顯示 1 作為二進位值 `abc` 的開始位置。因為沒有指定長度，所以字串從開始位置提取到字串的結尾。結果自動顯示為二進位子字串的十六進位表示形式。

```
select substring('abc'::varbyte, 1);

 substring
-----------
 616263
```

下列範例顯示 3 作為二進位值 `abc` 的開始位置。因為沒有指定長度，所以字串是從開始位置提取到字串的結尾。結果自動顯示為二進位子字串的十六進位表示形式。

```
select substring('abc'::varbyte, 3);

 substring
-----------
 63
```

下列範例顯示 2 作為二進位值 `abc` 的開始位置。字串從開始位置提取到位置 10，但字串的結尾位於位置 3。結果自動顯示為二進位子字串的十六進位表示形式。

```
select substring('abc'::varbyte, 2, 10);

 substring
-----------
 6263
```

下列範例顯示 2 作為二進位值 `abc` 的開始位置。字串從開始位置提取 1 個位元組。結果自動顯示為二進位子字串的十六進位表示形式。

```
select substring('abc'::varbyte, 2, 1);

 substring
-----------
 62
```

下列範例會傳回輸入字串 `Silva, Ana` 中最後一個空格之後出現的名字 `Ana`。

```
select reverse(substring(reverse('Silva, Ana'), 1, position(' ' IN reverse('Silva, Ana'))))

 reverse
-----------
 Ana
```

# TEXTLEN 函數
<a name="r_TEXTLEN"></a>

LEN 函數的同義詞。

請參閱 [LEN 函數](r_LEN.md)。

# TRANSLATE 函數
<a name="r_TRANSLATE"></a>

對於給定的表達式，以指定的替換值取代所有出現的指定字元。現有字元依位置映射至 *characters\$1to\$1replace* 和 *characters\$1to\$1substitute* 引數中的替換字元。如果 *characters\$1to\$1replace* 引數中指定的字元數比 *characters\$1to\$1substitute* 引數更多，傳回值中會省略 *characters\$1to\$1replace* 引數中額外的字元。

TRANSLATE 類似於 [REPLACE 函數](r_REPLACE.md) 和 [REGEXP\$1REPLACE 函數](REGEXP_REPLACE.md)，但 REPLACE 會將一整個字串替換成另一個字串，REGEXP\$1REPLACE 可讓您在字串中搜尋規則表達式模式，而 TRANSLATE 會進行多次單一字元替換。

如果任何引數為 Null，則傳回值為 `NULL`。

## 語法
<a name="r_TRANSLATE-synopsis"></a>

```
TRANSLATE( expression, characters_to_replace, characters_to_substitute )
```

## 引數
<a name="r_TRANSLATE-arguments"></a>

 *表達式*   
要轉換的表達式。

 *characters\$1to\$1replace*   
包含要取代之字元的字串。

 *characters\$1to\$1substitute*   
包含替換字元的字串。

## 傳回類型
<a name="r_TRANSLATE-return-type"></a>

VARCHAR

## 範例
<a name="r_TRANSLATE-examples"></a>

若要取代字串中的幾個字元，請使用下列範例。

```
SELECT TRANSLATE('mint tea', 'inea', 'osin');

+-----------+
| translate |
+-----------+
| most tin  |
+-----------+
```

下列範例使用 TICKIT 範例資料庫中 USERS 資料表的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要對某欄的所有值，以點取代 at 符號 (@)，請使用下列範例。

```
SELECT email, TRANSLATE(email, '@', '.') as obfuscated_email
FROM users LIMIT 10;

+---------------------------------------+---------------------------------------+
|                 email                 |           obfuscated_email            |
+---------------------------------------+---------------------------------------+
| Cum@accumsan.com                      | Cum.accumsan.com                      |
| lorem.ipsum@Vestibulumante.com        | lorem.ipsum.Vestibulumante.com        |
| non.justo.Proin@ametconsectetuer.edu  | non.justo.Proin.ametconsectetuer.edu  |
| non.ante.bibendum@porttitortellus.org | non.ante.bibendum.porttitortellus.org |
| eros@blanditatnisi.org                | eros.blanditatnisi.org                |
| augue@Donec.ca                        | augue.Donec.ca                        |
| cursus@pedeacurna.edu                 | cursus.pedeacurna.edu                 |
| at@Duis.com                           | at.Duis.com                           |
| quam@facilisisvitaeorci.ca            | quam.facilisisvitaeorci.ca            |
| mi.lorem@nunc.edu                     | mi.lorem.nunc.edu                     |
+---------------------------------------+---------------------------------------+
```

 若要對某欄的所有值，以點底線取代空格並剔除點，請使用下列範例。

```
SELECT city, TRANSLATE(city, ' .', '_') 
FROM users
WHERE city LIKE 'Sain%' OR city LIKE 'St%'
GROUP BY city
ORDER BY city;

+----------------+---------------+
|      city      |   translate   |
+----------------+---------------+
| Saint Albans   | Saint_Albans  |
| Saint Cloud    | Saint_Cloud   |
| Saint Joseph   | Saint_Joseph  |
| Saint Louis    | Saint_Louis   |
| Saint Paul     | Saint_Paul    |
| St. George     | St_George     |
| St. Marys      | St_Marys      |
| St. Petersburg | St_Petersburg |
| Stafford       | Stafford      |
| Stamford       | Stamford      |
| Stanton        | Stanton       |
| Starkville     | Starkville    |
| Statesboro     | Statesboro    |
| Staunton       | Staunton      |
| Steubenville   | Steubenville  |
| Stevens Point  | Stevens_Point |
| Stillwater     | Stillwater    |
| Stockton       | Stockton      |
| Sturgis        | Sturgis       |
+----------------+---------------+
```

# TRIM 函數
<a name="r_TRIM"></a>

以空白或指定的字元來修剪字串。

## 語法
<a name="r_TRIM-synopsis"></a>

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

## 引數
<a name="r_TRIM-arguments"></a>

 BOTH \$1 LEADING \$1 TRAILING   
(選用) 指定從何處修剪字元。使用 BOTH 可移除開頭字元和結尾字元，使用 LEADING 僅移除開頭字元，使用 TRAILING 僅移除結尾字元。如果省略此參數，會同時修剪開頭和結尾字元。

 *trim\$1chars*   
(選用) 要從字串中修剪的字元。如果省略此參數，則會修剪空格。

 *string*   
要修剪的字串。

## 傳回類型
<a name="r_TRIM-return-type"></a>

TRIM 函數傳回 `VARCHAR` 或 `CHAR` 字串。如果您搭配 SQL 命令來使用 TRIM 函數，Amazon Redshift 會隱含地將結果轉換為 `VARCHAR`。如果您在 SQL 函數的 SELECT 清單中使用 TRIM 函數，Amazon Redshift 不會隱含地轉換結果，您可能需要執行明確轉換，以避免資料類型不符的錯誤。如需明確轉換的相關資訊，請參閱 [CAST 函數](r_CAST_function.md)及 [CONVERT 函數](r_CONVERT_function.md)。

## 範例
<a name="r_TRIM-example"></a>

若要從字串 ` dog ` 中修剪開頭和結尾空格，請使用下列範例。

```
SELECT TRIM('    dog    ');

+-------+
| btrim |
+-------+
| dog   |
+-------+
```

若要從字串 ` dog ` 中修剪開頭和結尾空格，請使用下列範例。

```
SELECT TRIM(BOTH FROM '    dog    ');

+-------+
| btrim |
+-------+
| dog   |
+-------+
```

若要從字串 `"dog"` 中移除開頭雙引號，請使用下列範例。

```
SELECT TRIM(LEADING '"' FROM'"dog"');

+-------+
| ltrim |
+-------+
| dog"  |
+-------+
```

若要從字串 `"dog"` 中移除結尾的雙引號，請使用下列範例。

```
SELECT TRIM(TRAILING '"' FROM'"dog"');

+-------+
| rtrim |
+-------+
| "dog  |
+-------+
```

當 *trim\$1chars* 中任何字元出現在 *string* 開頭或結尾時，TRIM 會移除這些字元。下列範例修剪 VENUENAME (這是 `VARCHAR` 欄) 開頭或結尾出現的 'C'、'D' 和 'G' 字元。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
SELECT venueid, venuename, TRIM('CDG' FROM venuename)
FROM venue
WHERE venuename LIKE '%Park'
ORDER BY 2
LIMIT 7;

+---------+----------------------------+---------------------------+
| venueid |         venuename          |           btrim           |
+---------+----------------------------+---------------------------+
|     121 | AT&T Park                  | AT&T Park                 |
|     109 | Citizens Bank Park         | itizens Bank Park         |
|     102 | Comerica Park              | omerica Park              |
|       9 | Dick's Sporting Goods Park | ick's Sporting Goods Park |
|      97 | Fenway Park                | Fenway Park               |
|     112 | Great American Ball Park   | reat American Ball Park   |
|     114 | Miller Park                | Miller Park               |
+---------+----------------------------+---------------------------+
```

# UPPER 函數
<a name="r_UPPER"></a>

將字串轉換成大寫。UPPER 支援 UTF-8 多位元組字元，每個字元最多 4 個位元組。

## 語法
<a name="r_UPPER-synopsis"></a>

```
UPPER(string)
```

## 引數
<a name="r_UPPER-arguments"></a>

 *string*   
輸入參數是 `VARCHAR` 字串或任何其他資料類型，例如 `CHAR`，可以隱含轉換為 `VARCHAR`。

## 傳回類型
<a name="r_UPPER-return-type"></a>

UPPER 函數傳回與輸入字串的資料類型相同的字元字串。例如，如果輸入是 `VARCHAR` 字串，該函數將傳回 `VARCHAR` 字串。

## 範例
<a name="r_UPPER-examples"></a>

下列範例會使用 TICKIT 範例資料庫中 CATEGORY 表格中的資料。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

若要將 CATNAME 欄位轉換為大寫，請使用下列範例。

```
SELECT catname, UPPER(catname) 
FROM category 
ORDER BY 1,2;

+-----------+-----------+
|  catname  |   upper   |
+-----------+-----------+
| Classical | CLASSICAL |
| Jazz      | JAZZ      |
| MLB       | MLB       |
| MLS       | MLS       |
| Musicals  | MUSICALS  |
| NBA       | NBA       |
| NFL       | NFL       |
| NHL       | NHL       |
| Opera     | OPERA     |
| Plays     | PLAYS     |
| Pop       | POP       |
+-----------+-----------+
```

# SUPER 類型資訊函數
<a name="c_Type_Info_Functions"></a>

接下來，您可以找到 Amazon Redshift 支援的 SQL 類型資訊函數的說明，以便從 `SUPER` 資料類型的輸入衍生動態資訊。

**Topics**
+ [DECIMAL\$1PRECISION 函數](r_decimal_precision.md)
+ [DECIMAL\$1SCALE 函數](r_decimal_scale.md)
+ [IS\$1ARRAY 函數](r_is_array.md)
+ [IS\$1BIGINT 函數](r_is_bigint.md)
+ [IS\$1BOOLEAN 函數](r_is_boolean.md)
+ [IS\$1CHAR 函數](r_is_char.md)
+ [IS\$1DECIMAL 函數](r_is_decimal.md)
+ [IS\$1FLOAT 函數](r_is_float.md)
+ [IS\$1INTEGER 函數](r_is_integer.md)
+ [IS\$1OBJECT 函數](r_is_object.md)
+ [IS\$1SCALAR 函數](r_is_scalar.md)
+ [IS\$1SMALLINT 函數](r_is_smallint.md)
+ [IS\$1VARCHAR 函數](r_is_varchar.md)
+ [JSON\$1SIZE 函數](r_json_size.md)
+ [JSON\$1TYPEOF 函數](r_json_typeof.md)
+ [SIZE](r_SIZE.md)

# DECIMAL\$1PRECISION 函數
<a name="r_decimal_precision"></a>

檢查要儲存的最大小數位數的精確度。這個數字包括小數點左邊和右邊的數字。精確度的範圍是從 1 到 38，預設值為 38。

## 語法
<a name="r_decimal_precision-synopsis"></a>

```
DECIMAL_PRECISION(super_expression)
```

## 引數
<a name="r_decimal_precision-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_decimal_precision-returns"></a>

`INTEGER`

## 範例
<a name="r_decimal_precision_example"></a>

若要將 DECIMAL\$1PRECISION 函數套用至資料表 t，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (3.14159);

SELECT DECIMAL_PRECISION(s) FROM t;

+-------------------+
| decimal_precision |
+-------------------+
|                 6 |
+-------------------+
```

# DECIMAL\$1SCALE 函數
<a name="r_decimal_scale"></a>

檢查要儲存到小數點右邊的小數位數。刻度的範圍是從 0 到精確度點，預設值為 0。

## 語法
<a name="r_decimal_scale-synopsis"></a>

```
DECIMAL_SCALE(super_expression)
```

## 引數
<a name="r_decimal_scale-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_decimal_scale-returns"></a>

`INTEGER`

## 範例
<a name="r_decimal_scale_example"></a>

若要將 DECIMAL\$1SCALE 函數套用至資料表 t，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (3.14159);

SELECT DECIMAL_SCALE(s) FROM t;

+---------------+
| decimal_scale |
+---------------+
|             5 |
+---------------+
```

# IS\$1ARRAY 函數
<a name="r_is_array"></a>

檢查變數是否為陣列。如果變數是陣列，函數會傳回 `true`。該函數還包括空陣列。否則，函數會針對所有其他值傳回 `false`，包括 null。

## 語法
<a name="r_is_array-synopsis"></a>

```
IS_ARRAY(super_expression)
```

## 引數
<a name="r_is_array-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_array-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_array_example"></a>

若要使用 IS\$1ARRAY 函數檢查 `[1,2]` 是否為陣列，請使用下列範例。

```
SELECT IS_ARRAY(JSON_PARSE('[1,2]'));

+----------+
| is_array |
+----------+
| true     |
+----------+
```

# IS\$1BIGINT 函數
<a name="r_is_bigint"></a>

檢查值是否為 `BIGINT`。IS\$1BIGINT 函數會針對 64 位元範圍內標度 0 的數字傳回 `true`。否則，函數會針對所有其他值傳回 `false`，包括 null 和浮點數。

IS\$1BIGINT 函數是 IS\$1INTEGER 的超集。

## 語法
<a name="r_is_bigint-synopsis"></a>

```
IS_BIGINT(super_expression)
```

## 引數
<a name="r_is_bigint-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_bigint-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_bigint_example"></a>

若要使用 IS\$1BIGINT 函數檢查 `5` 是否為 `BIGINT`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_BIGINT(s) FROM t;

+---+-----------+
| s | is_bigint |
+---+-----------+
| 5 | true      |
+---+-----------+
```

# IS\$1BOOLEAN 函數
<a name="r_is_boolean"></a>

檢查值是否為 `BOOLEAN`。IS\$1BOOLEAN 函數會針對常數 JSON 布林值傳回 `true`。函數會針對所有其他值傳回 `false`，包括 null。

## 語法
<a name="r_is_boolean-synopsis"></a>

```
IS_BOOLEAN(super_expression)
```

## 引數
<a name="r_is_boolean-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_boolean-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_boolean_example"></a>

若要使用 IS\$1BOOLEAN 函數檢查 `TRUE` 是否為 `BOOLEAN`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (TRUE);

SELECT s, IS_BOOLEAN(s) FROM t;

+------+------------+
|  s   | is_boolean |
+------+------------+
| true | true       |
+------+------------+
```

# IS\$1CHAR 函數
<a name="r_is_char"></a>

檢查值是否為 `CHAR`。對於僅包含 ASCII 字元的字串，IS\$1CHAR 函數傳回 `true`，因為 CHAR 類型只能儲存 ASCII 格式的字元。函數會針對所有其他值傳回 `false`。

## 語法
<a name="r_is_char-synopsis"></a>

```
IS_CHAR(super_expression)
```

## 引數
<a name="r_is_char-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_char-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_char_example"></a>

若要使用 IS\$1CHAR 函數檢查 `t` 是否為 `CHAR`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES ('t');

SELECT s, IS_CHAR(s) FROM t;

+-----+---------+
|  s  | is_char |
+-----+---------+
| "t" | true    |
+-----+---------+
```

# IS\$1DECIMAL 函數
<a name="r_is_decimal"></a>

檢查值是否為 `DECIMAL`。IS\$1DECIMAL 函數會針對非浮點數的數字傳回 `true`。函數會針對所有其他值傳回 `false`，包括 null。

IS\$1DECIMAL 函數是 IS\$1BIGINT 的超集。

## 語法
<a name="r_is_decimal-synopsis"></a>

```
IS_DECIMAL(super_expression)
```

## 引數
<a name="r_is_decimal-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_decimal-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_decimal_example"></a>

若要使用 IS\$1DECIMAL 函數檢查 `1.22` 是否為 `DECIMAL`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (1.22);

SELECT s, IS_DECIMAL(s) FROM t;

+------+------------+
|  s   | is_decimal |
+------+------------+
| 1.22 | true       |
+------+------------+
```

# IS\$1FLOAT 函數
<a name="r_is_float"></a>

檢查一個值是否為浮點數。IS\$1FLOAT 函數會針對浮點數 (`FLOAT4` 和 `FLOAT8`) 傳回 `true`。函數會針對所有其他值傳回 `false`。

IS\$1DECIMAL 的集合和 IS\$1FLOAT 的集合是不相交的。

## 語法
<a name="r_is_float-synopsis"></a>

```
IS_FLOAT(super_expression)
```

## 引數
<a name="r_is_float-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_float-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_float_example"></a>

若要使用 IS\$1FLOAT 函數檢查 `2.22::FLOAT` 是否為 `FLOAT`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES(2.22::FLOAT);

SELECT s, IS_FLOAT(s) FROM t;

+---------+----------+
|    s    | is_float |
+---------+----------+
| 2.22e+0 | true     |
+---------+----------+
```

# IS\$1INTEGER 函數
<a name="r_is_integer"></a>

對於 32 位元範圍內的小數位數為 0 的數字，則傳回 `true`；對於其他任何數字 (包括 null 和浮點數)，則傳回 `false`。

IS\$1INTEGER 函數是 IS\$1SMALLINT 函數的超集。

## 語法
<a name="r_is_integer-synopsis"></a>

```
IS_INTEGER(super_expression)
```

## 引數
<a name="r_is_integer-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_integer-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_integer_example"></a>

若要使用 IS\$1INTEGER 函數檢查 `5` 是否為 `INTEGER`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_INTEGER(s) FROM t;

+---+------------+
| s | is_integer |
+---+------------+
| 5 | true       |
+---+------------+
```

# IS\$1OBJECT 函數
<a name="r_is_object"></a>

檢查變數是否為物件。IS\$1OBJECT 函數會針對物件傳回 `true`，包括空物件。函數會針對所有其他值傳回 `false`，包括 null。

## 語法
<a name="r_is_object-synopsis"></a>

```
IS_OBJECT(super_expression)
```

## 引數
<a name="r_is_object-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_object-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_object_example"></a>

若要使用 IS\$1OBJECT 函數檢查 `{"name": "Joe"}` 是否為物件，請使用下列範例。

```
CREATE TABLE t(s super);

INSERT INTO t VALUES (JSON_PARSE('{"name": "Joe"}'));

SELECT s, IS_OBJECT(s) FROM t;

+----------------+-----------+
|       s        | is_object |
+----------------+-----------+
| {"name":"Joe"} | true      |
+----------------+-----------+
```

# IS\$1SCALAR 函數
<a name="r_is_scalar"></a>

檢查變數是否為純量。IS\$1SCALAR 函數會為任何非陣列或物件的值傳回 `true`。函數會針對所有其他值傳回 `false`，包括 null。

IS\$1ARRAY、IS\$1OBJECT 和 IS\$1SCALAR 的集合涵蓋了除 null 值之外的所有值。

## 語法
<a name="r_is_scalar-synopsis"></a>

```
IS_SCALAR(super_expression)
```

## 引數
<a name="r_is_scalar-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_scalar-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_scalar_example"></a>

若要檢查 `{"name": "Joe"}` 是否為使用 IS\$1SCALAR 函數的純量，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (JSON_PARSE('{"name": "Joe"}'));

SELECT s, IS_SCALAR(s.name) FROM t;

+----------------+-----------+
|       s        | is_scalar |
+----------------+-----------+
| {"name":"Joe"} | true      |
+----------------+-----------+
```

# IS\$1SMALLINT 函數
<a name="r_is_smallint"></a>

檢查變數是否為 `SMALLINT`。IS\$1SMALLINT 函數會針對 16 位元範圍內標度 0 的數字傳回 `true`。函數會針對所有其他值傳回 `false`，包括 null 和浮點數。

## 語法
<a name="r_is_smallint-synopsis"></a>

```
IS_SMALLINT(super_expression)
```

## 引數
<a name="r_is_smallint-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回
<a name="r_is_smallint-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_smallint_example"></a>

若要使用 IS\$1SMALLINT 函數檢查 `5` 是否為 `SMALLINT`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES (5);

SELECT s, IS_SMALLINT(s) FROM t;

+---+-------------+
| s | is_smallint |
+---+-------------+
| 5 | true        |
+---+-------------+
```

# IS\$1VARCHAR 函數
<a name="r_is_varchar"></a>

檢查變數是否為 `VARCHAR`。IS\$1VARCHAR 函數會針對所有字串傳回 `true`。函數會針對所有其他值傳回 `false`。

IS\$1VARCHAR 函數是 IS\$1CHAR 函數的超集。

## 語法
<a name="r_is_varchar-synopsis"></a>

```
IS_VARCHAR(super_expression)
```

## 引數
<a name="r_is_varchar-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_is_varchar-returns"></a>

`BOOLEAN`

## 範例
<a name="r_is_varchar_example"></a>

若要使用 IS\$1VARCHAR 函數檢查 `abc` 是否為 `VARCHAR`，請使用下列範例。

```
CREATE TABLE t(s SUPER);

INSERT INTO t VALUES ('abc');

SELECT s, IS_VARCHAR(s) FROM t;

+-------+------------+
|   s   | is_varchar |
+-------+------------+
| "abc" | true       |
+-------+------------+
```

# JSON\$1SIZE 函數
<a name="r_json_size"></a>

JSON\$1SIZE 函數傳回傳回序列化為字串時給定 `SUPER` 運算式中的位元組數。

## 語法
<a name="r_json_size-synopsis"></a>

```
JSON_SIZE(super_expression)
```

## 引數
<a name="r_json_size-arguments"></a>

*super\$1expression*  
`SUPER` 常數或運算式。

## 傳回類型
<a name="r_json_size-returns"></a>

`INTEGER`  
JSON\$1SIZE 函數傳回 `INTEGER`，表示輸入字串中的位元組數。此值與字元數目不同。例如，UTF-8 字元 ⬤ (黑點) 的大小為 3 個位元組，即使它是 1 個字元。

## 使用須知
<a name="r_json_size-usage_notes"></a>

JSON\$1SIZE(x) 在功能上與 OCTET\$1LENGTH(JSON\$1SERIALIZE) 相同。但是，請注意，當提供的 `SUPER` 運算式在序列化時超過系統 `VARCHAR` 限制時，JSON\$1SERIALIZE 會傳回錯誤。JSON\$1SIZE 則沒有此限制。

## 範例
<a name="r_json_size_example"></a>

若要傳回序列化為字串的 `SUPER` 值的長度，請使用下列範例。

```
SELECT JSON_SIZE(JSON_PARSE('[10001,10002,"⬤"]'));

+-----------+
| json_size |
+-----------+
|        19 |
+-----------+
```

請注意，提供的 `SUPER` 運算式長度為 17 個字元，但 ⬤ 是 3 位元組字元，因此 JSON\$1SIZE 傳回 `19`。

# JSON\$1TYPEOF 函數
<a name="r_json_typeof"></a>

JSON\$1TYPEOF 純量函數會傳回具有布林值、數字、字串、物件、陣列或 null 的 `VARCHAR`，取決於 `SUPER` 值的動態類型。

## 語法
<a name="r_json_typeof-synopsis"></a>

```
JSON_TYPEOF(super_expression)
```

## 引數
<a name="r_json_typeof-arguments"></a>

*super\$1expression*  
`SUPER` 運算式或欄。

## 傳回類型
<a name="r_json_typeof-returns"></a>

`VARCHAR`

## 範例
<a name="r_json_typeof_example"></a>

若要使用 JSON\$1TYPEOF 函數檢查陣列 `[1,2]` 的 JSON 類型，請使用下列範例。

```
SELECT JSON_TYPEOF(ARRAY(1,2));

+-------------+
| json_typeof |
+-------------+
| array       |
+-------------+
```

若要使用 JSON\$1TYPEOF 函數檢查物件 `{"name":"Joe"}` 的 JSON 類型，請使用下列範例。

```
SELECT JSON_TYPEOF(JSON_PARSE('{"name":"Joe"}'));

+-------------+
| json_typeof |
+-------------+
| object      |
+-------------+
```

# SIZE
<a name="r_SIZE"></a>

 以 `INTEGER` 形式傳回 `SUPER` 類型常數或運算式的二進位記憶體內大小。

## 語法
<a name="r_SIZE-synopsis"></a>

```
SIZE(super_expression)
```

## 引數
<a name="r_SIZE-parameters"></a>

*super\$1expression*  
 `SUPER` 類型常數或運算式。

## 傳回類型
<a name="r_SIZE-returns"></a>

`INTEGER`

## 範例
<a name="r_SIZE-examples"></a>

 若要使用 SIZE 取得數個 `SUPER` 類型運算式的記憶體內大小，請使用下列範例。

```
CREATE TABLE test_super_size(a SUPER);
            
INSERT INTO test_super_size 
VALUES
  (null),
  (TRUE),
  (JSON_PARSE('[0,1,2,3]')),
  (JSON_PARSE('{"a":0,"b":1,"c":2,"d":3}'))
;

SELECT a, SIZE(a) 
FROM test_super_size 
ORDER BY 2, 1;

+---------------------------+------+
|             a             | size |
+---------------------------+------+
| true                      |    4 |
| NULL                      |    4 |
| [0,1,2,3]                 |   23 |
| {"a":0,"b":1,"c":2,"d":3} |   52 |
+---------------------------+------+
```

# VARBYTE 函數與運算子
<a name="varbyte-functions"></a>

支援 VARBYTE 資料類型的 Amazon Redshift 函數和運算子包括：
+ [VARBYTE 運算子](r_VARBYTE_OPERATORS.md)
+ [FROM\$1HEX](r_FROM_HEX.md)
+ [FROM\$1VARBYTE](r_FROM_VARBYTE.md)
+ [GETBIT](r_GETBIT.md)
+ [TO\$1HEX](r_TO_HEX.md)
+ [TO\$1VARBYTE](r_TO_VARBYTE.md)
+ [CONCAT](r_CONCAT.md)
+ [LEN](r_LEN.md)
+ [LENGTH 函數](r_LENGTH.md)
+ [OCTET\$1LENGTH](r_OCTET_LENGTH.md)
+ [SUBSTRING 函數](r_SUBSTRING.md)

# VARBYTE 運算子
<a name="r_VARBYTE_OPERATORS"></a>

 下表會列出 VARBYTE 運算子。此運算子使用資料類型 VARBYTE 的二進位值。如果一個或兩個輸入都為 null，則結果為 null。

## 支援的運算子
<a name="r_VARBYTE_OPERATORS-supported-operators"></a>

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_VARBYTE_OPERATORS.html)

## 範例
<a name="r_VARBYTE_OPERATORS-examples"></a>

在下列範例中，`'a'::VARBYTE` 的值為 `61`，`'b'::VARBYTE` 的值為 `62`。`::` 將字串轉換為 `VARBYTE` 資料類型。如需轉換資料類型的相關資訊，請參閱 [CAST](r_CAST_function.md)。

若要使用 `<` 運算子比較 `'a'` 是否小於 `'b'`，請使用下列範例。

```
SELECT 'a'::VARBYTE < 'b'::VARBYTE AS less_than;
               
+-----------+
| less_than |
+-----------+
| true      |
+-----------+
```

若要使用 `=` 運算子來比較 `'a'` 是否等於 `'b'`，請使用下列範例。

```
SELECT 'a'::VARBYTE = 'b'::VARBYTE AS equal;
               
+-------+
| equal |
+-------+
| false |
+-------+
```

若要使用 `||` 運算子連接兩個二進位值，請使用下列範例。

```
SELECT 'a'::VARBYTE || 'b'::VARBYTE AS concat;
               
+--------+
| concat |
+--------+
|   6162 |
+--------+
```

若要使用 `+` 運算子連接兩個二進位值，請使用下列範例。

```
SELECT 'a'::VARBYTE + 'b'::VARBYTE AS concat;
               
+--------+
| concat |
+--------+
|   6162 |
+--------+
```

若要使用 FROM\$1VARBYTE 函數求反輸入二進位值的每一位，請使用下列範例。字串 `'a'` 評估為 `01100001`。如需更多詳細資訊，請參閱 [FROM\$1VARBYTE](r_FROM_VARBYTE.md)。

```
SELECT FROM_VARBYTE(~'a'::VARBYTE, 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     10011110 |
+--------------+
```

若要在兩個輸入二進位值上套用 `&` 運算子，請使用下列範例。字串 `'a'` 評估為 `01100001` 且 `'b'` 評估為 `01100010`。

```
SELECT FROM_VARBYTE('a'::VARBYTE & 'b'::VARBYTE, 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     01100000 |
+--------------+
```

# FROM\$1HEX 函數
<a name="r_FROM_HEX"></a>

FROM\$1HEX 將十六進位轉換為二進位值。

## 語法
<a name="r_FROM_HEX-synopsis"></a>

```
FROM_HEX(hex_string)
```

## 引數
<a name="r_FROM_HEX-arguments"></a>

 *hex\$1string*   
要轉換的 `VARCHAR` 或 `TEXT` 資料類型十六進位字串。格式必須是文字值。

## 傳回類型
<a name="r_FROM_HEX-return-type"></a>

`VARBYTE`

## 範例
<a name="r_FROM_HEX-examples"></a>

若要將 `'6162'` 的十六進位表示轉換為二進位值，請使用下列範例。結果會自動顯示為二進位值的十六進位表示。

```
SELECT FROM_HEX('6162');
               
+----------+
| from_hex |
+----------+
|     6162 |
+----------+
```

# FROM\$1VARBYTE 函數
<a name="r_FROM_VARBYTE"></a>

FROM\$1VARBYTE 會將二進位值轉換成指定格式的字元字串。

## 語法
<a name="r_FROM_VARBYTE-synopsis"></a>

```
FROM_VARBYTE(binary_value, format)
```

## 引數
<a name="r_FROM_VARBYTE-arguments"></a>

 *binary\$1value*   
`VARBYTE` 資料類型的二進位值。

 *格式*   
傳回字元字串的格式。不區分大小寫的有效值為 `hex`、`binary`、`utf8` (`utf-8` 和 `utf_8`) 和 `base64`。

## 傳回類型
<a name="r_FROM_VARBYTE-return-type"></a>

`VARCHAR`

## 範例
<a name="r_FROM_VARBYTE-examples"></a>

若要將二進位值`'ab'` 轉換為十六進位，請使用下列範例。

```
SELECT FROM_VARBYTE('ab', 'hex');
               
+--------------+
| from_varbyte |
+--------------+
|         6162 |
+--------------+
```

若要傳回 `'4d'` 的二進位表示法，請使用下列範例。`'4d'` 的二進位表示法是字元字串 `01001101`。

```
SELECT FROM_VARBYTE(FROM_HEX('4d'), 'binary');
               
+--------------+
| from_varbyte |
+--------------+
|     01001101 |
+--------------+
```

# GETBIT 函數
<a name="r_GETBIT"></a>

GETBIT 傳回指定索引處的二進位值的位元值。

## 語法
<a name="r_GETBIT-synopsis"></a>

```
GETBIT(binary_value, index)
```

## 引數
<a name="r_GETBIT-arguments"></a>

 *binary\$1value*   
`VARBYTE` 資料類型的二進位值。

 *index*   
傳回之二進位值中位元的索引編號。二進位值是從 0 開始的位元組，從最右邊的位元 (最低有效位元) 到最左邊的位元 (最高有效位元) 進行索引。

## 傳回類型
<a name="r_GETBIT-return-type"></a>

`INTEGER`

## 範例
<a name="r_GETBIT-examples"></a>

若要傳回二進位值 `from_hex('4d')` 索引 `2` 處的位元，請使用以下範例。`'4d'` 的二進位表示法是 `01001101`。

```
SELECT GETBIT(FROM_HEX('4d'), 2);
               
+--------+
| getbit |
+--------+
|      1 |
+--------+
```

若要在 `from_hex('4d')` 傳回的二進位值的八個索引位置傳回位元，請使用下列範例。`'4d'` 的二進位表示法是 `01001101`。

```
SELECT GETBIT(FROM_HEX('4d'), 7), GETBIT(FROM_HEX('4d'), 6),
  GETBIT(FROM_HEX('4d'), 5), GETBIT(FROM_HEX('4d'), 4),
  GETBIT(FROM_HEX('4d'), 3), GETBIT(FROM_HEX('4d'), 2),
  GETBIT(FROM_HEX('4d'), 1), GETBIT(FROM_HEX('4d'), 0);
               
+--------+--------+--------+--------+--------+--------+--------+--------+
| getbit | getbit | getbit | getbit | getbit | getbit | getbit | getbit |
+--------+--------+--------+--------+--------+--------+--------+--------+
|      0 |      1 |      0 |      0 |      1 |      1 |      0 |      1 |
+--------+--------+--------+--------+--------+--------+--------+--------+
```

# TO\$1HEX 函數
<a name="r_TO_HEX"></a>

TO\$1HEX 將數字或二進位值轉換為十六進位表示法。

## 語法
<a name="r_TO_HEX-synopsis"></a>

```
TO_HEX(value)
```

## 引數
<a name="r_TO_HEX-arguments"></a>

 *值*：  
要轉換的數字或二進位值 (`VARBYTE`)。

## 傳回類型
<a name="r_TO_HEX-return-type"></a>

`VARCHAR`

## 範例
<a name="r_TO_HEX-examples"></a>

若要將數字轉換為其十六進位表示法，請使用下列範例。

```
SELECT TO_HEX(2147676847);
               
+----------+
|  to_hex  |
+----------+
| 8002f2af |
+----------+
```

若要將 `'abc'` 的 `VARBYTE` 表示轉換為十六進位數字，請使用下列範例。

```
SELECT TO_HEX('abc'::VARBYTE);
               
+--------+
| to_hex |
+--------+
| 616263 |
+--------+
```

若要建立資料表、將 `'abc'` 的 `VARBYTE` 表示法插入至十六進位數字，然後選取含值的欄，請使用下列範例。

```
CREATE TABLE t (vc VARCHAR);
INSERT INTO t SELECT TO_HEX('abc'::VARBYTE);
SELECT vc FROM t;
 
+--------+
|   vc   |
+--------+
| 616263 |
+--------+
```

若要顯示將 `VARBYTE` 值轉換為 `VARCHAR` 時格式為 UTF-8，請使用下列範例。

```
CREATE TABLE t (vc VARCHAR);
INSERT INTO t SELECT 'abc'::VARBYTE::VARCHAR;

SELECT vc FROM t;

+-----+
| vc  |
+-----+
| abc |
+-----+
```

# TO\$1VARBYTE 函數
<a name="r_TO_VARBYTE"></a>

TO\$1VARBYTE 會將指定格式的字串轉換為二進位值。

## 語法
<a name="r_TO_VARBYTE-synopsis"></a>

```
TO_VARBYTE(string, format)
```

## 引數
<a name="r_TO_VARBYTE-arguments"></a>

 *string*   
`CHAR` 或 `VARCHAR` 字串。

 *格式*   
輸入字串的格式。不區分大小寫的有效值為 `hex`、`binary`、`utf8` (`utf-8` 和 `utf_8`) 和 `base64`。

## 傳回類型
<a name="r_TO_VARBYTE-return-type"></a>

`VARBYTE`

## 範例
<a name="r_TO_VARBYTE-examples"></a>

若要將十六進位 `6162` 轉換為二進位值，請使用下列範例。結果會自動顯示為二進位值的十六進位表示。

```
SELECT TO_VARBYTE('6162', 'hex');
               
+------------+
| to_varbyte |
+------------+
|       6162 |
+------------+
```

若要傳回 `4d` 的二進位表示法，請使用下列範例。'4d' 的二進位表示是 `01001101`。

```
SELECT TO_VARBYTE('01001101', 'binary');
               
+------------+
| to_varbyte |
+------------+
|         4d |
+------------+
```

若要將 UTF-8 的 `'a'` 字串轉換為二進位值，請使用下列範例。結果會自動顯示為二進位值的十六進位表示。

```
SELECT TO_VARBYTE('a', 'utf8');
               
+------------+
| to_varbyte |
+------------+
|         61 |
+------------+
```

若要將十六進位的 `'4'` 字串轉換為二進位值，請使用下列範例。如果十六進位字串長度是奇數，則在前面加上 `0` 以形成有效的十六進位數字。

```
SELECT TO_VARBYTE('4', 'hex');
               
+------------+
| to_varbyte |
+------------+
|         04 |
+------------+
```

# 範圍函數
<a name="c_Window_functions"></a>

使用範圍函數，您可以更有效地建立分析業務查詢。範圍函數對結果集的一個分割區或「視窗」執行運算，然後針對該視窗中的每一列傳回一個值。反之，非視窗函數對結果集的每一列執行計算。不同於彙總結果列的群組函數，範圍函數會保留運算式中的所有列。

 傳回的值是利用該視窗中列集的值來計算。對於資料表的每一列，視窗會定義用於計算其他屬性的列集。視窗是以視窗規格 (OVER 子句) 並根據三個主要概念來定義：
+  *視窗分割*，其會形成列群組 (PARTITION 子句) 
+  *視窗排序*，定義每一個分割區內列的順序或序列 (ORDER BY 子句) 
+  *視窗框*，相對於每一列來定義，以進一步限制列組 (ROWS 規格) 

範圍函數是查詢中最後執行的一組運算 (最後的 ORDER BY 子句除外)。所有聯結和所有 WHERE、GROUP BY 及 HAVING 子句都在範圍函數處理之前完成。因此，範圍函數只能出現在 select 清單或 ORDER BY 子句中。您可以在具有不同窗框子句的單一查詢中使用多個範圍函數。您也可以在其他純量運算式 (例如 CASE) 中使用範圍函數。

視窗函數無法是巢狀。例如，彙總函數 [SUM](r_SUM.md) 可以出現在視窗函數 [SUM](r_WF_SUM.md) 內，但視窗函數 SUM 無法出現在另一個視窗函數 SUM 內。由於視窗函數巢狀嵌套在另一個視窗函數中，因此不支援以下內容。

```
SELECT SUM(SUM(selectcol) OVER (PARTITION BY ordercol)) OVER (Partition by ordercol) FROM t;
```

## 範圍函數語法摘要
<a name="r_Window_function_synopsis"></a>

範圍函數遵循標準語法，如下所示。

```
function (expression) OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list [ frame_clause ] ] )
```

 其中，*function* 是本節所述其中一個函數。

*expr\$1list* 如下。

```
expression | column_name [, expr_list ]
```

 *order\$1list* 如下。

```
expression | column_name [ ASC | DESC ] 
[ NULLS FIRST | NULLS LAST ]
[, order_list ]
```

 *frame\$1clause* 如下。

```
ROWS
{ UNBOUNDED PRECEDING | unsigned_value PRECEDING | CURRENT ROW } |

{ BETWEEN
{ UNBOUNDED PRECEDING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW}
AND
{ UNBOUNDED FOLLOWING | unsigned_value { PRECEDING | FOLLOWING } | CURRENT ROW }}
```

### 引數
<a name="r_Window_function_synopsis-arguments"></a>

 *函數*   
範圍函數。如需詳細資訊，請參閱個別函數描述。

OVER   
此子句定義視窗規格。OVER 是範圍函數的必要子句，用於區分範圍函數和其他 SQL 函數。

PARTITION BY *expr\$1list*   
(選用) PARTITION BY 子句將結果集細分為分割區，很像 GROUP BY 子句。如果有分割區子句，則會對每一個分割區的列來計算函數。如果未指定分割區子句，則單一分割區包含整個資料表，且會針對這整個資料表來計算函數。  
排名函數 DENSE\$1RANK、NTILE、RANK 及 ROW\$1NUMBER 需要整體比較結果集的所有列。使用 PARTITION BY 子句時，查詢最佳化工具可以根據分割區將工作負載分散至多個配量，以平行執行每一個彙總。如果沒有 PARTITION BY 子句，則必須在單一配量上循序執行彙總步驟，這可能對效能造成嚴重的負面影響，尤其對於大型叢集。  
Amazon Redshift 不支援 PARTITION BY 子句中的字串常值。

ORDER BY *order\$1list*   
(選用) 範圍函數會套用至每一個分割區內根據 ORDER BY 中的順序規格所排序的列。此 ORDER BY 子句不同於且完全無關於 *frame\$1clause* 中的 ORDER BY 子句。使用 ORDER BY 子句可以不搭配 PARTITION BY 子句。  
對於排名函數，ORDER BY 子句可辨識排名值的量值。對於彙總函數，在為每一個窗框計算彙總函數之前，分割的列必須排序。如需範圍函數的詳細資訊，請參閱[範圍函數](#c_Window_functions)。  
順序清單中需要欄識別碼或可評估為欄識別碼的欄表達式。常數或常數表達式都不能用來替代欄名。  
NULLS 值自成一組，根據 NULLS FIRST 或 NULLS LAST 選項來排序和排名。根據預設，依 ASC 順序排序時，NULL 值排在最後面，而依 DESC 順序排序時，則排在最前面。  
Amazon Redshift 不支援 ORDER BY 子句中的字串常值。  
 如果省略 ORDER BY 子句，則列的順序不確定。  
在任何平行系統中，例如 Amazon Redshift，當 ORDER BY 子句無法產生唯一且完全的資料排序時，列的順序不確定。也就是說，如果 ORDER BY 運算式產生重複值 (局部排序)，則那些列的傳回順序可能隨著每一次執行 Amazon Redshift 而有所不同。於是，範圍函數可能傳回非預期或不一致的結果。如需詳細資訊，請參閱[範圍函數的資料唯一排序](#r_Examples_order_by_WF)。

 *column\$1name*   
分割或排序所依據的欄名。

ASC \$1 DESC   
此選項會定義表達式的排序順序，如下所示：  
+ ASC：遞增 (例如，數值從低到高，字元字串 'A' 到 'Z')。若未指定選項，資料會預設為遞增排序。
+ DESC：遞減 (數值從高到低，字串 'Z' 到 'A')。

NULLS FIRST \$1 NULLS LAST  
這些選項指定 NULLS 應該排序在最前 (在非 Null 值之前) 或排序在最後 (在非 Null 值之後)。根據預設，NULLS 在 ASC 排序中排序和排名最後，而在 DESC 排序中排序和排名最前。

 *frame\$1clause*   
對於彙總函數，使用 ORDER BY 時，窗框子句會進一步調整函數視窗中的一個列集。它可讓您在排序的結果內包含或排除資料列組。窗框子句包含 ROWS 關鍵字和相關的指定元。  
窗框子句不適用於排名函數。此外，當彙總函數的 OVER 子句中未使用 ORDER BY 子句時，不需要使用窗框子句。如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。  
未指定 ORDER BY 子句時，隱含的窗框無邊界：相當於 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING。

ROWS  
此子句定義視窗框作法是指定相對於目前列的實體位移。  
此子句指定目前視窗或分割區中的列，以便與目前列的值結合。此子句使用引數來指定列位置，可能在目前列之前或之後。所有視窗框都以目前列為參考點。隨著視窗框在分割區中向前滑動，每一列會輪流變成目前列。  
窗框可能是一組簡單的列，最遠到達且包含目前列。  

```
{UNBOUNDED PRECEDING | offset PRECEDING | CURRENT ROW}
```
也可能是兩個邊界之間的一個列集。  

```
BETWEEN
{ UNBOUNDED PRECEDING | offset { PRECEDING | FOLLOWING } | CURRENT ROW }
AND
{ UNBOUNDED FOLLOWING | offset { PRECEDING | FOLLOWING } | CURRENT ROW }
```
UNBOUNDED PRECEDING 表示視窗從分割區的第一列開始；*offset* PRECEDING 表示視窗從目前列之前相當於 offset 值的列數開始。UNBOUNDED PRECEDING 是預設值。  
CURRENT ROW 表示視窗在目前列開始或結束。  
UNBOUNDED FOLLOWING 表示視窗在分割區的最後一列結束；*offset* FOLLOWING 表示視窗在目前列之後相當於 offset 值的列數結束。  
*offset* 表示目前列之前或之後的實體列數。在此案例中，*offset* 必須是評估為正數值的常數。例如，5 FOLLOWING 會在目前列之後的 5 列結束窗框。  
未指定 BETWEEN 時，窗框會隱含地以目前列為邊界。例如，`ROWS 5 PRECEDING` 等於 `ROWS BETWEEN 5 PRECEDING AND CURRENT ROW`。此外，`ROWS UNBOUNDED FOLLOWING` 等於 `ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING`。  
您不能指定開始邊界大於結束邊界的窗框。例如，您不能指定下列任何窗框：  

```
between 5 following and 5 preceding
between current row and 2 preceding
between 3 following and current row
```

## 範圍函數的資料唯一排序
<a name="r_Examples_order_by_WF"></a>

如果範圍函數的 ORDER BY 子句無法產生唯一且完全的資料排序時，列的順序不確定。如果 ORDER BY 運算式產生重複值 (局部排序)，則這些行的傳回順序在多次執行中可能會有所不同。在這種情況下，範圍函數也可能傳回非預期或不一致的結果。

例如，以下查詢會在多次執行中傳回不同的結果。發生這些不同的結果是因為 `order by dateid` 不會為 SUM 範圍函數產生唯一的資料排序。

```
select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid |   sumpaid
--------+-----------+-------------
1827 |   1730.00 |     1730.00
1827 |    708.00 |     2438.00
1827 |    234.00 |     2672.00
...

select dateid, pricepaid,
sum(pricepaid) over(order by dateid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid |   sumpaid
--------+-----------+-------------
1827 |    234.00 |      234.00
1827 |    472.00 |      706.00
1827 |    347.00 |     1053.00
...
```

 在此情況下，將第二個 ORDER BY 欄新增至範圍函數可能會解決問題。

```
select dateid, pricepaid,
sum(pricepaid) over(order by dateid, pricepaid rows unbounded preceding) as sumpaid
from sales
group by dateid, pricepaid;

dateid | pricepaid | sumpaid
--------+-----------+---------
1827 |    234.00 |  234.00
1827 |    337.00 |  571.00
1827 |    347.00 |  918.00
...
```

## 支援的函數
<a name="r_Window_function_supported"></a>

Amazon Redshift 支援兩種範圍函數：彙總和排名。

以下是支援的彙總函數：
+ [AVG 範圍函數](r_WF_AVG.md)
+ [COUNT 範圍函數](r_WF_COUNT.md)
+ [CUME\$1DIST 範圍函數](r_WF_CUME_DIST.md)
+ [DENSE\$1RANK 範圍函數](r_WF_DENSE_RANK.md)
+ [FIRST\$1VALUE 範圍函數](r_WF_first_value.md)
+ [LAG 範圍函數](r_WF_LAG.md) 
+ [LAST\$1VALUE 範圍函數](r_WF_last_value.md)
+ [LEAD 範圍函數](r_WF_LEAD.md) 
+ [LISTAGG 範圍函數](r_WF_LISTAGG.md) 
+ [MAX 範圍函數](r_WF_MAX.md) 
+ [MEDIAN 範圍函數](r_WF_MEDIAN.md) 
+ [MIN 範圍函數](r_WF_MIN.md) 
+ [NTH\$1VALUE 範圍函數](r_WF_NTH.md) 
+ [PERCENTILE\$1CONT 範圍函數](r_WF_PERCENTILE_CONT.md)
+ [PERCENTILE\$1DISC 範圍函數](r_WF_PERCENTILE_DISC.md)
+ [RATIO\$1TO\$1REPORT 範圍函數](r_WF_RATIO_TO_REPORT.md)
+ [STDDEV\$1SAMP 和 STDDEV\$1POP 範圍函數](r_WF_STDDEV.md) (STDDEV\$1SAMP 和 STDDEV 是同義詞) 
+ [SUM 範圍函數](r_WF_SUM.md) 
+ [VAR\$1SAMP 和 VAR\$1POP 範圍函數](r_WF_VARIANCE.md) (VAR\$1SAMP 和 VARIANCE 是同義詞)

以下是支援的排名函數：
+ [DENSE\$1RANK 範圍函數](r_WF_DENSE_RANK.md) 
+ [NTILE 範圍函數](r_WF_NTILE.md) 
+ [PERCENT\$1RANK 範圍函數](r_WF_PERCENT_RANK.md)
+ [RANK 範圍函數](r_WF_RANK.md) 
+ [ROW\$1NUMBER 範圍函數](r_WF_ROW_NUMBER.md)

## 範圍函數範例的範例資料表
<a name="r_Window_function_example"></a>

您可以在每個函數說明中找到特定的範圍函數範例。部分範例會使用名為 WINSALES 的資料表，其中包含 11 個資料列，如下所示。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/c_Window_functions.html)

下列指令碼建立並填入範例 WINSALES 資料表。

```
CREATE TABLE winsales(
  salesid int,
  dateid date,
  sellerid int,
  buyerid char(10),
  qty int,
  qty_shipped int);

INSERT INTO winsales VALUES
  (30001, '8/2/2003', 3, 'b', 10, 10),
  (10001, '12/24/2003', 1, 'c', 10, 10),
  (10005, '12/24/2003', 1, 'a', 30, null),	
  (40001, '1/9/2004', 4, 'a', 40, null),	
  (10006, '1/18/2004', 1, 'c', 10, null),	
  (20001, '2/12/2004', 2, 'b', 20, 20),
  (40005, '2/12/2004', 4, 'a', 10, 10),
  (20002, '2/16/2004', 2, 'c', 20, 20),
  (30003, '4/18/2004', 3, 'b', 15, null),
  (30004, '4/18/2004', 3, 'b', 20, null),	
  (30007, '9/7/2004', 3, 'c', 30, null);
```

# AVG 範圍函數
<a name="r_WF_AVG"></a>

 AVG 範圍函數傳回輸入表達式值的平均值 (算術平均數)。AVG 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_WF_AVG-synopsis"></a>

```
AVG ( [ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 引數
<a name="r_WF_AVG-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，則函數在計數時會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義 AVG 函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="c_Supported_data_types_wf_avg"></a>

AVG 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL 及 DOUBLE PRECISION。

AVG 函數支援的傳回類型如下：
+ BIGINT 代表 SMALLINT 或 INTEGER 引數
+ NUMERIC 代表 BIGINT 引數
+ DOUBLE PRECISION 代表浮點數引數

## 範例
<a name="r_WF_AVG-examples"></a>

下列範例會依日期計算銷售數量的移動平均數；依日期 ID 和銷售 ID 排序結果：

```
select salesid, dateid, sellerid, qty,
avg(qty) over
(order by dateid, salesid rows unbounded preceding) as avg
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | avg
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  10
10005 | 2003-12-24 |        1 |  30 |  16
40001 | 2004-01-09 |        4 |  40 |  22
10006 | 2004-01-18 |        1 |  10 |  20
20001 | 2004-02-12 |        2 |  20 |  20
40005 | 2004-02-12 |        4 |  10 |  18
20002 | 2004-02-16 |        2 |  20 |  18
30003 | 2004-04-18 |        3 |  15 |  18
30004 | 2004-04-18 |        3 |  20 |  18
30007 | 2004-09-07 |        3 |  30 |  19
(11 rows)
```

 如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

# COUNT 範圍函數
<a name="r_WF_COUNT"></a>

 COUNT 範圍函數會計算表達式所定義的列數。

COUNT 函數有兩種版本。COUNT(\$1) 計算目標資料表中的所有列數，而不論是否包含 Null。COUNT (表達式) 計算特定欄或表達式中不含 NULL 值的列數。

## 語法
<a name="r_WF_COUNT-synopsis"></a>

```
COUNT ( * | [ ALL ] expression) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 引數
<a name="r_WF_COUNT-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，則函數在計數時會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義 COUNT 函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="c_Supported_data_types_wf_count"></a>

COUNT 函數支援所有引數資料類型。

COUNT 函數支援的傳回類型為 BIGINT。

## 範例
<a name="r_WF_COUNT-examples"></a>

 下列範例顯示從資料視窗開頭的所有列的銷售 ID、數量和計數：

```
select salesid, qty,
count(*) over (order by salesid rows unbounded preceding) as count
from winsales
order by salesid;

salesid | qty | count
---------+-----+-----
10001 |  10 |   1
10005 |  30 |   2
10006 |  10 |   3
20001 |  20 |   4
20002 |  20 |   5
30001 |  10 |   6
30003 |  15 |   7
30004 |  20 |   8
30007 |  30 |   9
40001 |  40 |   10
40005 |  10 |   11
(11 rows)
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例顯示如何從資料視窗開頭計算非 null 列的銷售 ID、數量和計數。(在 WINSALES 資料表中，QTY\$1SHIPPED 欄包含一些 NULL。) 

```
select salesid, qty, qty_shipped,
count(qty_shipped)
over (order by salesid rows unbounded preceding) as count
from winsales
order by salesid;

salesid | qty | qty_shipped | count
---------+-----+-------------+-------
10001 |  10 |          10 |   1
10005 |  30 |             |   1
10006 |  10 |             |   1
20001 |  20 |          20 |   2
20002 |  20 |          20 |   3
30001 |  10 |          10 |   4
30003 |  15 |             |   4
30004 |  20 |             |   4
30007 |  30 |             |   4
40001 |  40 |             |   4
40005 |  10 |          10 |   5
(11 rows)
```

# CUME\$1DIST 範圍函數
<a name="r_WF_CUME_DIST"></a>

計算視窗或分割區內值的累積分佈。假定為遞增排序，使用此公式來決定累積分佈：

`count of rows with values <= x / count of rows in the window or partition`

其中，*x* 等於 ORDER BY 子句所指定欄之目前列中的值。以下資料集示範此公式的使用：

```
Row#	Value	  Calculation    CUME_DIST
1        2500	   (1)/(5)	   0.2
2        2600	   (2)/(5)	   0.4
3        2800	   (3)/(5)	   0.6
4        2900	   (4)/(5)	   0.8
5        3100	   (5)/(5)	   1.0
```

傳回值範圍是 >0 至 1 (含)。

## 語法
<a name="r_WF_CUME_DIST-synopsis"></a>

```
CUME_DIST ()
OVER ( 
[ PARTITION BY partition_expression ] 
[ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_CUME_DIST-arguments"></a>

OVER  
用於指定視窗分割的子句。OVER 子句不能包含視窗框規格。

PARTITION BY *partition\$1expression*   
選用。此表達式針對 OVER 子句中的每一個群組，設定記錄範圍。

ORDER BY *order\$1list*   
要計算累積分佈的表達式。表達式必須為數值資料類型，或可隱含地轉換為數值資料類型。如果省略 ORDER BY，所有列的傳回值為 1。  
如果 ORDER BY 未產生唯一排序，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="r_WF_CUME_DIST-returns"></a>

FLOAT8

## 範例
<a name="r_WF_CUME_DIST-examples"></a>

以下範例計算每一個賣方的數量累積分佈：

```
select sellerid, qty, cume_dist() 
over (partition by sellerid order by qty) 
from winsales;

sellerid   qty	   cume_dist
--------------------------------------------------
1         10.00	   0.33
1         10.64	   0.67
1         30.37	   1
3         10.04	   0.25
3         15.15	   0.5
3         20.75	   0.75
3         30.55	   1
2         20.09	   0.5
2         20.12	   1
4         10.12	   0.5
4         40.23	   1
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

# DENSE\$1RANK 範圍函數
<a name="r_WF_DENSE_RANK"></a>

DENSE\$1RANK 範圍函數根據 OVER 子句中的 ORDER BY 表達式，決定一組值之中某個值的排名。如果有選用的 PARTITION BY 子句，則會重設每一組列的排名。在排名準則中有相等值的列獲得相同排名。DENSE\$1RANK 函數有一方面不同於 RANK：如果兩列以上繫結在一起，則排名值的序列中沒有間隙。例如，假設兩列都排名 `1`，則下一個排名為 `2`。

在相同查詢中，排名函數可以搭配不同的 PARTITION BY 和 ORDER BY 子句。

## 語法
<a name="r_WF_DENSE_RANK-synopsis"></a>

```
DENSE_RANK() OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_DENSE_RANK-arguments"></a>

( )   
此函數不接受引數，但需要空括號。

OVER   
DENSE\$1RANK 函數的視窗子句。

PARTITION BY *expr\$1list*   
(選用) 一或多個用於定義視窗的運算式。

ORDER BY *order\$1list*   
(選用) 排名值所根據的運算式。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。如果省略 ORDER BY，所有列的傳回值為 `1`。  
如果 ORDER BY 未產生唯一排序，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="c_Supported_data_types_wf_dense_rank"></a>

`BIGINT`

## 範例
<a name="r_WF_DENSE_RANK-examples"></a>

下列範例使用範圍函數的範例資料表。如需詳細資訊，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

以下範例依銷售數量排序資料表，並將密集排名和一般排名指派給每一列。套用範圍函數結果之後排序結果。

```
SELECT salesid, qty,
DENSE_RANK() OVER(ORDER BY qty DESC) AS d_rnk,
RANK() OVER(ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY 2,1;

+---------+-----+-------+-----+
| salesid | qty | d_rnk | rnk |
+---------+-----+-------+-----+
|   10001 |  10 |     5 |   8 |
|   10006 |  10 |     5 |   8 |
|   30001 |  10 |     5 |   8 |
|   40005 |  10 |     5 |   8 |
|   30003 |  15 |     4 |   7 |
|   20001 |  20 |     3 |   4 |
|   20002 |  20 |     3 |   4 |
|   30004 |  20 |     3 |   4 |
|   10005 |  30 |     2 |   2 |
|   30007 |  30 |     2 |   2 |
|   40001 |  40 |     1 |   1 |
+---------+-----+-------+-----+
```

在相同查詢中同時使用 DENSE\$1RANK 和 RANK 函數時，請注意指派給相同列集的排名差異。

下列範例會依 sellerid 分割資料表，並依數量排序每一個分割區，然後指派密集排名給每一列。套用範圍函數結果之後排序結果。

```
SELECT salesid, sellerid, qty,
DENSE_RANK() OVER(PARTITION BY sellerid ORDER BY qty DESC) AS d_rnk
FROM winsales
ORDER BY 2,3,1;

+---------+----------+-----+-------+
| salesid | sellerid | qty | d_rnk |
+---------+----------+-----+-------+
|   10001 |        1 |  10 |     2 |
|   10006 |        1 |  10 |     2 |
|   10005 |        1 |  30 |     1 |
|   20001 |        2 |  20 |     1 |
|   20002 |        2 |  20 |     1 |
|   30001 |        3 |  10 |     4 |
|   30003 |        3 |  15 |     3 |
|   30004 |        3 |  20 |     2 |
|   30007 |        3 |  30 |     1 |
|   40005 |        4 |  10 |     2 |
|   40001 |        4 |  40 |     1 |
+---------+----------+-----+-------+
```

若要成功使用最後範例，請使用下列命令將資料列插入 WINSALES 資料表。此列與另一列具有相同的 buyid、sellerid 和 qtysold。這將導致上一個範例中的兩列並列，因此將顯示 DENSE\$1RANK 和 RANK 函數之間的差異。

```
INSERT INTO winsales VALUES(30009, '2/2/2003', 3, 'b', 20, NULL);
```

下列範例會依 buyerid 和 sellerid 分割資料表，並依數量排序每一個分割區，然後同時指派密集排名和一般排名給每一列。(選用) 套用範圍函數之後對結果進行排序。

```
SELECT salesid, sellerid, qty, buyerid,
DENSE_RANK() OVER(PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS d_rnk,
RANK() OVER (PARTITION BY buyerid, sellerid ORDER BY qty DESC) AS rnk
FROM winsales
ORDER BY rnk;

+---------+----------+-----+---------+-------+-----+
| salesid | sellerid | qty | buyerid | d_rnk | rnk |
+---------+----------+-----+---------+-------+-----+
|   20001 |        2 |  20 | b       |     1 |   1 |
|   30007 |        3 |  30 | c       |     1 |   1 |
|   10006 |        1 |  10 | c       |     1 |   1 |
|   10005 |        1 |  30 | a       |     1 |   1 |
|   20002 |        2 |  20 | c       |     1 |   1 |
|   30009 |        3 |  20 | b       |     1 |   1 |
|   40001 |        4 |  40 | a       |     1 |   1 |
|   30004 |        3 |  20 | b       |     1 |   1 |
|   10001 |        1 |  10 | c       |     1 |   1 |
|   40005 |        4 |  10 | a       |     2 |   2 |
|   30003 |        3 |  15 | b       |     2 |   3 |
|   30001 |        3 |  10 | b       |     3 |   4 |
+---------+----------+-----+---------+-------+-----+
```

# FIRST\$1VALUE 範圍函數
<a name="r_WF_first_value"></a>

 在一組已排序的列中，FIRST\$1VALUE 會針對視窗框中的第一列，傳回指定之表達式的值。

如需有關選取視窗框中最後一列的資訊，請參閱[LAST\$1VALUE 範圍函數](r_WF_last_value.md)。

## 語法
<a name="r_WF_first_value-synopsis"></a>

```
FIRST_VALUE( expression )[ IGNORE NULLS | RESPECT NULLS ]
OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 引數
<a name="r_WF_first_value-arguments"></a>

 *表達式*   
 函數運算的目標欄或表達式。

IGNORE NULLS   
此選項與 FIRST\$1VALUE 一起使用時，函數會傳回窗框中第一個非 NULL (或如果所有值都是 NULL，則為 NULL) 的值。

RESPECT NULLS   
 指出 Amazon Redshift 應該包含 null 值來決定要使用的列。如果您不指定 IGNORE NULLS，則預設支援 RESPECT NULLS。

OVER   
引進函數的視窗子句。

PARTITION BY *expr\$1list*   
以一或多個表達式定義函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY 子句，ORDER BY 會排序整個資料表。如果您指定 ORDER BY 子句，則還必須指定 *frame\$1clause*。  
FIRST\$1VALUE 函數的結果取決於資料的排序。在下列情況中，結果不確定：  
+ 未指定 ORDER BY 子句，且分割區包含一個表達式的兩個不同值 
+ 表達式評估為不同值，而這些值對應於 ORDER BY 清單中的相同值。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果中包含或排除資料列組，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 傳回類型
<a name="c_Supported_data_types_wf_first_value"></a>

這些函數支援使用基本 Amazon Redshift 資料類型的運算式。傳回類型與*運算式*的資料類型相同。

## 範例
<a name="r_WF_first_value-examples"></a>

下列範例會使用範例 TICKIT 資料中的 VENUE 表格。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例傳回 VENUE 資料表中每個會場的座位容量，且結果依容量排序 (高到低)。會使用 FIRST\$1VALUE 函數來選取與窗框之第一列對應的會場名稱：在此案例中，即座位數最多的那一列。結果依州分割，所以當 VENUESTATE 值變更時，就會選取新的第一個值。視窗框無界限，對於每一個分割區的第一列，選取的第一個值都相同。

以加利佛尼亞來說，`Qualcomm Stadium` 的座位數最多 (`70561`)，因此，對於 `CA` 分割區中的所有列，此名稱是第一個值。

```
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |           venuename            |         first_value
-----------+------------+--------------------------------+------------------------------
CA         |      70561 | Qualcomm Stadium               | Qualcomm Stadium
CA         |      69843 | Monster Park                   | Qualcomm Stadium
CA         |      63026 | McAfee Coliseum                | Qualcomm Stadium
CA         |      56000 | Dodger Stadium                 | Qualcomm Stadium
CA         |      45050 | Angel Stadium of Anaheim       | Qualcomm Stadium
CA         |      42445 | PETCO Park                     | Qualcomm Stadium
CA         |      41503 | AT&T Park                      | Qualcomm Stadium
CA         |      22000 | Shoreline Amphitheatre         | Qualcomm Stadium
CO         |      76125 | INVESCO Field                  | INVESCO Field
CO         |      50445 | Coors Field                    | INVESCO Field
DC         |      41888 | Nationals Park                 | Nationals Park
FL         |      74916 | Dolphin Stadium                | Dolphin Stadium
FL         |      73800 | Jacksonville Municipal Stadium | Dolphin Stadium
FL         |      65647 | Raymond James Stadium          | Dolphin Stadium
FL         |      36048 | Tropicana Field                | Dolphin Stadium
...
```

下列範例顯示使用 IGNORE NULLS 選項，並依賴將新的一列新增至 VENUE 資料表：

```
insert into venue values(2000,null,'Stanford','CA',90000);
```

這個新列的 VENUENAME 欄包含 NULL 值。現在，重複本節稍早所示的 FIRST\$1VALUE 查詢：

```
select venuestate, venueseats, venuename,
first_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |         venuename          | first_value
-----------+------------+----------------------------+-------------
CA         |      90000 | NULL                       | NULL
CA         |      70561 | Qualcomm Stadium           | NULL
CA         |      69843 | Monster Park               | NULL
...
```

因為新列包含最高 VENUESEATS 值 (`90000`)，且其 VENUENAME 為 NULL，所以 FIRST\$1VALUE 函數對 `CA` 分割區傳回 Null。若要在函數評估中忽略像這樣的列，請將 IGNORE NULLS 選項新增至函數引數：

```
select venuestate, venueseats, venuename,
first_value(venuename) ignore nulls
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venuestate='CA')
order by venuestate;

venuestate | venueseats |         venuename          |   first_value
------------+------------+----------------------------+------------------
CA         |      90000 | NULL                       | Qualcomm Stadium
CA         |      70561 | Qualcomm Stadium           | Qualcomm Stadium
CA         |      69843 | Monster Park               | Qualcomm Stadium
...
```

# LAG 範圍函數
<a name="r_WF_LAG"></a>

 LAG 範圍函數傳回分割區中目前列上方 (之前) 給定位移那一列的值。

## 語法
<a name="r_WF_LAG-synopsis"></a>

```
LAG (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
```

## 引數
<a name="r_WF_LAG-arguments"></a>

 *value\$1expr*   
 函數運算的目標欄或表達式。

 *offset*   
 選擇性參數，指定在目前列之前要傳回值的列數。位移可以是常數整數，或評估為整數的表達式。如果您不指定位移，Amazon Redshift 會使用 `1` 做為預設值。位移 `0` 表示目前列。

IGNORE NULLS   
選擇性規格，指出 Amazon Redshift 在決定要使用的列時應該略過 Null 值。如果未列出 IGNORE NULLS，則會包含 Null 值。  
您可以使用 NVL 或 COALESCE 表達式，將 Null 值換成另一個值。如需詳細資訊，請參閱[NVL 和 COALESCE 函數](r_NVL_function.md)。

RESPECT NULLS   
 指出 Amazon Redshift 應該包含 null 值來決定要使用的列。如果您不指定 IGNORE NULLS，則預設支援 RESPECT NULLS。

OVER   
指定視窗分割和排序。OVER 子句不能包含視窗框規格。

PARTITION BY *window\$1partition*   
選擇性引數，針對 OVER 子句中的每一個群組，設定記錄範圍。

ORDER BY *window\$1ordering*   
排序每一個分割區內的列。

LAG 範圍函數支援有使用任何 Amazon Redshift 資料類型的運算式。傳回類型與 *value\$1expr* 的類型相同。

## 範例
<a name="r_WF_LAG-examples"></a>

 下列範例顯示銷售給買方 ID 為 3 之買方的門票數量，以及買方 3 購買門票的時間。為了比較買方 3 的每次銷售與前次銷售，查詢會傳回每次銷售的前次銷售數量。因為 2008/1/16 之前沒有購買，所以第一個先前銷售數量值為 Null：

```
select buyerid, saletime, qtysold,
lag(qtysold,1) over (order by buyerid, saletime) as prev_qtysold
from sales where buyerid = 3 order by buyerid, saletime;

buyerid |      saletime       | qtysold | prev_qtysold
---------+---------------------+---------+--------------
3 | 2008-01-16 01:06:09 |       1 |
3 | 2008-01-28 02:10:01 |       1 |            1
3 | 2008-03-12 10:39:53 |       1 |            1
3 | 2008-03-13 02:56:07 |       1 |            1
3 | 2008-03-29 08:21:39 |       2 |            1
3 | 2008-04-27 02:39:01 |       1 |            2
3 | 2008-08-16 07:04:37 |       2 |            1
3 | 2008-08-22 11:45:26 |       2 |            2
3 | 2008-09-12 09:11:25 |       1 |            2
3 | 2008-10-01 06:22:37 |       1 |            1
3 | 2008-10-20 01:55:51 |       2 |            1
3 | 2008-10-28 01:30:40 |       1 |            2
(12 rows)
```

# LAST\$1VALUE 範圍函數
<a name="r_WF_last_value"></a>

 在一組已排序的列中，LAST\$1VALUE 函數針對窗框中的最後一列，傳回運算式的值。

如需有關選取框架中第一列的資訊，請參閱[FIRST\$1VALUE 範圍函數](r_WF_first_value.md)。

## 語法
<a name="r_WF_last_value-synopsis"></a>

```
LAST_VALUE( expression )[ IGNORE NULLS | RESPECT NULLS ]
OVER (
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 引數
<a name="r_WF_last_value-arguments"></a>

 *表達式*   
 函數運算的目標欄或表達式。

IGNORE NULLS   
函數會傳回窗框中非 NULL (或如果所有值都是 NULL，則為 NULL) 的最後一個值。

RESPECT NULLS   
指出 Amazon Redshift 應該包含 null 值來決定要使用的列。如果您不指定 IGNORE NULLS，則預設支援 RESPECT NULLS。

OVER   
引進函數的視窗子句。

PARTITION BY *expr\$1list*   
以一或多個表達式定義函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY 子句，ORDER BY 會排序整個資料表。如果您指定 ORDER BY 子句，則還必須指定 *frame\$1clause*。  
結果取決於資料的順序。在下列情況中，結果不確定：  
+ 未指定 ORDER BY 子句，且分割區包含一個表達式的兩個不同值 
+ 表達式評估為不同值，而這些值對應於 ORDER BY 清單中的相同值。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果中包含或排除資料列組，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 傳回類型
<a name="c_Supported_data_types_wf_last_value"></a>

這些函數支援使用基本 Amazon Redshift 資料類型的運算式。傳回類型與*運算式*的資料類型相同。

## 範例
<a name="r_WF_last_value-examples"></a>

下列範例會使用範例 TICKIT 資料中的 VENUE 表格。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

下列範例傳回 VENUE 資料表中每個會場的座位容量，且結果依容量排序 (高到低)。LAST\$1VALUE 函數用於選取與窗框之最後一列對應的會場名稱：在此案例中，即座位數最少的那一列。結果依州分割，所以當 VENUESTATE 值變更時，就會選取新的最後一個值。視窗框無界限，對於每一個分割區的第一列，選取的最後一個值都相同。

以加利佛尼亞來說，分割區中的每一列列都傳回 `Shoreline Amphitheatre`，因為其座位數最少 (`22000`)。

```
select venuestate, venueseats, venuename,
last_value(venuename)
over(partition by venuestate
order by venueseats desc
rows between unbounded preceding and unbounded following)
from (select * from venue where venueseats >0)
order by venuestate;

venuestate | venueseats |           venuename            |          last_value
-----------+------------+--------------------------------+------------------------------
CA         |      70561 | Qualcomm Stadium               | Shoreline Amphitheatre
CA         |      69843 | Monster Park                   | Shoreline Amphitheatre
CA         |      63026 | McAfee Coliseum                | Shoreline Amphitheatre
CA         |      56000 | Dodger Stadium                 | Shoreline Amphitheatre
CA         |      45050 | Angel Stadium of Anaheim       | Shoreline Amphitheatre
CA         |      42445 | PETCO Park                     | Shoreline Amphitheatre
CA         |      41503 | AT&T Park                      | Shoreline Amphitheatre
CA         |      22000 | Shoreline Amphitheatre         | Shoreline Amphitheatre
CO         |      76125 | INVESCO Field                  | Coors Field
CO         |      50445 | Coors Field                    | Coors Field
DC         |      41888 | Nationals Park                 | Nationals Park
FL         |      74916 | Dolphin Stadium                | Tropicana Field
FL         |      73800 | Jacksonville Municipal Stadium | Tropicana Field
FL         |      65647 | Raymond James Stadium          | Tropicana Field
FL         |      36048 | Tropicana Field                | Tropicana Field
...
```

# LEAD 範圍函數
<a name="r_WF_LEAD"></a>

 LEAD 範圍函數傳回分割區中目前列下方 (之後) 給定位移那一列的值。

## 語法
<a name="r_WF_LEAD-synopsis"></a>

```
LEAD (value_expr [, offset ])
[ IGNORE NULLS | RESPECT NULLS ]
OVER ( [ PARTITION BY window_partition ] ORDER BY window_ordering )
```

## 引數
<a name="r_WF_LEAD-arguments"></a>

 *value\$1expr*   
函數運算的目標欄或表達式。

 *offset*   
 選擇性參數，指定在目前列下方要傳回值的列數。位移可以是常數整數，或評估為整數的表達式。如果您不指定位移，Amazon Redshift 會使用 `1` 做為預設值。位移 `0` 表示目前列。

IGNORE NULLS   
選擇性規格，指出 Amazon Redshift 在決定要使用的列時應該略過 Null 值。如果未列出 IGNORE NULLS，則會包含 Null 值。  
您可以使用 NVL 或 COALESCE 表達式，將 Null 值換成另一個值。如需詳細資訊，請參閱[NVL 和 COALESCE 函數](r_NVL_function.md)。

RESPECT NULLS   
 指出 Amazon Redshift 應該包含 null 值來決定要使用的列。如果您不指定 IGNORE NULLS，則預設支援 RESPECT NULLS。

OVER   
指定視窗分割和排序。OVER 子句不能包含視窗框規格。

PARTITION BY *window\$1partition*   
選擇性引數，針對 OVER 子句中的每一個群組，設定記錄範圍。

ORDER BY *window\$1ordering*   
排序每一個分割區內的列。

LEAD 範圍函數支援有使用任何 Amazon Redshift 資料類型的運算式。傳回類型與 *value\$1expr* 的類型相同。

## 範例
<a name="r_WF_LEAD-examples"></a>

 下列範例提供 SALES 資料表中於 2008 年 1 月 1 日和 2008 年 1 月 2 日售出門票之活動的佣金，以及對隨後銷售之門票銷售支付的佣金。下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
SELECT eventid, commission, saletime, LEAD(commission, 1) over ( ORDER BY saletime ) AS next_comm
FROM sales
WHERE saletime BETWEEN '2008-01-09 00:00:00' AND '2008-01-10 12:59:59'
LIMIT 10;

+---------+------------+---------------------+-----------+
| eventid | commission |      saletime       | next_comm |
+---------+------------+---------------------+-----------+
|    1664 |       13.2 | 2008-01-09 01:00:21 |      69.6 |
|     184 |       69.6 | 2008-01-09 01:00:36 |     116.1 |
|    6870 |      116.1 | 2008-01-09 01:02:37 |      11.1 |
|    3718 |       11.1 | 2008-01-09 01:05:19 |     205.5 |
|    6772 |      205.5 | 2008-01-09 01:14:04 |      38.4 |
|    3074 |       38.4 | 2008-01-09 01:26:50 |     209.4 |
|    5254 |      209.4 | 2008-01-09 01:29:16 |      26.4 |
|    3724 |       26.4 | 2008-01-09 01:40:09 |      57.6 |
|    5303 |       57.6 | 2008-01-09 01:40:21 |      51.6 |
|    3678 |       51.6 | 2008-01-09 01:42:54 |      43.8 |
+---------+------------+---------------------+-----------+
```

 下列範例提供 SALES 資料表中事件的佣金上限，以及針對相同事件的後續銷售所支付之門票銷售的佣金。此範例示範如何使用 LEAD 搭配 GROUP BY 子句。由於彙總子句中不允許視窗函數，因此此範例會使用子查詢。下列範例使用 TICKIT 範例資料庫。如需詳細資訊，請參閱[範本資料庫](c_sampledb.md)。

```
SELECT eventid, eventname, max(next_comm_diff) as max_commission_difference
FROM
(
    SELECT sales.eventid, eventname, commission - LEAD(commission, 1) over (ORDER BY sales.eventid, saletime) AS next_comm_diff
    FROM sales JOIN event ON sales.eventid = event.eventid
)
GROUP BY eventid, eventname
ORDER BY eventid

LIMIT 10

| eventid | eventname                   | max_commission_difference |
+---------+-----------------------------+---------------------------+
| 1       | Gotterdammerung             | 7.95                      |
| 2       | Boris Godunov               | 227.85                    |
| 3       | Salome                      | 1350.9                    |
| 4       | La Cenerentola (Cinderella) | 790.05                    |
| 5       | Il Trovatore                | 214.05                    |
| 6       | L Elisir d Amore            | 510.9                     |
| 7       | Doctor Atomic               | 180.6                     |
| 9       | The Fly                     | 147                       |
| 10      | Rigoletto                   | 186.6                     |
+---------+-----------------------------+---------------------------+
```

# LISTAGG 範圍函數
<a name="r_WF_LISTAGG"></a>

對於查詢中的每一組，LISTAGG 範圍函數依據 ORDER BY 表達式來排序該組的列，然後將這些值串連成單一字串。

## 語法
<a name="r_WF_LISTAGG-synopsis"></a>

```
LISTAGG( [DISTINCT] expression [, 'delimiter' ] ) 
[ WITHIN GROUP (ORDER BY order_list) ] 
OVER ( [PARTITION BY partition_expression] )
```

## 引數
<a name="r_WF_LISTAGG-arguments"></a>

DISTINCT  
(選用) 此子句在串連值之前會從指定的表達式中消除重複值。結尾空格會忽略，所以字串 `'a'` 和 `'a '` 視為重複值。LISTAGG 會使用第一個遇到的值。如需詳細資訊，請參閱[多餘空格的意義](r_Character_types.md#r_Character_types-significance-of-trailing-blanks)。

  


*aggregate\$1expression*   
 任何有效表達式 (例如欄名)，用於提供要彙總的值。忽略 NULL 值和空字串。

 *delimiter*   
(選用) 用來區隔串連值的字串常數。預設值為 NULL。

 WITHIN GROUP (ORDER BY *order\$1list*)   
(選用) 此子句指定彙總值的排序順序。只有在 ORDER BY 提供唯一排序時才可確定。預設是彙總所有列並傳回單一值。

 OVER   
 用於指定視窗分割的子句。OVER 子句不能包含視窗排序或視窗框規格。

 PARTITION BY *partition\$1expression*   
(選用) 針對 OVER 子句中的每一個群組，設定記錄範圍。

## 傳回值
<a name="r_WF_LISTAGG-data-types"></a>

如果結果集大於 16，000，000 個位元組，則 LISTAGG 會傳回下列錯誤：

```
Invalid operation: Result size exceeds LISTAGG limit
```

## 範例
<a name="r_WF_LISTAGG-examples"></a>

下列範例使用 WINSALES 資料表。如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例傳回賣方 ID 清單，依賣方 ID 排序。

```
select listagg(sellerid) 
within group (order by sellerid)
over() from winsales;

  listagg
------------
 11122333344
...
...
 11122333344
 11122333344
   (11 rows)
```

下列範例傳回買方 B 的賣方 ID 清單，依日期排序。

```
select listagg(sellerid) 
within group (order by dateid)
over () as seller
from winsales
where buyerid = 'b' ;

  seller
---------
    3233
    3233
    3233
    3233
```

下列範例以逗號分隔清單傳回買方 B 的銷售日期。

```
select listagg(dateid,',') 
within group (order by sellerid desc,salesid asc)
over () as dates
from winsales
where buyerid  = 'b';

             dates                                      
-------------------------------------------
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-04-18,2004-02-12
```

下列範例使用 DISTINCT 傳回買方 B 的唯一銷售日期清單。

```
select listagg(distinct dateid,',') 
within group (order by sellerid desc,salesid asc)
over () as dates
from winsales
where buyerid  = 'b';

           dates
--------------------------------
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
2003-08-02,2004-04-18,2004-02-12
```

下列範例以逗號分隔清單傳回每個買方 ID 的銷售 ID。

```
select buyerid, 
listagg(salesid,',')
within group (order by salesid)
over (partition by buyerid) as sales_id
from winsales
order by buyerid;

+---------+-------------------------+
| buyerid |        sales_id         |
+---------+-------------------------+
| a       | 10005,40001,40005       |
| a       | 10005,40001,40005       |
| a       | 10005,40001,40005       |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| b       | 20001,30001,30003,30004 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
| c       | 10001,10006,20002,30007 |
+---------+-------------------------+
```

下列範例示範 LISTAGG 支援高達 16，000，000 位元組的串連結果：

```
CREATE TABLE large_data (
    id INT,
    content VARCHAR(65535)
);

INSERT INTO large_data VALUES 
    (1, REPEAT('A', 65535)),
    (2, REPEAT('B', 65535)),
    (3, REPEAT('C', 65535));

SELECT LEN(LISTAGG(content, ',') WITHIN GROUP (ORDER BY id)) AS total_length
FROM large_data;

 total_length
--------------
       196607
```

# MAX 範圍函數
<a name="r_WF_MAX"></a>

 MAX 範圍函數傳回輸入表達式值的最大值。MAX 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_WF_MAX-synopsis"></a>

```
MAX ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 引數
<a name="r_WF_MAX-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
 此子句指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義 MAX 函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="r_WF_MAX-data-types"></a>

接受任何資料類型做為輸入。傳回與 *expression* 相同的資料類型。

## 範例
<a name="r_WF_MAX-examples"></a>

下列範例顯示資料視窗開頭的銷售 ID、數量和最大數量：

```
select salesid, qty,
max(qty) over (order by salesid rows unbounded preceding) as max
from winsales
order by salesid;

salesid | qty | max
---------+-----+-----
10001 |  10 |  10
10005 |  30 |  30
10006 |  10 |  30
20001 |  20 |  30
20002 |  20 |  30
30001 |  10 |  30
30003 |  15 |  30
30004 |  20 |  30
30007 |  30 |  30
40001 |  40 |  40
40005 |  10 |  40
(11 rows)
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例顯示受限窗框中的 salesid、數量和最大數量：

```
select salesid, qty,
max(qty) over (order by salesid rows between 2 preceding and 1 preceding) as max
from winsales
order by salesid;

salesid | qty | max
---------+-----+-----
10001 |  10 |
10005 |  30 |  10
10006 |  10 |  30
20001 |  20 |  30
20002 |  20 |  20
30001 |  10 |  20
30003 |  15 |  20
30004 |  20 |  15
30007 |  30 |  20
40001 |  40 |  30
40005 |  10 |  40
(11 rows)
```

# MEDIAN 範圍函數
<a name="r_WF_MEDIAN"></a>

計算視窗或分割區內值範圍的中位數。忽略範圍中的 NULL 值。

MEDIAN 是採用連續分佈模型的反向分佈函數。

## 語法
<a name="r_WF_MEDIAN-synopsis"></a>

```
MEDIAN ( median_expression )
OVER ( [ PARTITION BY partition_expression ] )
```

## 引數
<a name="r_WF_MEDIAN-arguments"></a>

 *median\$1expression*   
此表達式 (例如欄名) 提供要決定中位數的值。表達式必須為數值或日期時間資料類型，或可隱含地轉換為這種資料類型。

OVER   
用於指定視窗分割的子句。OVER 子句不能包含視窗排序或視窗框規格。

PARTITION BY *partition\$1expression*   
選用。此表達式針對 OVER 子句中的每一個群組，設定記錄範圍。

## 資料類型
<a name="r_WF_MEDIAN-data-types"></a>

傳回類型取決於 *median\$1expression* 的資料類型。下表顯示每一個 *median\$1expression* 資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_WF_MEDIAN.html)

## 使用須知
<a name="r_WF_MEDIAN-data-usage-notes"></a>

如果 *median\$1expression* 引數是以最大精確度 38 位數定義的 DECIMAL 資料類型，MEDIAN 可能會傳回不準確的結果或錯誤。如果 MEDIAN 函數的傳回值超過 38 位數，會將結果截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 *median\$1expression* 引數轉換為較低精確度。

例如，搭配 DECIMAL 引數的 SUM 函數傳回的預設精確度為 38 位數。結果的小數位數和引數的小數位數相同。因此，例如，DECIMAL(5,2) 欄的 SUM 會傳回 DECIMAL(38,2) 資料類型。

下列範例在 MEDIAN 函數的 *median\$1expression* 引數中使用 SUM 函數。PRICEPAID 欄的資料類型是 DECIMAL (8,2)，所以 SUM 函數會傳回 DECIMAL(38,2)。

```
select salesid, sum(pricepaid), median(sum(pricepaid)) 
over() from sales where salesid < 10 group by salesid;
```

為了避免可能降低精確度或溢位錯誤，請將結果轉換為精確度較低的 DECIMAL 資料類型，如下列範例所示。

```
select salesid, sum(pricepaid), median(sum(pricepaid)::decimal(30,2)) 
over() from sales where salesid < 10 group by salesid;
```

## 範例
<a name="r_WF_MEDIAN-examples"></a>

 以下範例計算每一個賣方的銷售數量中位數：

```
select sellerid, qty, median(qty) 
over (partition by sellerid) 
from winsales
order by sellerid;


sellerid	qty	median
---------------------------
1		10	10.0
1		10	10.0
1		30	10.0
2		20	20.0
2		20	20.0
3		10	17.5
3		15	17.5
3		20	17.5
3		30	17.5
4		10	25.0
4		40	25.0
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

# MIN 範圍函數
<a name="r_WF_MIN"></a>

 MIN 範圍函數傳回輸入表達式值的最小值。MIN 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_WF_MIN-synopsis"></a>

```
MIN ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list frame_clause ]
)
```

## 引數
<a name="r_WF_MIN-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義 MIN 函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="r_WF_MIN-data-types"></a>

接受任何資料類型做為輸入。傳回與 *expression* 相同的資料類型。

## 範例
<a name="r_WF_MIN-examples"></a>

下列範例顯示資料視窗開頭的銷售 ID、數量和最小數量：

```
select salesid, qty,
min(qty) over
(order by salesid rows unbounded preceding)
from winsales
order by salesid;

salesid | qty | min
---------+-----+-----
10001 |  10 |  10
10005 |  30 |  10
10006 |  10 |  10
20001 |  20 |  10
20002 |  20 |  10
30001 |  10 |  10
30003 |  15 |  10
30004 |  20 |  10
30007 |  30 |  10
40001 |  40 |  10
40005 |  10 |  10
(11 rows)
```

 如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例顯示受限窗框中的銷售 ID、數量和最小數量：

```
select salesid, qty,
min(qty) over
(order by salesid rows between 2 preceding and 1 preceding) as min
from winsales
order by salesid;

salesid | qty | min
---------+-----+-----
10001 |  10 |
10005 |  30 |  10
10006 |  10 |  10
20001 |  20 |  10
20002 |  20 |  10
30001 |  10 |  20
30003 |  15 |  10
30004 |  20 |  10
30007 |  30 |  15
40001 |  40 |  20
40005 |  10 |  30
(11 rows)
```

# NTH\$1VALUE 範圍函數
<a name="r_WF_NTH"></a>

 NTH\$1VALUE 範圍函數會相對於視窗的第一列，傳回視窗框之指定列的表達式值。

## 語法
<a name="r_WF_NTH-synopsis"></a>

```
NTH_VALUE (expr, offset)
[ IGNORE NULLS | RESPECT NULLS ]
OVER
( [ PARTITION BY window_partition ]
[ ORDER BY window_ordering 
                        frame_clause ] )
```

## 引數
<a name="r_WF_NTH-arguments"></a>

 *expr*   
 函數運算的目標欄或表達式。

 *offset*   
 相對於視窗中的第一列，決定要傳回表達式的列號。*offset* 可以是常數或表達式，且必須為大於 0 的正整數。

IGNORE NULLS   
選擇性規格，指出 Amazon Redshift 在決定要使用的列時應該略過 Null 值。如果未列出 IGNORE NULLS，則會包含 Null 值。

RESPECT NULLS   
 指出 Amazon Redshift 應該包含 null 值來決定要使用的列。如果您不指定 IGNORE NULLS，則預設支援 RESPECT NULLS。

OVER   
指定視窗分割、排序及視窗框。

PARTITION BY *window\$1partition*   
針對 OVER 子句中的每一個群組，設定記錄範圍。

ORDER BY *window\$1ordering*   
排序每一個分割區內的列。如果省略 ORDER BY，則預設窗框包含分割區中的所有列。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果中包含或排除資料列組，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

NTH\$1VALUE 範圍函數支援有使用任何 Amazon Redshift 資料類型的運算式。傳回類型與 *expr* 的類型相同。

## 範例
<a name="r_WF_NTH-examples"></a>

下列範例顯示加利佛尼亞、佛羅里達及紐約的前三大會場的座位數，並對照這些州其他會場的座位數：

```
select venuestate, venuename, venueseats,
nth_value(venueseats, 3)
ignore nulls
over(partition by venuestate order by venueseats desc
rows between unbounded preceding and unbounded following)
as third_most_seats
from (select * from venue where venueseats > 0 and
venuestate in('CA', 'FL', 'NY'))
order by venuestate;

venuestate |           venuename            | venueseats | third_most_seats
------------+--------------------------------+------------+------------------
CA         | Qualcomm Stadium               |      70561 |            63026
CA         | Monster Park                   |      69843 |            63026
CA         | McAfee Coliseum                |      63026 |            63026
CA         | Dodger Stadium                 |      56000 |            63026
CA         | Angel Stadium of Anaheim       |      45050 |            63026
CA         | PETCO Park                     |      42445 |            63026
CA         | AT&T Park                      |      41503 |            63026
CA         | Shoreline Amphitheatre         |      22000 |            63026
FL         | Dolphin Stadium                |      74916 |            65647
FL         | Jacksonville Municipal Stadium |      73800 |            65647
FL         | Raymond James Stadium          |      65647 |            65647
FL         | Tropicana Field                |      36048 |            65647
NY         | Ralph Wilson Stadium           |      73967 |            20000
NY         | Yankee Stadium                 |      52325 |            20000
NY         | Madison Square Garden          |      20000 |            20000
(15 rows)
```

# NTILE 範圍函數
<a name="r_WF_NTILE"></a>

 NTILE 範圍函數將分割區中排序的列劃分為指定數量的排名群組，且大小儘可能相等，然後傳回給定列所屬的群組。

## 語法
<a name="r_WF_NTILE-synopsis"></a>

```
NTILE (expr)
OVER ( 
[ PARTITION BY expression_list ] 
[ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_NTILE-arguments"></a>

 *expr*   
每一個分割區的排名群組數，且結果必須為整數值 (大於 0)。*expr* 引數必須不可為 Null。

OVER   
 用於指定視窗分割和排序的子句。OVER 子句不能包含視窗框規格。

PARTITION BY *window\$1partition*   
選用。OVER 子句中每一個群組的記錄範圍。

ORDER BY *window\$1ordering*   
選用。此表達式排序每一個分割區內的列。如果省略 ORDER BY 子句，則排名行為相同。  
如果 ORDER BY 未產生唯一排序，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="r_WF_NTILE-return-type"></a>

BIGINT

## 範例
<a name="r_WF_NTILE-examples"></a>

 下列範例將 2008 年 8 月 26 日 Hamlet 門票的支付價格分成四個排名群組。結果集有 17 列，幾乎平均分散於排名 1 到 4：

```
select eventname, caldate, pricepaid, ntile(4)
over(order by pricepaid desc) from sales, event, date
where sales.eventid=event.eventid and event.dateid=date.dateid and eventname='Hamlet'
and caldate='2008-08-26'
order by 4;

eventname |  caldate   | pricepaid | ntile
-----------+------------+-----------+-------
Hamlet    | 2008-08-26 |   1883.00 |     1
Hamlet    | 2008-08-26 |   1065.00 |     1
Hamlet    | 2008-08-26 |    589.00 |     1
Hamlet    | 2008-08-26 |    530.00 |     1
Hamlet    | 2008-08-26 |    472.00 |     1
Hamlet    | 2008-08-26 |    460.00 |     2
Hamlet    | 2008-08-26 |    355.00 |     2
Hamlet    | 2008-08-26 |    334.00 |     2
Hamlet    | 2008-08-26 |    296.00 |     2
Hamlet    | 2008-08-26 |    230.00 |     3
Hamlet    | 2008-08-26 |    216.00 |     3
Hamlet    | 2008-08-26 |    212.00 |     3
Hamlet    | 2008-08-26 |    106.00 |     3
Hamlet    | 2008-08-26 |    100.00 |     4
Hamlet    | 2008-08-26 |     94.00 |     4
Hamlet    | 2008-08-26 |     53.00 |     4
Hamlet    | 2008-08-26 |     25.00 |     4
(17 rows)
```

# PERCENT\$1RANK 範圍函數
<a name="r_WF_PERCENT_RANK"></a>

計算給定資料列的百分比排行。使用此公式決定百分比排名：

`(x - 1) / (the number of rows in the window or partition - 1)`

其中 *x* 是目前列的排名。以下資料集示範此公式的使用：

```
Row#	Value	Rank	Calculation	PERCENT_RANK
1	15	1	(1-1)/(7-1)	0.0000
2	20	2	(2-1)/(7-1)	0.1666
3	20	2	(2-1)/(7-1)	0.1666
4	20	2	(2-1)/(7-1)	0.1666
5	30	5	(5-1)/(7-1)	0.6666
6	30	5	(5-1)/(7-1)	0.6666
7	40	7	(7-1)/(7-1)	1.0000
```

傳回值範圍是 0 至 1 (含)。任何集的第一列的 PERCENT\$1RANK 為 0。

## 語法
<a name="r_WF_PERCENT_RANK-synopsis"></a>

```
PERCENT_RANK ()
OVER ( 
[ PARTITION BY partition_expression ] 
[ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_PERCENT_RANK-arguments"></a>

( )   
此函數不接受引數，但需要空括號。

OVER  
用於指定視窗分割的子句。OVER 子句不能包含視窗框規格。

PARTITION BY *partition\$1expression*   
選用。此表達式針對 OVER 子句中的每一個群組，設定記錄範圍。

ORDER BY *order\$1list*   
選用。要計算百分比排名的表達式。表達式必須為數值資料類型，或可隱含地轉換為數值資料類型。如果省略 ORDER BY，所有列的傳回值為 0。  
如果 ORDER BY 未產生唯一排序，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="r_WF_PERCENT_RANK-return-type"></a>

FLOAT8

## 範例
<a name="r_WF_PERCENT_RANK-examples"></a>

以下範例計算每一個賣方的銷售數量百分比排名：

```
select sellerid, qty, percent_rank() 
over (partition by sellerid order by qty) 
from winsales;

sellerid	qty		percent_rank
----------------------------------------
1		10.00		0.0
1		10.64		0.5
1		30.37		1.0
3		10.04		0.0
3		15.15		0.33
3		20.75		0.67
3		30.55		1.0
2		20.09		0.0
2		20.12		1.0
4		10.12		0.0
4		40.23		1.0
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

# PERCENTILE\$1CONT 範圍函數
<a name="r_WF_PERCENTILE_CONT"></a>

PERCENTILE\$1CONT 是採用連續分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回插入值，該值將根據排序規格落入給定的百分位數值。

PERCENTILE\$1CONT 在值排序後計算值之間的線性插值。此函數在列根據排序規格來排序後，使用彙總群組中的百分位數值 `(P)` 和非 Null 列數 `(N)` 來計算列號。此列號 `(RN)` 是根據公式 `RN = (1+ (P*(N-1))` 來計算。彙總函數的最終結果是以列號 `CRN = CEILING(RN)` 到 `FRN = FLOOR(RN)` 各列的值之間的線性插值來計算。

最終結果如下。

如果 `(CRN = FRN = RN)`，則結果為 `(value of expression from row at RN)` 

否則結果如下：

`(CRN - RN) * (value of expression for row at FRN) + (RN - FRN) * (value of expression for row at CRN)`.

您只能在 OVER 子句中指定 PARTITION 子句。如果指定 PARTITION，則對於每一列，PERCENTILE\$1CONT 會傳回在給定分割區內的一組值之中落在指定百分位數的值。

## 語法
<a name="r_WF_PERCENTILE_CONT-synopsis"></a>

```
PERCENTILE_CONT ( percentile )
WITHIN GROUP (ORDER BY expr)
OVER (  [ PARTITION BY expr_list ]  )
```

## 引數
<a name="r_WF_PERCENTILE_CONT-arguments"></a>

 *percentile*   
介於 0 和 1 之間的數值常數。計算時會忽略 Null。

WITHIN GROUP ( ORDER BY *expr*)   
指定要排序和計算百分位數的數值或日期/時間值。

OVER   
指定視窗分割。OVER 子句不能包含視窗排序或視窗框規格。

PARTITION BY *expr*   
選擇性引數，針對 OVER 子句中的每一個群組，設定記錄範圍。

## 傳回值
<a name="r_WF_PERCENTILE_CONT-returns"></a>

傳回類型取決於 WITHIN GROUP 子句中 ORDER BY 表達式的資料類型。下表顯示每一個 ORDER BY 表達式資料類型的傳回類型。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/redshift/latest/dg/r_WF_PERCENTILE_CONT.html)

## 使用須知
<a name="r_WF_PERCENTILE_CONT-usage-notes"></a>

如果 ORDER BY 表達式是以最大精確度 38 位數定義的 DECIMAL 資料類型，PERCENTILE\$1CONT 可能會傳回不準確的結果或錯誤。如果 PERCENTILE\$1CONT 函數的傳回值超過 38 位數，結果會截斷為適合長度，導致精確度降低。在插補期間，如果中間結果超過最大精確度，則會發生數值溢位，且函數會傳回錯誤。為了避免這些情況，建議使用精確度較低的資料類型，或將 ORDER BY 表達式轉換為較低精確度。

例如，搭配 DECIMAL 引數的 SUM 函數傳回的預設精確度為 38 位數。結果的小數位數和引數的小數位數相同。因此，例如，DECIMAL(5,2) 欄的 SUM 會傳回 DECIMAL(38,2) 資料類型。

下列範例在 PERCENTILE\$1CONT 函數的 ORDER BY 子句中使用 SUM 函數。PRICEPAID 欄的資料類型是 DECIMAL (8,2)，所以 SUM 函數會傳回 DECIMAL(38,2)。

```
select salesid, sum(pricepaid), percentile_cont(0.6) 
within group (order by sum(pricepaid) desc) over()
from sales where salesid < 10 group by salesid;
```

為了避免可能降低精確度或溢位錯誤，請將結果轉換為精確度較低的 DECIMAL 資料類型，如下列範例所示。

```
select salesid, sum(pricepaid), percentile_cont(0.6) 
within group (order by sum(pricepaid)::decimal(30,2) desc) over()
from sales where salesid < 10 group by salesid;
```

## 範例
<a name="r_WF_PERCENTILE_CONT-examples"></a>

下列範例使用 WINSALES 資料表。如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

```
select sellerid, qty, percentile_cont(0.5) 
within group (order by qty) 
over() as median from winsales;

 sellerid | qty | median 
----------+-----+--------
        1 |  10 |   20.0
        1 |  10 |   20.0
        3 |  10 |   20.0
        4 |  10 |   20.0
        3 |  15 |   20.0
        2 |  20 |   20.0
        3 |  20 |   20.0
        2 |  20 |   20.0
        3 |  30 |   20.0
        1 |  30 |   20.0
        4 |  40 |   20.0
(11 rows)
```

```
select sellerid, qty, percentile_cont(0.5) 
within group (order by qty) 
over(partition by sellerid) as median from winsales;

 sellerid | qty | median 
----------+-----+--------
        2 |  20 |   20.0
        2 |  20 |   20.0
        4 |  10 |   25.0
        4 |  40 |   25.0
        1 |  10 |   10.0
        1 |  10 |   10.0
        1 |  30 |   10.0
        3 |  10 |   17.5
        3 |  15 |   17.5
        3 |  20 |   17.5
        3 |  30 |   17.5
(11 rows)
```

以下範例計算華盛頓州之賣方門票銷售的 PERCENTILE\$1CONT 和 PERCENTILE\$1DISC。

```
SELECT sellerid, state, sum(qtysold*pricepaid) sales, 
percentile_cont(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over(),
percentile_disc(0.6) within group (order by sum(qtysold*pricepaid::decimal(14,2) ) desc) over()
from sales s, users u 
where s.sellerid = u.userid and state = 'WA' and sellerid < 1000
group by sellerid, state;

 sellerid | state |  sales  | percentile_cont | percentile_disc
----------+-------+---------+-----------------+-----------------
      127 | WA    | 6076.00 |         2044.20 |         1531.00
      787 | WA    | 6035.00 |         2044.20 |         1531.00
      381 | WA    | 5881.00 |         2044.20 |         1531.00
      777 | WA    | 2814.00 |         2044.20 |         1531.00
       33 | WA    | 1531.00 |         2044.20 |         1531.00
      800 | WA    | 1476.00 |         2044.20 |         1531.00
        1 | WA    | 1177.00 |         2044.20 |         1531.00
(7 rows)
```

# PERCENTILE\$1DISC 範圍函數
<a name="r_WF_PERCENTILE_DISC"></a>

PERCENTILE\$1DISC 是採用離散分佈模型的反向分佈函數。它採用百分位數值和排序規格，且會傳回給定集裡的一個元素。

針對給定的百分位數值 P，PERCENTILE\$1DISC 排序 ORDER BY 子句中的表達式值，且傳回的值具有大於或等於 P 的最小累積分佈值 (根據相同的排序規格)。

您只能在 OVER 子句中指定 PARTITION 子句。

## 語法
<a name="r_WF_PERCENTILE_DISC-synopsis"></a>

```
PERCENTILE_DISC ( percentile )
WITHIN GROUP (ORDER BY expr)
OVER (  [ PARTITION BY expr_list ]  )
```

## 引數
<a name="r_WF_PERCENTILE_DISC-arguments"></a>

 *percentile*   
介於 0 和 1 之間的數值常數。計算時會忽略 Null。

WITHIN GROUP ( ORDER BY *expr*)   
指定要排序和計算百分位數的數值或日期/時間值。

OVER   
指定視窗分割。OVER 子句不能包含視窗排序或視窗框規格。

PARTITION BY *expr*   
選擇性引數，針對 OVER 子句中的每一個群組，設定記錄範圍。

## 傳回值
<a name="r_WF_PERCENTILE_DISC-returns"></a>

資料類型與 WITHIN GROUP 子句中的 ORDER BY 表達式相同。

## 範例
<a name="r_WF_PERCENTILE_DISC-examples"></a>

下列範例使用 WINSALES 資料表。如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

```
SELECT sellerid, qty, PERCENTILE_DISC(0.5) 
WITHIN GROUP (ORDER BY qty) 
OVER() AS MEDIAN FROM winsales;

+----------+-----+--------+
| sellerid | qty | median |
+----------+-----+--------+
| 3        | 10  | 20     |
| 1        | 10  | 20     |
| 1        | 10  | 20     |
| 4        | 10  | 20     |
| 3        | 15  | 20     |
| 2        | 20  | 20     |
| 2        | 20  | 20     |
| 3        | 20  | 20     |
| 1        | 30  | 20     |
| 3        | 30  | 20     |
| 4        | 40  | 20     |
+----------+-----+--------+

SELECT sellerid, qty, PERCENTILE_DISC(0.5) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS MEDIAN FROM winsales;

+----------+-----+--------+
| sellerid | qty | median |
+----------+-----+--------+
| 4        | 10  | 10     |
| 4        | 40  | 10     |
| 3        | 10  | 15     |
| 3        | 15  | 15     |
| 3        | 20  | 15     |
| 3        | 30  | 15     |
| 2        | 20  | 20     |
| 2        | 20  | 20     |
| 1        | 10  | 10     |
| 1        | 10  | 10     |
| 1        | 30  | 10     |
+----------+-----+--------+
```

若要尋找依賣家 ID 分割時數量的 PERCENTILE\$1DISC(0.25) 和 PERCENTILE\$1DISC(0.75)，請使用下列範例。

```
SELECT sellerid, qty, PERCENTILE_DISC(0.25) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS quartile1 FROM winsales;

+----------+-----+-----------+
| sellerid | qty | quartile1 |
+----------+-----+-----------+
| 4        | 10  | 10        |
| 4        | 40  | 10        |
| 2        | 20  | 20        |
| 2        | 20  | 20        |
| 3        | 10  | 10        |
| 3        | 15  | 10        |
| 3        | 20  | 10        |
| 3        | 30  | 10        |
| 1        | 10  | 10        |
| 1        | 10  | 10        |
| 1        | 30  | 10        |
+----------+-----+-----------+

SELECT sellerid, qty, PERCENTILE_DISC(0.75) 
WITHIN GROUP (ORDER BY qty) 
OVER(PARTITION BY sellerid) AS quartile3 FROM winsales;

+----------+-----+-----------+
| sellerid | qty | quartile3 |
+----------+-----+-----------+
| 3        | 10  | 20        |
| 3        | 15  | 20        |
| 3        | 20  | 20        |
| 3        | 30  | 20        |
| 4        | 10  | 40        |
| 4        | 40  | 40        |
| 2        | 20  | 20        |
| 2        | 20  | 20        |
| 1        | 10  | 30        |
| 1        | 10  | 30        |
| 1        | 30  | 30        |
+----------+-----+-----------+
```

# RANK 範圍函數
<a name="r_WF_RANK"></a>

 RANK 範圍函數根據 OVER 子句中的 ORDER BY 表達式，決定一組值之中某個值的排名。如果有選用的 PARTITION BY 子句，則會重設每一組列的排名。在排名準則中有相等值的列獲得相同排名。Amazon Redshift 將綁定的行數添加到綁定的排名中以計算下一個排名，因此排名可能不是連續的數字。例如，假設兩列都排名 1，則下一個排名為 3。

 RANK 函數有一方面不同於 [DENSE\$1RANK 範圍函數](r_WF_DENSE_RANK.md)：對於 DENSE\$1RANK，如果兩列以上繫結在一起，則排名值的序列中沒有間隙。例如，假設兩列都排名 1，則下一個排名為 2。

在相同查詢中，排名函數可以搭配不同的 PARTITION BY 和 ORDER BY 子句。

## 語法
<a name="r_WF_RANK-synopsis"></a>

```
RANK () OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_RANK-arguments"></a>

( )   
此函數不接受引數，但需要空括號。

OVER   
RANK 函數的視窗子句。

PARTITION BY *expr\$1list*   
選用。一或多個用於定義視窗的表達式。

ORDER BY *order\$1list*   
選用。定義排名值所根據的欄。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。如果省略 ORDER BY，所有列的傳回值為 1。  
如果 ORDER BY 未產生唯一排序，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="c_Supported_data_types_wf_rank"></a>

INTEGER

## 範例
<a name="r_WF_RANK-examples"></a>

下列範例會依銷售數量排序資料表 (預設為遞增)，並將排名指派給每一列。最高排名的值為 1。套用範圍函數結果之後排序結果：

```
select salesid, qty,
rank() over (order by qty) as rnk
from winsales
order by 2,1;

salesid | qty | rnk
--------+-----+-----
10001 |  10 |  1
10006 |  10 |  1
30001 |  10 |  1
40005 |  10 |  1
30003 |  15 |  5
20001 |  20 |  6
20002 |  20 |  6
30004 |  20 |  6
10005 |  30 |  9
30007 |  30 |  9
40001 |  40 |  11
(11 rows)
```

請注意，此範例中的外圍 ORDER BY 子句包含第 2 欄和第 1 欄，以確保此查詢每次執行時，Amazon Redshift 會傳回一致排序的結果。例如，銷售 ID 為 10001 和 10006 的列有相同的 QTY 和 RNK 值。依第 1 欄排序最終結果集可確保列 10001 一定位於 10006 之前。如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

在以下範例中，範圍函數反向排序 (`order by qty desc`)。現在，最高排名值套用至最大 QTY 值。

```
select salesid, qty,
rank() over (order by qty desc) as rank
from winsales
order by 2,1;

 salesid | qty | rank
---------+-----+-----
   10001 |  10 |   8
   10006 |  10 |   8
   30001 |  10 |   8
   40005 |  10 |   8
   30003 |  15 |   7
   20001 |  20 |   4
   20002 |  20 |   4
   30004 |  20 |   4
   10005 |  30 |   2
   30007 |  30 |   2
   40001 |  40 |   1
(11 rows)
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例會依 SELLERID 分割資料表，並依數量排序每一個分割區 (以遞減順序)，然後指派排名給每一列。套用範圍函數結果之後排序結果。

```
select salesid, sellerid, qty, rank() over
(partition by sellerid
order by qty desc) as rank
from winsales
order by 2,3,1;

salesid | sellerid | qty | rank
--------+----------+-----+-----
  10001 |        1 |  10 |  2
  10006 |        1 |  10 |  2
  10005 |        1 |  30 |  1
  20001 |        2 |  20 |  1
  20002 |        2 |  20 |  1
  30001 |        3 |  10 |  4
  30003 |        3 |  15 |  3
  30004 |        3 |  20 |  2
  30007 |        3 |  30 |  1
  40005 |        4 |  10 |  2
  40001 |        4 |  40 |  1
(11 rows)
```

# RATIO\$1TO\$1REPORT 範圍函數
<a name="r_WF_RATIO_TO_REPORT"></a>

計算視窗或分割區內值與值總和的比率。使用下列公式決定報告值的比率：

`value of `*ratio\$1expression* `argument for the current row / sum of` *ratio\$1expression* `argument for the window or partition`

以下資料集示範此公式的使用：

```
Row#	Value	Calculation	RATIO_TO_REPORT
1	2500	(2500)/(13900)	0.1798
2	2600	(2600)/(13900)	0.1870
3	2800	(2800)/(13900)	0.2014
4	2900	(2900)/(13900)	0.2086
5	3100	(3100)/(13900)	0.2230
```

傳回值範圍是 0 至 1 (含)。如果 *ratio\$1expressio*n 為 NULL，則傳回值為 `NULL`。如果 *partition\$1expression* 中的值是唯一的，則函數將傳回 `1` 代表該值。

## 語法
<a name="r_WF_RATIO_TO_REPORT-synopsis"></a>

```
RATIO_TO_REPORT ( ratio_expression )
OVER ( [ PARTITION BY partition_expression ] )
```

## 引數
<a name="r_WF_RATIO_TO_REPORT-arguments"></a>

*ratio\$1expression*   
此表達式 (例如欄名) 提供要決定比率的值。表達式必須為數值資料類型，或可隱含地轉換為數值資料類型。  
您不能在 *ratio\$1expression* 中使用其他任何分析函數。

OVER  
用於指定視窗分割的子句。OVER 子句不能包含視窗排序或視窗框規格。

PARTITION BY *partition\$1expression*   
選用。此表達式針對 OVER 子句中的每一個群組，設定記錄範圍。

## 傳回類型
<a name="r_WF_RATIO_TO_REPORT-return-type"></a>

FLOAT8

## 範例
<a name="r_WF_RATIO_TO_REPORT-examples"></a>

下列範例使用 WINSALES 資料表。如需有關如何建立 WINSALES 資料表的資訊，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例會計算賣家數量各資料列的報表比率，以及所有賣家數量的總計。

```
select sellerid, qty, ratio_to_report(qty) 
over()
from winsales
order by sellerid;

sellerid  qty    ratio_to_report
--------------------------------------
1         30     0.13953488372093023	
1         10     0.046511627906976744	
1         10     0.046511627906976744	
2         20     0.09302325581395349	
2         20     0.09302325581395349	
3         30     0.13953488372093023	
3         20     0.09302325581395349	
3         15     0.06976744186046512	
3         10     0.046511627906976744	
4         10     0.046511627906976744	
4         40     0.18604651162790697
```

以下範例依分割區計算每一個賣方的銷售數量比例。

```
select sellerid, qty, ratio_to_report(qty) 
over(partition by sellerid) 
from winsales;

sellerid   qty    ratio_to_report
-------------------------------------------
2          20     0.5	
2          20     0.5	
4          40     0.8	
4          10     0.2	
1          10     0.2	
1          30     0.6	
1          10     0.2	
3          10     0.13333333333333333	
3          15     0.2	
3          20     0.26666666666666666	
3          30     0.4
```

# ROW\$1NUMBER 範圍函數
<a name="r_WF_ROW_NUMBER"></a>

根據 OVER 子句中的 ORDER BY 運算式，指派一組列之內目前列的序數 (從 1 起算)。如果有選用的 PARTITION BY 子句，則會重設每一組列的序數。對於 ORDER BY 表達式，具有相等值的列會獲得非決定性的不同列號。

## 語法
<a name="r_WF_ROW_NUMBER-synopsis"></a>

```
ROW_NUMBER() OVER(
  [ PARTITION BY expr_list ]
  [ ORDER BY order_list ]
)
```

## 引數
<a name="r_WF_ROW_NUMBER-arguments"></a>

( )   
此函數不接受引數，但需要空括號。

OVER   
ROW\$1NUMBER 函數的範圍函數子句。

PARTITION BY *expr\$1list*   
選用。將結果分割成多組列的一或多個欄運算式。

ORDER BY *order\$1list*   
選用。定義集合中資料列順序的一或多個資料行運算式。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。  
如果 ORDER BY 未產生唯一排序或被省略，則列的順序不確定。如需詳細資訊，請參閱[範圍函數的資料唯一排序](c_Window_functions.md#r_Examples_order_by_WF)。

## 傳回類型
<a name="c_Supported_data_types_r_WF_ROW_NUMBER"></a>

BIGINT

## 範例
<a name="r_WF_ROW_NUMBER-examples"></a>

下列範例使用 `WINSALES` 資料表。如需 `WINSALES` 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

下列範例依數量對資料表進行排序 (以遞增順序)，然後將列號指派給每一列。套用範圍函數結果之後排序結果。

```
SELECT salesid, sellerid, qty, 
ROW_NUMBER() OVER(
   ORDER BY qty ASC) AS row
FROM winsales
ORDER BY 4,1;

salesid   sellerid   qty   row
---------+----------+-----+-----
   30001 |        3 |  10 |   1	
   10001 |        1 |  10 |   2	
   10006 |        1 |  10 |   3
   40005 |        4 |  10 |   4
   30003 |        3 |  15 |   5
   20001 |        2 |  20 |   6
   20002 |        2 |  20 |   7
   30004 |        3 |  20 |   8
   10005 |        1 |  30 |   9
   30007 |        3 |  30 |  10
   40001 |        4 |  40 |  11
```

下列範例依 SELLERID 分割資料表，並依 QTY 排序每一個分割區 (以遞增順序)，然後將列號指派給每一列。套用範圍函數結果之後排序結果。

```
SELECT salesid, sellerid, qty, 
ROW_NUMBER() OVER(
  PARTITION BY sellerid
  ORDER BY qty ASC) AS row_by_seller
FROM winsales
ORDER BY 2,4;

 salesid | sellerid | qty | row_by_seller
---------+----------+-----+-----
   10001 |        1 |  10 |   1
   10006 |        1 |  10 |   2
   10005 |        1 |  30 |   3
   20001 |        2 |  20 |   1
   20002 |        2 |  20 |   2
   30001 |        3 |  10 |   1
   30003 |        3 |  15 |   2
   30004 |        3 |  20 |   3
   30007 |        3 |  30 |   4
   40005 |        4 |  10 |   1
   40001 |        4 |  40 |   2
```

下列範例顯示不使用選用子句時的結果。

```
SELECT salesid, sellerid, qty, ROW_NUMBER() OVER() AS row
FROM winsales
ORDER BY 4,1;

salesid   sellerid   qty   row
---------+----------+-----+-----
   30001 |        3 |  10 |   1	
   10001 |        1 |  10 |   2	
   10005 |        1 |  30 |   3
   40001 |        4 |  40 |   4
   10006 |        1 |  10 |   5
   20001 |        2 |  20 |   6
   40005 |        4 |  10 |   7
   20002 |        2 |  20 |   8
   30003 |        3 |  15 |   9
   30004 |        3 |  20 |  10
   30007 |        3 |  30 |  11
```

# STDDEV\$1SAMP 和 STDDEV\$1POP 範圍函數
<a name="r_WF_STDDEV"></a>

STDDEV\$1SAMP 和 STDDEV\$1POP 範圍函數傳回一組數值 (整數、小數或浮點數) 的樣本標準差和母體標準差。另請參閱[STDDEV\$1SAMP 和 STDDEV\$1POP 函數](r_STDDEV_functions.md)。

STDDEV\$1SAMP 和 STDDEV 是同一個函數的同義詞。

## 語法
<a name="r_WF_STDDEV-synopsis"></a>

```
STDDEV_SAMP | STDDEV | STDDEV_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 引數
<a name="r_WF_STDDEV-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="c_Supported_data_types_wf_stddev"></a>

STDDEV 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL 及 DOUBLE PRECISION。

不論表達式的資料類型，STDDEV 函數的傳回類型都是雙精確度數字。

## 範例
<a name="r_wf_stddev-examples"></a>

下列範例顯示如何使用 STDDEV\$1POP 和 VAR\$1POP 函數做為範圍函數。查詢計算 SALES 資料表中 PRICEPAID 值的母體變異數和母體標準差。

```
select salesid, dateid, pricepaid,
round(stddev_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as stddevpop,
round(var_pop(pricepaid) over
(order by dateid, salesid rows unbounded preceding)) as varpop
from sales
order by 2,1;

salesid | dateid | pricepaid | stddevpop | varpop
--------+--------+-----------+-----------+---------
  33095 |   1827 |    234.00 |         0 |       0
  65082 |   1827 |    472.00 |       119 |   14161
  88268 |   1827 |    836.00 |       248 |   61283
  97197 |   1827 |    708.00 |       230 |   53019
 110328 |   1827 |    347.00 |       223 |   49845
 110917 |   1827 |    337.00 |       215 |   46159
 150314 |   1827 |    688.00 |       211 |   44414
 157751 |   1827 |   1730.00 |       447 |  199679
 165890 |   1827 |   4192.00 |      1185 | 1403323
...
```

樣本標準差和變異數函數可如法泡製。

# SUM 範圍函數
<a name="r_WF_SUM"></a>

 SUM 範圍函數傳回輸入欄或表達式值的總和。SUM 函數處理數值，且忽略 NULL 值。

## 語法
<a name="r_WF_SUM-synopsis"></a>

```
SUM ( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 引數
<a name="r_WF_SUM-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義 SUM 函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="c_Supported_data_types_wf_sum"></a>

SUM 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL 及 DOUBLE PRECISION。

SUM 函數支援的傳回類型如下：
+ BIGINT 代表 SMALLINT 或 INTEGER 引數
+ NUMERIC 代表 BIGINT 引數
+ DOUBLE PRECISION 代表浮點數引數

## 範例
<a name="r_WF_SUM-examples"></a>

下列範例會建立銷售數量的累積 (滾動) 總和，依日期和銷售 ID 排序：

```
select salesid, dateid, sellerid, qty,
sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  20
10005 | 2003-12-24 |        1 |  30 |  50
40001 | 2004-01-09 |        4 |  40 |  90
10006 | 2004-01-18 |        1 |  10 | 100
20001 | 2004-02-12 |        2 |  20 | 120
40005 | 2004-02-12 |        4 |  10 | 130
20002 | 2004-02-16 |        2 |  20 | 150
30003 | 2004-04-18 |        3 |  15 | 165
30004 | 2004-04-18 |        3 |  20 | 185
30007 | 2004-09-07 |        3 |  30 | 215
(11 rows)
```

 如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

以下範例會依日期建立銷售數量的累積 (滾動) 總和、依賣方 ID 分割結果，然後在分割區內依日期和銷售 ID 排序結果：

```
select salesid, dateid, sellerid, qty,
sum(qty) over (partition by sellerid
order by dateid, salesid rows unbounded preceding) as sum
from winsales
order by 2,1;

salesid |   dateid   | sellerid | qty | sum
---------+------------+----------+-----+-----
30001 | 2003-08-02 |        3 |  10 |  10
10001 | 2003-12-24 |        1 |  10 |  10
10005 | 2003-12-24 |        1 |  30 |  40
40001 | 2004-01-09 |        4 |  40 |  40
10006 | 2004-01-18 |        1 |  10 |  50
20001 | 2004-02-12 |        2 |  20 |  20
40005 | 2004-02-12 |        4 |  10 |  50
20002 | 2004-02-16 |        2 |  20 |  40
30003 | 2004-04-18 |        3 |  15 |  25
30004 | 2004-04-18 |        3 |  20 |  45
30007 | 2004-09-07 |        3 |  30 |  75
(11 rows)
```

以下範例將結果集的所有列依序編號，依 SELLERID 和 SALESID 欄排序：

```
select salesid, sellerid, qty,
sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;

salesid | sellerid |  qty | rownum
--------+----------+------+--------
10001 |        1 |   10 |     1
10005 |        1 |   30 |     2
10006 |        1 |   10 |     3
20001 |        2 |   20 |     4
20002 |        2 |   20 |     5
30001 |        3 |   10 |     6
30003 |        3 |   15 |     7
30004 |        3 |   20 |     8
30007 |        3 |   30 |     9
40001 |        4 |   40 |    10
40005 |        4 |   10 |    11
(11 rows)
```

如需 WINSALES 資料表的描述，請參閱[範圍函數範例的範例資料表](c_Window_functions.md#r_Window_function_example)。

以下範例將結果集的所有列依序編號、依 SELLERID 分割結果，然後在分割區內依 SELLERID 和 SALESID 排序結果：

```
select salesid, sellerid, qty,
sum(1) over (partition by sellerid
order by sellerid, salesid rows unbounded preceding) as rownum
from winsales
order by 2,1;

salesid | sellerid | qty | rownum
---------+----------+-----+--------
10001 |        1 |  10 |      1
10005 |        1 |  30 |      2
10006 |        1 |  10 |      3
20001 |        2 |  20 |      1
20002 |        2 |  20 |      2
30001 |        3 |  10 |      1
30003 |        3 |  15 |      2
30004 |        3 |  20 |      3
30007 |        3 |  30 |      4
40001 |        4 |  40 |      1
40005 |        4 |  10 |      2
(11 rows)
```

# VAR\$1SAMP 和 VAR\$1POP 範圍函數
<a name="r_WF_VARIANCE"></a>

 VAR\$1SAMP 和 VAR\$1POP 範圍函數傳回一組數值 (整數、小數或浮點數) 的樣本變異數和母體變異數。另請參閱[VAR\$1SAMP 和 VAR\$1POP 函數](r_VARIANCE_functions.md)。

VAR\$1SAMP 和 VARIANCE 是同一個函數的同義詞。

## 語法
<a name="r_WF_VARIANCE-synopsis"></a>

```
VAR_SAMP | VARIANCE | VAR_POP
( [ ALL ] expression ) OVER
(
[ PARTITION BY expr_list ]
[ ORDER BY order_list 
                        frame_clause ]
)
```

## 引數
<a name="r_WF_VARIANCE-arguments"></a>

 *expression *   
函數運算的目標欄或表達式。

ALL   
如果指定引數 ALL，函數會保留表達式中的所有重複值。ALL 為預設值。不支援 DISTINCT。

OVER   
指定彙總函數的視窗子句。OVER 子句區分視窗彙總函數和正常組彙總函數。

PARTITION BY *expr\$1list*   
以一或多個表達式定義函數的視窗。

ORDER BY *order\$1list*   
排序每一個分割區內的列。如果未指定 PARTITION BY，ORDER BY 會使用整個資料表。

 *frame\$1clause*   
如果彙總函數使用 ORDER BY 子句，則需要明確的窗框子句。窗框子句在排序的結果內包含或排除列集，以調整函數視窗中的一個列集。窗框子句包含 ROWS 關鍵字和相關的指定元。請參閱 [範圍函數語法摘要](c_Window_functions.md#r_Window_function_synopsis)。

## 資料類型
<a name="c_Supported_data_types_wf_variance"></a>

VARIANCE 函數支援的引數類型包括 SMALLINT、INTEGER、BIGINT、NUMERIC、DECIMAL、REAL 及 DOUBLE PRECISION。

不論表達式的資料類型，VARIANCE 函數的傳回類型都是雙精確度數字。

# 系統管理函數
<a name="r_System_administration_functions"></a>

**Topics**
+ [CHANGE\$1QUERY\$1PRIORITY](r_CHANGE_QUERY_PRIORITY.md)
+ [CHANGE\$1SESSION\$1PRIORITY](r_CHANGE_SESSION_PRIORITY.md)
+ [CHANGE\$1USER\$1PRIORITY](r_CHANGE_USER_PRIORITY.md)
+ [CURRENT\$1SETTING](r_CURRENT_SETTING.md)
+ [PG\$1CANCEL\$1BACKEND](PG_CANCEL_BACKEND.md)
+ [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md)
+ [REBOOT\$1CLUSTER](r_REBOOT_CLUSTER.md)
+ [SET\$1CONFIG](r_SET_CONFIG.md)

Amazon Redshift 支援多個系統管理函數。

# CHANGE\$1QUERY\$1PRIORITY
<a name="r_CHANGE_QUERY_PRIORITY"></a>

CHANGE\$1QUERY\$1PRIORITY 可讓超級使用者修改在工作負載管理 (WLM) 中執行或等待之查詢的優先順序。

此函數讓超級使用者可以立即變更系統中任何查詢的優先順序。只有一個查詢、使用者或工作階段可以使用優先順序 `CRITICAL` 執行。

## 語法
<a name="r_CHANGE_QUERY_PRIORITY-synopsis"></a>

```
CHANGE_QUERY_PRIORITY(query_id, priority)
```

## 引數
<a name="r_CHANGE_QUERY_PRIORITY-argument"></a>

 *query\$1id*   
要變更其優先順序之查詢的查詢識別碼。需要 `INTEGER` 值。

 *priority*   
要指派給查詢的新優先順序。這個引數必須是具備 `CRITICAL`、`HIGHEST`、`HIGH`、`NORMAL`、`LOW` 或 `LOWEST` 值的字串。

## 傳回類型
<a name="r_CHANGE_QUERY_PRIORITY-return-type"></a>

無

## 範例
<a name="r_CHANGE_QUERY_PRIORITY-example"></a>

若要顯示 STV\$1WLM\$1QUERY\$1STATE 系統資料表中的 `query_priority` 欄，請使用下列範例。

```
SELECT query, service_class, query_priority, state 
FROM stv_wlm_query_state WHERE service_class = 101;

+-------+---------------+----------------+---------+
| query | service_class | query_priority |  state  |
+-------+---------------+----------------+---------+
|  1076 |           101 | Lowest         | Running |
|  1075 |           101 | Lowest         | Running |
+-------+---------------+----------------+---------+
```

若要顯示超級使用者執行函數 `change_query_priority` 以將優先順序變更為 `CRITICAL` 的結果，請使用下列範例。

```
SELECT CHANGE_QUERY_PRIORITY(1076, 'Critical');
            
+-------------------------------------------------------------------------------+
|                             change_query_priority                             |
+-------------------------------------------------------------------------------+
| Succeeded to change query priority. Priority changed from Lowest to Critical. |
+-------------------------------------------------------------------------------+
```

# CHANGE\$1SESSION\$1PRIORITY
<a name="r_CHANGE_SESSION_PRIORITY"></a>

CHANGE\$1SESSION\$1PRIORITY 讓超級使用者可以立即變更系統中任何工作階段的優先順序。只有一個工作階段、使用者或查詢可以使用優先順序 `CRITICAL` 執行。

## 語法
<a name="r_CHANGE_SESSION_PRIORITY-synopsis"></a>

```
CHANGE_SESSION_PRIORITY(pid, priority)
```

## 引數
<a name="r_CHANGE_SESSION_PRIORITY-argument"></a>

 *pid*   
要變更其優先順序之工作階段的程序識別碼。值 `-1` 表示目前工作階段。需要 `INTEGER` 值。

 *priority*   
要指派給工作階段的新優先順序。這個引數必須是具備 `CRITICAL`、`HIGHEST`、`HIGH`、`NORMAL`、`LOW` 或 `LOWEST` 值的字串。

## 傳回類型
<a name="r_CHANGE_SESSION_PRIORITY-return-type"></a>

無

## 範例
<a name="r_CHANGE_SESSION_PRIORITY-example"></a>

若要傳回處理目前工作階段之伺服器處理程序的程序識別碼，請使用下列範例。

```
SELECT pg_backend_pid();
               
+----------------+
| pg_backend_pid |
+----------------+
|          30311 |
+----------------+
```

在此範例中，將目前工作階段的優先順序變更為 `LOWEST`。

```
SELECT CHANGE_SESSION_PRIORITY(30311, 'Lowest');
               
+---------------------------------------------------------------------------------------+
|                                change_session_priority                                |
+---------------------------------------------------------------------------------------+
| Succeeded to change session priority. Changed session (pid:30311) priority to lowest. |
+---------------------------------------------------------------------------------------+
```

在此範例中，將目前工作階段的優先順序變更為 `HIGH`。

```
SELECT CHANGE_SESSION_PRIORITY(-1, 'High');

+-------------------------------------------------------------------------------------------------+
|                                     change_session_priority                                     |
+-------------------------------------------------------------------------------------------------+
| Succeeded to change session priority. Changed session (pid:30311) priority from lowest to high. |
+-------------------------------------------------------------------------------------------------+
```

若要建立變更工作階段優先順序的預存程序，請使用下列範例。將執行此預存程序的許可授予給資料庫使用者`test_user`。

```
CREATE OR REPLACE PROCEDURE sp_priority_low(pid IN int, result OUT varchar)
AS $$
BEGIN
  SELECT CHANGE_SESSION_PRIORITY(pid, 'low') into result;
END;
$$ LANGUAGE plpgsql
SECURITY DEFINER;
GRANT EXECUTE ON PROCEDURE sp_priority_low(int) TO test_user;
```

接著名為 `test_user` 的資料庫使用者呼叫程序。

```
CALL sp_priority_low(pg_backend_pid()); 

+------------------------------------------------------+
|                        result                        |
+------------------------------------------------------+
| Success. Change session (pid:13155) priority to low. |
+------------------------------------------------------+
```

# CHANGE\$1USER\$1PRIORITY
<a name="r_CHANGE_USER_PRIORITY"></a>

CHANGE\$1USER\$1PRIORITY 可讓超級使用者修改在工作負載管理 (WLM) 中，由某位使用者發出之所有執行或等待中查詢的優先順序。只有一個使用者、工作階段或查詢可以使用優先順序 `CRITICAL` 執行。

## 語法
<a name="r_CHANGE_USER_PRIORITY-synopsis"></a>

```
CHANGE_USER_PRIORITY(user_name, priority)
```

## 引數
<a name="r_CHANGE_USER_PRIORITY-argument"></a>

 *user\$1name*   
要變更其查詢優先順序的資料庫使用者名稱。

 *priority*   
要指派給由 `user_name` 發出之所有查詢的新優先順序。這個引數必須是具備 `CRITICAL`、`HIGHEST`、`HIGH`、`NORMAL`、`LOW`、`LOWEST` 或 `RESET` 值的字串。只有超級使用者才能將優先順序變更為 `CRITICAL`。將優先順序變更為 `RESET`，會移除 `user_name` 的優先順序設定。

## 傳回類型
<a name="r_CHANGE_USER_PRIORITY-return-type"></a>

無

## 範例
<a name="r_CHANGE_USER_PRIORITY-example"></a>

若要將使用者 `analysis_user` 的優先順序變更為 `LOWEST`，請使用下列範例。

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'lowest');

+-------------------------------------------------------------------------------------+
|                                change_user_priority                                 |
+-------------------------------------------------------------------------------------+
| Succeeded to change user priority. Changed user (analysis_user) priority to lowest. |
+-------------------------------------------------------------------------------------+
```

若要將優先順序變更為 `LOW`，請使用下列範例。

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'low');

+----------------------------------------------------------------------------------------------+
|                                     change_user_priority                                     |
+----------------------------------------------------------------------------------------------+
| Succeeded to change user priority. Changed user (analysis_user) priority from Lowest to low. |
+----------------------------------------------------------------------------------------------+
```

若要重設優先順序，請使用下列範例。

```
SELECT CHANGE_USER_PRIORITY('analysis_user', 'reset');

+-------------------------------------------------------+
|                 change_user_priority                  |
+-------------------------------------------------------+
| Succeeded to reset priority for user (analysis_user). |
+-------------------------------------------------------+
```

# CURRENT\$1SETTING
<a name="r_CURRENT_SETTING"></a>

 CURRENT\$1SETTING 傳回指定之組態參數的目前值。

此函數相當於 [SHOW](r_SHOW.md) 命令。

## 語法
<a name="r_CURRENT_SETTING-synopsis"></a>

```
current_setting('parameter')
```

以下陳述式會傳回指定工作階段內容變數的目前值。

```
current_setting('variable_name')
current_setting('variable_name'[, error_if_undefined])
```

## 引數
<a name="r_CURRENT_SETTING-argument"></a>

 *parameter*   
要顯示的參數值。如需組態參數的清單，請參閱[組態參考](cm_chap_ConfigurationRef.md)

 *variable\$1name *   
要顯示的變數名稱。這必須是工作階段內容變數的字串常數。

 *error\$1if\$1undefined*   
(選用) Boolean 值，指定變數名稱不存在時的行為。當 error\$1if\$1undefined 設定為 `TRUE` (這是預設設定)，Amazon Redshift 擲回錯誤。當 error\$1if\$1undefined 設定為 `FALSE`，Amazon Redshift 傳回 `NULL`。Amazon Redshift 僅支援工作階段內容變數的 *error\$1if\$1undefined* 參數。當輸入是組態參數時，不能使用此選項。

## 傳回類型
<a name="r_CURRENT_SETTING-return-type"></a>

傳回 `CHAR` 或 `VARCHAR` 字串。

## 範例
<a name="r_CURRENT_SETTING-example"></a>

若要傳回 `query_group` 參數的目前設定，請使用下列範例。

```
SELECT CURRENT_SETTING('query_group');

+-----------------+
| current_setting |
+-----------------+
| unset           |
+-----------------+
```

若要傳回變數 `app_context.user_id` 的目前設定，請使用下列範例。

```
SELECT CURRENT_SETTING('app_context.user_id', FALSE);
```

# PG\$1CANCEL\$1BACKEND
<a name="PG_CANCEL_BACKEND"></a>

取消查詢。PG\$1CANCEL\$1BACKEND 的功能相當於 [取消](r_CANCEL.md) 命令。您可以取消使用者目前正在執行的查詢。超級使用者可以取消任何查詢。

## 語法
<a name="PG_CANCEL_BACKEND-synopsis"></a>

```
pg_cancel_backend( pid )
```

## 引數
<a name="PG_CANCEL_BACKEND-arguments"></a>

 *pid*   
要取消之查詢的處理程序 ID (PID)。您無法藉由指定查詢 ID 來取消查詢；您必須指定查詢的處理程序 ID。需要 `INTEGER` 值。

## 傳回類型
<a name="PG_CANCEL_BACKEND-return-type"></a>

無

## 使用須知
<a name="PG_CANCEL_BACKEND-usage-notes"></a>

如果有多個工作階段中的查詢在同一資料表上保持鎖定，您可以使用 [PG\$1TERMINATE\$1BACKEND](PG_TERMINATE_BACKEND.md) 函數來終止其中一個工作階段，這樣可強制終止工作階段中任何目前正在執行的交易，以解除所有鎖定並恢復交易。查詢 PG\$1\$1LOCKS 目錄資料表以檢視目前持有的鎖定。如果因為查詢在交易區塊中 (BEGIN … END) 而無法取消查詢，您可以使用 PG\$1TERMINATE\$1BACKEND 函數，以終止查詢執行所在的工作階段。

## 範例
<a name="PG_CANCEL_BACKEND-example"></a>

若要取消目前執行中的查詢，請先擷取您要取消之查詢的處理程序 ID。若要判斷所有目前執行中查詢的處理程序 ID，請執行下列命令。

```
SELECT pid, TRIM(starttime) AS start, 
duration, TRIM(user_name) AS user,
SUBSTRING(query,1,40) AS querytxt
FROM stv_recents
WHERE status = 'Running';

+-----+------------------------+----------+--------+-----------------------------+
| pid |       starttime        | duration |  user  |          querytxt           |
+-----+------------------------+----------+--------+-----------------------------+
| 802 | 2013-10-14 09:19:03.55 |      132 | dwuser | select venuename from venue |
| 834 | 2013-10-14 08:33:49.47 |  1250414 | dwuser | select * from listing;      |
| 964 | 2013-10-14 08:30:43.29 |   326179 | dwuser | select sellerid from sales  |
+-----+------------------------+----------+--------+-----------------------------+
```

若要取消處理程序識別碼為 802 的查詢，請使用下列範例。

```
SELECT PG_CANCEL_BACKEND(802);
```

# PG\$1TERMINATE\$1BACKEND
<a name="PG_TERMINATE_BACKEND"></a>

終止工作階段。您可以終止使用者所擁有的工作階段。超級使用者可以終止任何工作階段。

## 語法
<a name="PG_TERMINATE_BACKEND-synopsis"></a>

```
pg_terminate_backend( pid )
```

## 引數
<a name="PG_TERMINATE_BACKEND-arguments"></a>

*pid*  
要終止之工作階段的處理程序 ID。需要 `INTEGER` 值。

## 傳回類型
<a name="PG_TERMINATE_BACKEND-return-type"></a>

無

## 使用須知
<a name="PG_TERMINATE_BACKEND-usage-notes"></a>

 如果快要接近並行連線數上限，請使用 PG\$1TERMINATE\$1BACKEND 終止閒置工作階段並釋出連線。如需詳細資訊，請參閱 [Amazon Redshift 限制](https://docs.aws.amazon.com/redshift/latest/mgmt/amazon-redshift-limits.html)。

如果有多個工作階段中的查詢在同一資料表上保持鎖定，您可以使用 PG\$1TERMINATE\$1BACKEND 來終止其中一個工作階段，這樣可強制終止工作階段中任何目前正在執行的交易，以解除所有鎖定並恢復交易。查詢 PG\$1\$1LOCKS 目錄資料表以檢視目前持有的鎖定。

如果查詢不在交易區塊中 (BEGIN … END)，您可以使用 [取消](r_CANCEL.md) 命令或 [PG\$1CANCEL\$1BACKEND](PG_CANCEL_BACKEND.md) 函數來取消查詢。

## 範例
<a name="PG_TERMINATE_BACKEND-example"></a>

若要查詢 SVV\$1TRANSACTIONS 資料表來檢視目前交易中生效的所有鎖定，請使用下列範例。

```
SELECT * FROM svv_transactions;

+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
| txn_owner | txn_db |  xid  | pid  |      txn_start      |    lock_mode    | lockable_object_type | relation | granted |
+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |    51940 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |    52000 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | AccessShareLock | relation             |   108623 | true    |
| rsuser    | dev    | 96178 | 8585 | 2017-04-12 20:13:07 | ExclusiveLock   | transactionid        |          | true    |
+-----------+--------+-------+------+---------------------+-----------------+----------------------+----------+---------+
```

若要終止保持鎖定的工作階段，請使用下列範例。

```
SELECT PG_TERMINATE_BACKEND(8585); 
```

# REBOOT\$1CLUSTER
<a name="r_REBOOT_CLUSTER"></a>

重新啟動 Amazon Redshift 叢集，而不關閉與叢集的連線。您必須是資料庫超級使用者才能執行此命令。

完成此軟重新開機之後，Amazon Redshift 叢集會將錯誤傳回給使用者應用程式，並要求使用者應用程式重新提交任何因軟重新開機而中斷的交易或查詢。

## 語法
<a name="r_REBOOT_CLUSTER-synopsis"></a>

```
SELECT REBOOT_CLUSTER();
```

# SET\$1CONFIG
<a name="r_SET_CONFIG"></a>

將組態參數設為新的設定。

 此函數相當於 SQL 中的 SET 命令。

## 語法
<a name="r_SET_CONFIG-synopsis"></a>

```
SET_CONFIG('parameter', 'new_value' , is_local)
```

下列陳述式會將工作階段內容變數設定為新設定。

```
set_config('variable_name', 'new_value' , is_local)
```

## 引數
<a name="r_SET_CONFIG-parameters"></a>

 *parameter*   
要設定的參數。

 *variable\$1name*   
要設定的變數名稱。

 *new\$1value*   
參數的新值。

 *is\$1local*   
若為 true，參數值僅套用至目前交易。有效值為 `true` 或 `1` 及 `false` 或 `0`。

## 傳回類型
<a name="r_SET_CONFIG-return-type"></a>

傳回 `CHAR` 或 `VARCHAR` 字串。

## 範例
<a name="r_SET_CONFIG-examples"></a>

若要僅針對目前交易將 `query_group` 參數的值設為 `test`，請使用下列範例。

```
SELECT SET_CONFIG('query_group', 'test', true);

+------------+
| set_config |
+------------+
| test       |
+------------+
```

若要設定工作階段內容變數，請使用下列範例。

```
SELECT SET_CONFIG(‘app.username’, ‘cuddy’, FALSE);
```

# 系統資訊函數
<a name="r_System_information_functions"></a>

Amazon Redshift 支援許多系統資訊函數。

**Topics**
+ [CURRENT\$1AWS\$1ACCOUNT](r_CURRENT_AWS_ACCOUNT.md)
+ [CURRENT\$1DATABASE](r_CURRENT_DATABASE.md)
+ [CURRENT\$1NAMESPACE](r_CURRENT_NAMESPACE.md)
+ [CURRENT\$1SCHEMA](r_CURRENT_SCHEMA.md)
+ [CURRENT\$1SCHEMAS](r_CURRENT_SCHEMAS.md)
+ [CURRENT\$1SESSION\$1ARN](r_CURRENT_SESSION_ARN.md)
+ [CURRENT\$1USER](r_CURRENT_USER.md)
+ [CURRENT\$1USER\$1ID](r_CURRENT_USER_ID.md)
+ [DEFAULT\$1IAM\$1ROLE](r_DEFAULT_IAM_ROLE.md)
+ [GET\$1MOUNTED\$1ROLE](GET_MOUNTED_ROLE.md)
+ [HAS\$1ASSUMEROLE\$1PRIVILEGE](r_HAS_ASSUMEROLE_PRIVILEGE.md)
+ [HAS\$1DATABASE\$1PRIVILEGE](r_HAS_DATABASE_PRIVILEGE.md)
+ [HAS\$1SCHEMA\$1PRIVILEGE](r_HAS_SCHEMA_PRIVILEGE.md)
+ [HAS\$1TABLE\$1PRIVILEGE](r_HAS_TABLE_PRIVILEGE.md)
+ [LAST\$1USER\$1QUERY\$1ID](LAST_USER_QUERY_ID.md)
+ [PG\$1BACKEND\$1PID](PG_BACKEND_PID.md)
+ [PG\$1GET\$1COLS](PG_GET_COLS.md)
+ [PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE](PG_GET_GRANTEE_BY_IAMROLE.md)
+ [PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER](PG_GET_IAM_ROLE_BY_USER.md)
+ [PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS](PG_GET_LATE_BINDING_VIEW_COLS.md)
+ [PG\$1GET\$1SESSION\$1ROLES](PG_GET_SESSION_ROLES.md)
+ [PG\$1LAST\$1COPY\$1COUNT](PG_LAST_COPY_COUNT.md)
+ [PG\$1LAST\$1COPY\$1ID](PG_LAST_COPY_ID.md)
+ [PG\$1LAST\$1UNLOAD\$1ID](PG_LAST_UNLOAD_ID.md)
+ [PG\$1LAST\$1QUERY\$1ID](PG_LAST_QUERY_ID.md)
+ [PG\$1LAST\$1UNLOAD\$1COUNT](PG_LAST_UNLOAD_COUNT.md)
+ [SLICE\$1NUM 函數](r_SLICE_NUM.md)
+ [USER](r_USER.md)
+ [ROLE\$1IS\$1MEMBER\$1OF](r_ROLE_IS_MEMBER_OF.md)
+ [USER\$1IS\$1MEMBER\$1OF](r_USER_IS_MEMBER_OF.md)
+ [VERSION](r_VERSION.md)

# CURRENT\$1AWS\$1ACCOUNT
<a name="r_CURRENT_AWS_ACCOUNT"></a>

傳回與提交查詢之 Amazon Redshift 叢集相關聯的 AWS 帳戶。

## 語法
<a name="r_CURRENT_AWS_ACCOUNT-synopsis"></a>

```
current_aws_account
```

## 傳回類型
<a name="r_CURRENT_AWS_ACCOUNT-return-type"></a>

傳回整數。

## 範例
<a name="r_CURRENT_AWS_ACCOUNT-example"></a>

下列查詢傳回目前資料庫的名稱。

```
select user, current_aws_account; 
current_user | current_account
-------------+--------------- 
dwuser       | 987654321

(1 row)
```

# CURRENT\$1DATABASE
<a name="r_CURRENT_DATABASE"></a>

傳回您目前連接的資料庫名稱。

## 語法
<a name="r_CURRENT_DATABASE-synopsis"></a>

```
current_database()
```

## 傳回類型
<a name="r_CURRENT_DATABASE-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_CURRENT_DATABASE-example"></a>

下列查詢傳回目前資料庫的名稱。

```
select current_database();

current_database
------------------
tickit
(1 row)
```

# CURRENT\$1NAMESPACE
<a name="r_CURRENT_NAMESPACE"></a>

傳回目前 Amazon Redshift 叢集的叢集命名空間。Amazon Redshift 叢集命名空間是 Amazon Redshift 叢集的唯一 ID。

## 語法
<a name="r_CURRENT_NAMESPACE-synopsis"></a>

```
current_namespace
```

## 傳回類型
<a name="r_CURRENT_NAMESPACE-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_CURRENT_NAMESPACE-example"></a>

下列查詢傳回目前命名空間的名稱。

```
select user, current_namespace; 
current_user | current_namespace
-------------+-------------------------------------
dwuser       | 86b5169f-01dc-4a6f-9fbb-e2e24359e9a8

(1 row)
```

# CURRENT\$1SCHEMA
<a name="r_CURRENT_SCHEMA"></a>

傳回搜尋路徑前面的結構描述名稱。此結構描述將用於建立時未指定目標結構描述的任何資料表或其他具名物件。

## 語法
<a name="r_CURRENT_SCHEMA-synopsis"></a>

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。

```
current_schema()
```

## 傳回類型
<a name="r_CURRENT_SCHEMA-return-type"></a>

CURRENT\$1SCHEMA 傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_CURRENT_SCHEMA-examples"></a>

下列查詢傳回目前結構描述：

```
select current_schema();

current_schema
----------------
public
(1 row)
```

# CURRENT\$1SCHEMAS
<a name="r_CURRENT_SCHEMAS"></a>

傳回目前搜尋路徑中任何結構描述的名稱所構成的陣列。目前搜尋路徑是在 search\$1path 參數中定義。

## 語法
<a name="r_CURRENT_SCHEMAS-synopsis"></a>

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。

```
current_schemas(include_implicit)
```

## 引數
<a name="r_CURRENT_SCHEMAS-argument"></a>

 *include\$1implicit*   
若為 true，表示搜尋路徑應該包含任何隱含包含的系統結構描述。有效值為 `true` 和 `false`。通常，若為 `true`，此參數除了傳回目前的結構描述外，還會傳回 `pg_catalog` 結構描述。

## 傳回類型
<a name="r_CURRENT_SCHEMAS-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_CURRENT_SCHEMAS-examples"></a>

下列範例傳回目前搜尋路俓中的結構描述名稱，但不包括隱含包含的系統結構描述：

```
select current_schemas(false);

current_schemas
-----------------
{public}
(1 row)
```

下列範例傳回目前搜尋路俓中的結構描述名稱，包括隱含包含的系統結構描述：

```
select current_schemas(true);

current_schemas
---------------------
{pg_catalog,public}
(1 row)
```

# CURRENT\$1SESSION\$1ARN
<a name="r_CURRENT_SESSION_ARN"></a>

傳回目前授權的全域使用者的 ARN。全域使用者在 Redshift 帳戶、叢集和 Serverless 工作群組中具有相同的身分。全域使用者透過 IAM Identity Center 或透過 IAM 型工作階段身分驗證登入。資料湖使用者是全域 AWS 使用者。

此函數通常用於使用多方視 AWS Glue 觀表的內容。如需使用 IAM Identity Center 和 Redshift 進行身分管理的詳細資訊，請參閱[將 Redshift 與 IAM Identity Center 連線，為使用者提供單一登入體驗](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-idp-connect.html)。如需多方向 Glue 檢視的詳細資訊[，請在 AWS Glue Data Catalog 中建立檢視](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。

## 語法
<a name="r_CURRENT_SESSION_ARN-synopsis"></a>

```
current_session_arn()
```

## 傳回類型
<a name="r_CURRENT_SESSION_ARN-return-type"></a>

傳回全域驗證使用者的 VARCHAR 字串或 null 值。

## 使用須知
<a name="r_CURRENT_SESSION_ARN-usage"></a>

不支援本機使用者，且會產生 null 回應。

## 範例
<a name="r_CURRENT_SESSION_ARN-example"></a>

下列查詢傳回目前工作階段 ARN 的名稱：

```
SELECT current_session_arn();

current_session_arn
--------------
arn:aws:iam::123456789012:user/user
(1 row)
```

# CURRENT\$1USER
<a name="r_CURRENT_USER"></a>

傳回資料庫的目前「有效」使用者的使用者名稱，適用於檢查權限。通常，此使用者名稱與工作階段使用者相同；不過，超級使用者偶爾會改變這種情況。

**注意**  
呼叫 CURRENT\$1USER 時，請勿使用結尾括號。

## 語法
<a name="r_CURRENT_USER-synopsis"></a>

```
current_user
```

## 傳回類型
<a name="r_CURRENT_USER-return-type"></a>

CURRENT\$1USER 會傳回 NAME 資料類型，並可轉換為 CHAR 或 VARCHAR 字串。

## 使用須知
<a name="r_CURRENT_USER-usage"></a>

如果預存程序是使用 CREATE\$1PROCURCE 命令的 SECURITY DEFINER 選項建立的，則當從預存程序中調用 CURRENT\$1USER 函數時，Amazon Redshift 會傳回預存程序擁有者的使用者名稱。

## 範例
<a name="r_CURRENT_USER-example"></a>

下列查詢傳回目前資料庫使用者的名稱：

```
select current_user;

current_user
--------------
dwuser
(1 row)
```

# CURRENT\$1USER\$1ID
<a name="r_CURRENT_USER_ID"></a>

傳回登入目前工作階段之 Amazon Redshift 使用者的唯一識別碼。

## 語法
<a name="r_CURRENT_USER_ID-synopsis"></a>

```
CURRENT_USER_ID
```

## 傳回類型
<a name="r_CURRENT_USER_ID-return-type"></a>

CURRENT\$1USER\$1ID 函數傳回整數。

## 範例
<a name="r_CURRENT_USER_ID-examples"></a>

下列範例傳回此工作階段的使用者名稱和目前使用者 ID：

```
select user, current_user_id;

 current_user | current_user_id
--------------+-----------------
   dwuser     |               1
(1 row)
```

# DEFAULT\$1IAM\$1ROLE
<a name="r_DEFAULT_IAM_ROLE"></a>

傳回目前與 Amazon Redshift 叢集關聯的預設 IAM 角色。如果沒有任何關聯的預設 IAM 角色，則函數將不傳回任何內容。

## 語法
<a name="r_DEFAULT_IAM_ROLE-synopsis"></a>

```
select default_iam_role();
```

## 傳回類型
<a name="r_DEFAULT_IAM_ROLE-return-type"></a>

傳回 VARCHAR 字串。

## 範例
<a name="r_DEFAULT_IAM_ROLE-example"></a>

下列範例會傳回目前與指定的 Amazon Redshift 叢集關聯的預設 IAM 角色，

```
select default_iam_role();
              default_iam_role
-----------------------------------------------
 arn:aws:iam::123456789012:role/myRedshiftRole
(1 row)
```

# GET\$1MOUNTED\$1ROLE
<a name="GET_MOUNTED_ROLE"></a>

 做為多方向 AWS Glue 檢視的一部分調用時，它允許傳回用於掛載 Lake Formation 結構描述或資料庫的 IAM 角色。多方言是指，有多種查詢引擎支援 SQL，例如 Amazon EMR 和 Redshift。如需多方向 Glue 檢視的詳細資訊，請參閱 [AWS Glue Data Catalog 中的建立檢視](https://docs.aws.amazon.com/redshift/latest/dg/data-catalog-views-overview.html)。



## 語法
<a name="GET_MOUNTED_ROLE-synopsis"></a>

```
get_mounted_role()
```

## 傳回類型
<a name="GET_MOUNTED_ROLE-return-type"></a>

傳回 VARCHAR 字串或 null 值。

## 使用須知
<a name="GET_MOUNTED_ROLE-usage"></a>

此函數會針對外部 Lake Formation 檢視以外的任何使用案例傳回 null。

## 範例
<a name="GET_MOUNTED_ROLE-example"></a>

下列查詢會傳回用來掛載 Lake Formation 資源的身分。

```
CREATE EXTERNAL PROTECTED VIEW external_schema.remote_view AS 
SELECT mycol, get_mounted_role() FROM external_schema.remote_table;

mycol | get_mounted_role
----------------------------
1       arn:aws:iam::123456789012:role/salesrole
(1 row)
```

# HAS\$1ASSUMEROLE\$1PRIVILEGE
<a name="r_HAS_ASSUMEROLE_PRIVILEGE"></a>

如果指定的使用者具有具有執行指定命令之權限的指定 IAM 角色，則傳回布林值 `true` (`t`)。如果使用者不具有執行指定命令之權限的指定 IAM 角色，則函數會傳回 `false` (`f`)。如需權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

## 語法
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-synopsis"></a>

```
has_assumerole_privilege( [ user, ] iam_role_arn, cmd_type)
```

## 引數
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-arguments"></a>

 *使用者*   
要檢查 IAM 角色權限的使用者名稱。預設值是檢查目前使用者。超級使用者和使用者可以使用此函數。不過，使用者只能檢視自己的權限。

 *iam\$1role\$1arn*   
已被授與命令權限的 IAM 角色。

 *cmd\$1type*   
已授與存取權的命令。有效值如下：  
+ COPY
+ UNLOAD
+ 外部函數
+ 建立模型

## 傳回類型
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-return-type"></a>

BOOLEAN

## 範例
<a name="r_HAS_ASSUMEROLE_PRIVILEGE-example"></a>

下列查詢會確認使用者 `reg_user1` 具有執行 COPY 命令之 `Redshift-S3-Read` 角色的權限。

```
select has_assumerole_privilege('reg_user1', 'arn:aws:iam::123456789012:role/Redshift-S3-Read', 'copy');
```

```
has_assumerole_privilege
------------------------
true
(1 row)
```

# HAS\$1DATABASE\$1PRIVILEGE
<a name="r_HAS_DATABASE_PRIVILEGE"></a>

如果使用者具有指定之資料庫的指定權限，則傳回 `true`。如需權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

## 語法
<a name="r_HAS_DATABASE_PRIVILEGE-synopsis"></a>

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。

```
has_database_privilege( [ user, ] database, privilege)
```

## 引數
<a name="r_HAS_DATABASE_PRIVILEGE-arguments"></a>

 *使用者*   
要檢查資料庫權限的使用者名稱。預設值是檢查目前使用者。

 *資料庫*   
與權限相關聯的資料庫。

 *privilege*   
要檢查的權限。有效值如下：  
+ CREATE
+ TEMPORARY
+ TEMP

## 傳回類型
<a name="r_HAS_DATABASE_PRIVILEGE-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_HAS_DATABASE_PRIVILEGE-example"></a>

下列查詢確認 GUEST 使用者在 TICKIT 資料庫上具有 TEMP 權限：

```
select has_database_privilege('guest', 'tickit', 'temp');

has_database_privilege
------------------------
true
(1 row)
```

# HAS\$1SCHEMA\$1PRIVILEGE
<a name="r_HAS_SCHEMA_PRIVILEGE"></a>

如果使用者具有指定之結構描述的指定權限，則傳回 `true`。如需權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

## 語法
<a name="r_HAS_SCHEMA_PRIVILEGE-synopsis"></a>

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。

```
has_schema_privilege( [ user, ] schema, privilege)
```

## 引數
<a name="r_HAS_SCHEMA_PRIVILEGE-arguments"></a>

 *使用者*   
要檢查結構描述權限的使用者名稱。預設值是檢查目前使用者。

 *結構描述*   
與權限相關聯的結構描述。

 *privilege*   
要檢查的權限。有效值如下：  
+ CREATE
+ USAGE
+ ALTER
+ DROP

## 傳回類型
<a name="r_HAS_SCHEMA_PRIVILEGE-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_HAS_SCHEMA_PRIVILEGE-example"></a>

下列查詢確認 GUEST 使用者在 PUBLIC 結構描述上具有 CREATE 權限：

```
select has_schema_privilege('guest', 'public', 'create');

has_schema_privilege
----------------------
true
(1 row)
```

# HAS\$1TABLE\$1PRIVILEGE
<a name="r_HAS_TABLE_PRIVILEGE"></a>

如果使用者具有指定之資料表的指定權限，則傳回 `true`，否則傳回 `false`。

## 語法
<a name="r_HAS_TABLE_PRIVILEGE-synopsis"></a>

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。如需權限的相關資訊，請參閱 [GRANT](r_GRANT.md)。

```
has_table_privilege( [ user, ] table, privilege)
```

## 引數
<a name="r_HAS_TABLE_PRIVILEGE-arguments"></a>

 *使用者*   
要檢查資料表權限的使用者名稱。預設值是檢查目前使用者。

 *資料表*   
與權限相關聯的資料表。

 *privilege*   
要檢查的權限。有效值如下：  
+ SELECT
+ INSERT
+ UPDATE
+ DELETE
+ DROP
+ REFERENCES

## 傳回類型
<a name="r_HAS_TABLE_PRIVILEGE-return-type"></a>

BOOLEAN

## 範例
<a name="r_HAS_TABLE_PRIVILEGE-examples"></a>

下列查詢發現 GUEST 使用者在 LISTING 資料表上沒有 SELECT 權限。

```
select has_table_privilege('guest', 'listing', 'select');

has_table_privilege
---------------------
false
```

下列查詢會使用 pg\$1tables 和 pg\$1user 目錄資料表的輸出，列出資料表權限，包括選取、插入、更新和刪除。這只是範例。您可能必須從資料庫中指定結構描述名稱和資料表名稱。如需詳細資訊，請參閱[查詢目錄資料表](c_join_PG.md)。

```
SELECT 
     tablename
     ,usename
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'select') AS sel
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'insert') AS ins
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'update') AS upd
     ,HAS_TABLE_PRIVILEGE(users.usename, tablename, 'delete') AS del
FROM
(SELECT * from pg_tables
WHERE schemaname = 'public' and tablename in ('event','listing')) as tables
,(SELECT * FROM pg_user) AS users;

tablename | usename   |  sel   |  ins  |  upd  | del
----------+-----------+--------+-------+-------+-------
event     |  john     |  true  | true  | true  | true	
event     |  sally    |  false | false | false | false	
event     |  elsa     |  false | false | false | false	
listing   |  john     |  true  | true  | true  | true	
listing   |  sally    |  false | false | false | false	
listing   |  elsa     |  false | false | false | false
```

先前的查詢也包含交叉聯結。如需詳細資訊，請參閱[JOIN 範例](r_Join_examples.md)。若要查詢不在 `public` 結構描述中的資料表，請從 WHERE 子句中移除 `schemaname` 條件，並在查詢之前使用下列範例。

```
SET SEARCH_PATH to 'schema_name';
```

# LAST\$1USER\$1QUERY\$1ID
<a name="LAST_USER_QUERY_ID"></a>

傳回目前工作階段中最近完成的使用者查詢的查詢 ID。如果目前工作階段中未執行任何查詢，last\$1user\$1query\$1id 會傳回 -1。此函數不會傳回僅在引線節點上執行之查詢的查詢 ID。如需詳細資訊，請參閱[僅限領導節點函數](c_SQL_functions_leader_node_only.md)。

## 語法
<a name="LAST_USER_QUERY_ID-synopsis"></a>

```
last_user_query_id()
```

## 傳回類型
<a name="LAST_USER_QUERY_ID-return-type"></a>

傳回整數。

## 範例
<a name="LAST_USER_QUERY_ID-example"></a>

下列查詢傳回在目前工作階段中完成的使用者最後一個執行查詢的 ID。

```
select last_user_query_id();
```

結果如下。

```
last_user_query_id
-----------------------
    5437
(1 row)
```

下列查詢傳回使用者在目前工作階段中執行的最近完成之查詢的查詢 ID 和文字。

```
select query_id, query_text from sys_query_history where query_id = last_user_query_id();
```

結果如下。

```
 query_id, query_text
---------+-------------------------------------------------------------------------------------------------------------
 5556975 | select last_user_query_id() limit 100 --RequestID=<unique request ID>; TraceID=<unique trace ID>
```

# PG\$1BACKEND\$1PID
<a name="PG_BACKEND_PID"></a>

傳回處理目前工作階段之伺服器處理程序的處理程序 ID (PID)。

**注意**  
PID 不是全域唯一。可隨著時間而重複使用。

## 語法
<a name="PG_BACKEND_PID-synopsis"></a>

```
pg_backend_pid()
```

## 傳回類型
<a name="PG_BACKEND_PID-return-type"></a>

傳回整數。

## 範例
<a name="PG_BACKEND_PID-example"></a>

您可以使 PG\$1BACKEND\$1PID 與日誌資料表相互關聯，以擷取目前工作階段的資訊。例如，下列查詢會針對目前工作階段中完成的查詢傳回其查詢 ID 和一部分的查詢文字。

```
select query, substring(text,1,40)
from stl_querytext
where pid =  PG_BACKEND_PID()
order by query desc;

 query |                substring
-------+------------------------------------------
 14831 | select query, substring(text,1,40) from
 14827 | select query, substring(path,0,80) as pa
 14826 | copy category from 's3://dw-tickit/manif
 14825 | Count rows in target table
 14824 | unload ('select * from category') to 's3
(5 rows)
```

您可以使 PG\$1BACKEND\$1PID 與下列日誌資料表中的 pid 欄相互關聯 (例外以括號註明)：
+ [STL\$1CONNECTION\$1LOG](r_STL_CONNECTION_LOG.md)
+ [STL\$1DDLTEXT](r_STL_DDLTEXT.md)
+ [STL\$1ERROR](r_STL_ERROR.md)
+ [STL\$1QUERY](r_STL_QUERY.md)
+ [STL\$1QUERYTEXT](r_STL_QUERYTEXT.md)
+ [STL\$1SESSIONS](r_STL_SESSIONS.md) (process)
+ [STL\$1TR\$1CONFLICT](r_STL_TR_CONFLICT.md)
+ [STL\$1UTILITYTEXT](r_STL_UTILITYTEXT.md)
+ [STV\$1ACTIVE\$1CURSORS](r_STV_ACTIVE_CURSORS.md)
+ [STV\$1INFLIGHT](r_STV_INFLIGHT.md)
+ [STV\$1LOCKS](r_STV_LOCKS.md) (lock\$1owner\$1pid)
+ [STV\$1RECENTS](r_STV_RECENTS.md) (process\$1id)

# PG\$1GET\$1COLS
<a name="PG_GET_COLS"></a>

傳回資料表或檢視定義的欄中繼資料。

## 語法
<a name="PG_GET_COLS-synopsis"></a>

```
pg_get_cols('name')
```

## 引數
<a name="PG_GET_COLS-arguments"></a>

 *name*   
Amazon Redshift 資料表或檢視的名稱。如需詳細資訊，請參閱[名稱與識別碼](r_names.md)。

## 傳回類型
<a name="PG_GET_COLS-return-type"></a>

VARCHAR 

## 使用須知
<a name="PG_GET_COLS-usage-notes"></a>

PG\$1GET\$1COLS 函數針對資料表或檢視定義中的每一欄，各傳回一列。列包含結構描述名稱、關係名稱、欄名稱、資料類型及欄號的逗號分隔清單。SQL 結果的格式取決於使用的 SQL 用戶端。

## 範例
<a name="PG_GET_COLS-example"></a>

下列範例會傳回結構描述 `public` 中名為 `SALES_VW` 之檢視的結果，以及使用者在連線資料庫 `dev` 中建立的結構描述 `mytickit1` 中名為 `sales` 之資料表的結果。

下列範例傳回名為 `SALES_VW` 之檢視的欄中繼資料。

```
select pg_get_cols('sales_vw');

pg_get_cols                                                
-----------------------------------------------------------
(public,sales_vw,salesid,integer,1)                        
(public,sales_vw,listid,integer,2)                         
(public,sales_vw,sellerid,integer,3)                       
(public,sales_vw,buyerid,integer,4)                        
(public,sales_vw,eventid,integer,5)                        
(public,sales_vw,dateid,smallint,6)                        
(public,sales_vw,qtysold,smallint,7)                       
(public,sales_vw,pricepaid,"numeric(8,2)",8)               
(public,sales_vw,commission,"numeric(8,2)",9)              
(public,sales_vw,saletime,"timestamp without time zone",10)
```

下列範例以資料表格式傳回 `SALES_VW` 檢視的欄中繼資料。

```
select * from pg_get_cols('sales_vw') 
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);

view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
public      | sales_vw  | salesid    | integer                     |       1
public      | sales_vw  | listid     | integer                     |       2
public      | sales_vw  | sellerid   | integer                     |       3
public      | sales_vw  | buyerid    | integer                     |       4
public      | sales_vw  | eventid    | integer                     |       5
public      | sales_vw  | dateid     | smallint                    |       6
public      | sales_vw  | qtysold    | smallint                    |       7
public      | sales_vw  | pricepaid  | numeric(8,2)                |       8
public      | sales_vw  | commission | numeric(8,2)                |       9
public      | sales_vw  | saletime   | timestamp without time zone |      10
```

下列範例以資料表格式傳回結構描述 `mytickit1` 中 `SALES` 資料表的欄中繼資料。

```
select * from pg_get_cols('"mytickit1"."sales"') 
cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);

view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
mytickit1   | sales     | salesid    | integer                     |       1
mytickit1   | sales     | listid     | integer                     |       2
mytickit1   | sales     | sellerid   | integer                     |       3
mytickit1   | sales     | buyerid    | integer                     |       4
mytickit1   | sales     | eventid    | integer                     |       5
mytickit1   | sales     | dateid     | smallint                    |       6
mytickit1   | sales     | qtysold    | smallint                    |       7
mytickit1   | sales     | pricepaid  | numeric(8,2)                |       8
mytickit1   | sales     | commission | numeric(8,2)                |       9
mytickit1   | sales     | saletime   | timestamp without time zone |      10
```

# PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE
<a name="PG_GET_GRANTEE_BY_IAMROLE"></a>

傳回授與指定 IAM 角色的所有使用者和群組。

## 語法
<a name="PG_GET_GRANTEE_BY_IAMROLE-synopsis"></a>

```
pg_get_grantee_by_iam_role('iam_role_arn')
```

## 引數
<a name="PG_GET_GRANTEE_BY_IAMROLE-arguments"></a>

 *iam\$1role\$1arn*   
要傳回被授與此角色之使用者和群組的 IAM 角色。

## 傳回類型
<a name="PG_GET_GRANTEE_BY_IAMROLE-return-type"></a>

VARCHAR 

## 使用須知
<a name="PG_GET_GRANTEE_BY_IAMROLE-usage-notes"></a>

PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE 函數為每個使用者或群組傳回一列。每一列都包含承授者名稱、承授者類型和授與的權限。承授者類型的可能值為 `p` (代表公用)、`u` (代表使用者) 和 `g` (代表群組)。

您必須是超級使用者才能使用此函數。

## 範例
<a name="PG_GET_GRANTEE_BY_IAMROLE-example"></a>

下列範例指出 IAM 角色 `Redshift-S3-Write` 已授與 `group1` 和 `reg_user1`。`group_1` 中的使用者只能指定 COPY 作業的角色，而使用者 `reg_user1` 只能指定角色來執行 UNLOAD 作業。

```
select pg_get_grantee_by_iam_role('arn:aws:iam::123456789012:role/Redshift-S3-Write');
```

```
  pg_get_grantee_by_iam_role
-----------------------------
 (group_1,g,COPY)
 (reg_user1,u,UNLOAD)
```

下列 PG\$1GET\$1GRANTEE\$1BY\$1IAM\$1ROLE 函數範例將結果格式化為表格。

```
select grantee, grantee_type, cmd_type FROM pg_get_grantee_by_iam_role('arn:aws:iam::123456789012:role/Redshift-S3-Write') res_grantee(grantee text, grantee_type text, cmd_type text) ORDER BY 1,2,3;
```

```
  grantee  | grantee_type | cmd_type
-----------+--------------+----------
 group_1   | g            | COPY
 reg_user1 | u            | UNLOAD
```

# PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER
<a name="PG_GET_IAM_ROLE_BY_USER"></a>

傳回授與使用者的所有 IAM 角色和命令權限。

## 語法
<a name="PG_GET_IAM_ROLE_BY_USER-synopsis"></a>

```
pg_get_iam_role_by_user('name')
```

## 引數
<a name="PG_GET_IAM_ROLE_BY_USER-arguments"></a>

 *name*   
要傳回 IAM 角色的使用者名稱。

## 傳回類型
<a name="PG_GET_IAM_ROLE_BY_USER-return-type"></a>

VARCHAR 

## 使用須知
<a name="PG_GET_IAM_ROLE_BY_USER-usage-notes"></a>

PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER 函數會針對每組角色和命令權限傳回一行。此資料列包含以逗號分隔清單，其中包含使用者名稱、IAM 角色和命令。

結果中的 `default` 值表示使用者可以指定任何可用的角色來執行顯示的命令。

您必須是超級使用者才能使用此函數。

## 範例
<a name="PG_GET_IAM_ROLE_BY_USER-example"></a>

下列範例指出使用者 `reg_user1` 可以指定任何可用的 IAM 角色來執行 COPY 作業。使用者也可以指定 UNLOAD 作業的 `Redshift-S3-Write` 角色。

```
select pg_get_iam_role_by_user('reg_user1');
```

```
                             pg_get_iam_role_by_user
---------------------------------------------------------------------------------
 (reg_user1,default,COPY)
 (reg_user1,arn:aws:iam::123456789012:role/Redshift-S3-Write,COPY|UNLOAD)
```

下列 PG\$1GET\$1IAM\$1ROLE\$1BY\$1USER 函數範例將結果格式化為表格。

```
select username, iam_role, cmd FROM pg_get_iam_role_by_user('reg_user1') res_iam_role(username text, iam_role text, cmd text);
```

```
 username  |                    iam_role                     | cmd
-----------+-------------------------------------------------+------
 reg_user1 | default                                         | None
 reg_user1 | arn:aws:iam::123456789012:role/Redshift-S3-Read | COPY
```

# PG\$1GET\$1LATE\$1BINDING\$1VIEW\$1COLS
<a name="PG_GET_LATE_BINDING_VIEW_COLS"></a>

傳回資料庫中所有近期繫結檢視的欄中繼資料。如需詳細資訊，請參閱[近期繫結檢視](r_CREATE_VIEW.md#r_CREATE_VIEW_late-binding-views)

## 語法
<a name="PG_GET_LATE_BINDING_VIEW_COLS-synopsis"></a>

```
pg_get_late_binding_view_cols()
```

## 傳回類型
<a name="PG_GET_LATE_BINDING_VIEW_COLS-return-type"></a>

VARCHAR 

## 使用須知
<a name="PG_GET_LATE_BINDING_VIEW_COLS-usage-notes"></a>

`PG_GET_LATE_BINDING_VIEW_COLS` 函數針對近期繫結檢視中的每一欄，各傳回一列。列包含結構描述名稱、關係名稱、欄名稱、資料類型及欄號的逗號分隔清單。

## 範例
<a name="PG_GET_LATE_BINDING_VIEW_COLS-example"></a>

下列範例傳回所有近期繫結檢視的欄中繼資料。

```
select pg_get_late_binding_view_cols();

pg_get_late_binding_view_cols                               
------------------------------------------------------------
(public,myevent,eventname,"character varying(200)",1)       
(public,sales_lbv,salesid,integer,1)                        
(public,sales_lbv,listid,integer,2)                         
(public,sales_lbv,sellerid,integer,3)                       
(public,sales_lbv,buyerid,integer,4)                        
(public,sales_lbv,eventid,integer,5)                        
(public,sales_lbv,dateid,smallint,6)                        
(public,sales_lbv,qtysold,smallint,7)                       
(public,sales_lbv,pricepaid,"numeric(8,2)",8)               
(public,sales_lbv,commission,"numeric(8,2)",9)              
(public,sales_lbv,saletime,"timestamp without time zone",10)
(public,event_lbv,eventid,integer,1)                        
(public,event_lbv,venueid,smallint,2)                       
(public,event_lbv,catid,smallint,3)                         
(public,event_lbv,dateid,smallint,4)                        
(public,event_lbv,eventname,"character varying(200)",5)     
(public,event_lbv,starttime,"timestamp without time zone",6)
```

下列範例以資料表格式傳回所有近期繫結檢視的欄中繼資料。

```
select * from pg_get_late_binding_view_cols() cols(view_schema name, view_name name, col_name name, col_type varchar, col_num int);
view_schema | view_name | col_name   | col_type                    | col_num
------------+-----------+------------+-----------------------------+--------
public      | sales_lbv | salesid    | integer                     |       1
public      | sales_lbv | listid     | integer                     |       2
public      | sales_lbv | sellerid   | integer                     |       3
public      | sales_lbv | buyerid    | integer                     |       4
public      | sales_lbv | eventid    | integer                     |       5
public      | sales_lbv | dateid     | smallint                    |       6
public      | sales_lbv | qtysold    | smallint                    |       7
public      | sales_lbv | pricepaid  | numeric(8,2)                |       8
public      | sales_lbv | commission | numeric(8,2)                |       9
public      | sales_lbv | saletime   | timestamp without time zone |      10
public      | event_lbv | eventid    | integer                     |       1
public      | event_lbv | venueid    | smallint                    |       2
public      | event_lbv | catid      | smallint                    |       3
public      | event_lbv | dateid     | smallint                    |       4
public      | event_lbv | eventname  | character varying(200)      |       5
public      | event_lbv | starttime  | timestamp without time zone |       6
```

# PG\$1GET\$1SESSION\$1ROLES
<a name="PG_GET_SESSION_ROLES"></a>

傳回目前登入使用者的工作階段角色。使用者的工作階段角色是由身分提供者 (IdP) 為登入使用者定義的群組。例如，[Microsoft Azure Active Directory (Azure AD)](https://azure.microsoft.com/en-us/services/active-directory/) 等身分提供者 (IdP) 會驗證使用者的身分，並在使用者登入程序期間提供使用者所屬的任何外部群組。這些外部群組會轉換為 Amazon Redshift 角色，並可在目前的工作階段期間使用。這些角色稱為工作階段角色。管理員可以授與工作階段角色類似其他 Amazon Redshift 角色的權限。如需使用角色的詳細資訊，請參閱[角色型存取控制 (RBAC)](t_Roles.md)。如需使用身分提供者 (IdP) 管理身分的相關資訊，請參閱《Amazon Redshift 管理指南》**中的[適用於 Amazon Redshift 的原生身分提供者 (IdP) 聯合](https://docs.aws.amazon.com/redshift/latest/mgmt/redshift-iam-access-control-native-idp.html)。

若要檢視 Amazon Redshift 目錄中定義的角色，請查詢系統檢視 [SVV\$1ROLES](r_SVV_ROLES.md)。

## 語法
<a name="PG_GET_LATE_BINDING_VIEW_COLS-synopsis"></a>

```
pg_get_session_roles()
```

## 傳回類型
<a name="PG_GET_SESSION_ROLES-return-type"></a>

由兩個值組成的一組列。第一個值有兩個部分，由冒號 (:) 分隔，其中包含 `idp-namespace:role-name`。`idp-namespace` 是身分提供者 (IdP) 的命名空間。`role-name` 是身分提供者 (IdP) 中外部群組的名稱。第二個值包含 `role-id`，這是角色識別碼。

## 使用須知
<a name="PG_GET_SESSION_ROLES-usage-notes"></a>

`PG_GET_SESSION_ROLES` 函數會針對每個傳回的工作階段角色傳回一列。

## 範例
<a name="PG_GET_SESSION_ROLES-example"></a>

下列範例會針對 Azure Active Directory IdP 中的每個角色傳回一個資料列。傳回的資料欄會轉換為 `sess_roles`，具有欄 `name` 和 `roleid`。每個 `name` 都包含 Azure Active Directory 命名空間和 Azure Active Directory 中的群組名稱。

```
SELECT * FROM pg_get_session_roles() AS sess_roles(name name, roleid integer);

name                  roleid
--------------------------------
my_aad:test_group_1   106204
my_aad:test_group_2   106205
my_aad:test_group_3   106206
my_aad:test_group_4   106207
my_aad:test_group_5   106208
```

下列範例會針對目前登入的 IAM 使用者所屬的每個 IAM 群組，傳回一個資料列。傳回的資料欄會轉換為 `sess_roles`，具有欄 `name` 和 `roleid`。每個 `name` 都包含 IAM 命名空間和 IAM 群組名稱。

```
SELECT * FROM pg_get_session_roles() AS sess_roles(name name, roleid integer);

name                  roleid
--------------------------------
IAM:myGroup           110332
```

# PG\$1LAST\$1COPY\$1COUNT
<a name="PG_LAST_COPY_COUNT"></a>

傳回目前工作階段中執行的最後一個 COPY 命令所載入的列數。PG\$1LAST\$1COPY\$1COUNT 會更新為最後一個 COPY ID，這是啟動載入程序的最後一個 COPY 的查詢 ID (即使載入失敗也一樣)。當 COPY 命令啟動載入程序時，查詢 ID 和 COPY ID 會更新。

如果 COPY 因為語法錯誤或權限不足而失敗，COPY ID 不會更新，PG\$1LAST\$1COPY\$1COUNT 會傳回上一個 COPY 的計數。如果目前工作階段中未執行任何 COPY 命令，或最後一個 COPY 在載入期間失敗，PG\$1LAST\$1COPY\$1COUNT 會傳回 0。如需詳細資訊，請參閱[PG\$1LAST\$1COPY\$1ID](PG_LAST_COPY_ID.md)。

## 語法
<a name="PG_LAST_COPY_COUNT-synopsis"></a>

```
pg_last_copy_count()
```

## 傳回類型
<a name="PG_LAST_COPY_COUNT-return-type"></a>

傳回 BIGINT。

## 範例
<a name="PG_LAST_COPY_COUNT-example"></a>

下列查詢傳回目前工作階段中最後一個 COPY 命令所載入的列數。

```
select pg_last_copy_count();

pg_last_copy_count
--------------------
             192497
(1 row)
```

# PG\$1LAST\$1COPY\$1ID
<a name="PG_LAST_COPY_ID"></a>

傳回目前工作階段中最近完成之 COPY 命令的查詢 ID。如果目前工作階段中未執行任何 COPY 命令，PG\$1LAST\$1COPY\$1ID 會傳回 -1。

 當 COPY 命令啟動載入程序時，PG\$1LAST\$1COPY\$1ID 的值會更新。如果 COPY 因為載入資料無效而失敗，COPY ID 會更新，因此您可以在查詢 STL\$1LOAD\$1ERRORS 資料表時使用 PG\$1LAST\$1COPY\$1ID。如果 COPY 交易還原，COPY ID 不會更新。

如果 COPY 命令因為載入程序開始之前發生的錯誤而失敗，例如語法錯誤、存取錯誤、登入資料無效或權限不足，COPY ID 不會更新。如果 COPY 在分析壓縮步驟 (成功連線之後開始，但在資料載入之前) 期間失敗，COPY ID 不會更新。

## 語法
<a name="PG_LAST_COPY_ID-synopsis"></a>

```
pg_last_copy_id()
```

## 傳回類型
<a name="PG_LAST_COPY_ID-return-type"></a>

傳回整數。

## 範例
<a name="PG_LAST_COPY_ID-example"></a>

下列查詢傳回目前工作階段中最後一個 COPY 命令的查詢 ID。

```
select pg_last_copy_id();

pg_last_copy_id
---------------
          5437
(1 row)
```

下列查詢會將 STL\$1LOAD\$1ERRORS 聯結至 STL\$1LOADERROR\$1DETAIL，以檢視目前工作階段中最近載入期間發生之錯誤的詳細資訊：

```
select d.query, substring(d.filename,14,20), 
d.line_number as line, 
substring(d.value,1,16) as value,
substring(le.err_reason,1,48) as err_reason
from stl_loaderror_detail d, stl_load_errors le
where d.query = le.query
and d.query = pg_last_copy_id(); 

 query |    substring      | line |  value   |                    err_reason
-------+-------------------+------+----------+-------------------------------------------------
    558| allusers_pipe.txt |  251 | 251      | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | ZRU29FGR | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | Kaitlin  | String contains invalid or unsupported UTF8 code
    558| allusers_pipe.txt |  251 | Walter   | String contains invalid or unsupported UTF8 code
```

# PG\$1LAST\$1UNLOAD\$1ID
<a name="PG_LAST_UNLOAD_ID"></a>

傳回目前工作階段中最近完成之 UNLOAD 命令的查詢 ID。如果目前工作階段中未執行任何 UNLOAD 命令，PG\$1LAST\$1UNLOAD\$1ID 會傳回 -1。

 當 UNLOAD 命令啟動載入程序時，PG\$1LAST\$1UNLOAD\$1ID 的值會更新。如果 UNLOAD 因為載入資料無效而失敗，UNLOAD ID 會更新，所以您可以使用 UNLOAD ID 來進一步調查。如果 UNLOAD 交易還原，UNLOAD ID 不會更新。

如果 UNLOAD 命令因為載入程序開始之前發生的錯誤而失敗，例如語法錯誤、存取錯誤、登入資料無效或權限不足，UNLOAD ID 不會更新。

## 語法
<a name="PG_LAST_UNLOAD_ID-synopsis"></a>

```
PG_LAST_UNLOAD_ID()
```

## 傳回類型
<a name="PG_LAST_UNLOAD_ID-return-type"></a>

傳回整數。

## 範例
<a name="PG_LAST_UNLOAD_ID-example"></a>

下列查詢傳回目前工作階段中最後一個 UNLOAD 命令的查詢 ID。

```
select PG_LAST_UNLOAD_ID();

PG_LAST_UNLOAD_ID
---------------
          5437
(1 row)
```

# PG\$1LAST\$1QUERY\$1ID
<a name="PG_LAST_QUERY_ID"></a>

傳回目前工作階段中最近完成之查詢的查詢 ID。如果目前工作階段中未執行任何查詢，PG\$1LAST\$1QUERY\$1ID 會傳回 -1。PG\$1LAST\$1QUERY\$1ID 不傳回只在領導者節點上執行之查詢的查詢 ID。如需詳細資訊，請參閱[僅限領導節點函數](c_SQL_functions_leader_node_only.md)。

## 語法
<a name="PG_LAST_QUERY_ID-synopsis"></a>

```
pg_last_query_id()
```

## 傳回類型
<a name="PG_LAST_QUERY_ID-return-type"></a>

傳回整數。

## 範例
<a name="PG_LAST_QUERY_ID-example"></a>

下列查詢傳回目前工作階段中完成的最後一個查詢的 ID。

```
select pg_last_query_id();
```

結果如下。

```
pg_last_query_id
----------------
           5437
(1 row)
```

下列查詢傳回目前工作階段中最近完成之查詢的查詢 ID 和文字。

```
select query, trim(querytxt) as sqlquery
from stl_query
where query = pg_last_query_id();
```

結果如下。

```
query | sqlquery
------+--------------------------------------------------
 5437 | select name, loadtime from stl_file_scan where loadtime > 1000000;
(1 rows)
```

# PG\$1LAST\$1UNLOAD\$1COUNT
<a name="PG_LAST_UNLOAD_COUNT"></a>

傳回目前工作階段中完成的最後一個 UNLOAD 命令所卸載的列數。PG\$1LAST\$1UNLOAD\$1COUNT 會更新為最後一個 UNLOAD 的查詢 ID，即使操作失敗也一樣。UNLOAD 完成時，查詢 ID 會更新。如果 UNLOAD 因為語法錯誤或權限不足而失敗，PG\$1LAST\$1UNLOAD\$1COUNT 會傳回上一個 UNLOAD 的計數。如果目前工作階段中未完成任何 UNLOAD 命令，或最後一個 UNLOAD 在卸載操作期間失敗，PG\$1LAST\$1UNLOAD\$1COUNT 會傳回 0。

## 語法
<a name="PG_LAST_UNLOAD_COUNT-synopsis"></a>

```
pg_last_unload_count()
```

## 傳回類型
<a name="PG_LAST_UNLOAD_COUNT-return-type"></a>

傳回 BIGINT。

## 範例
<a name="PG_LAST_UNLOAD_COUNT-example"></a>

下列查詢傳回目前工作階段中最後一個 UNLOAD 命令所卸載的列數。

```
select pg_last_unload_count();

pg_last_unload_count
--------------------
             192497
(1 row)
```

# SLICE\$1NUM 函數
<a name="r_SLICE_NUM"></a>

傳回整數，對應於列的資料在叢集內所在的配量編號。SLICE\$1NUM 不接受參數。

## 語法
<a name="r_SLICE_NUM-syntax"></a>

```
SLICE_NUM()
```

## 傳回類型
<a name="r_SLICE_NUM-return-type"></a>

SLICE\$1NUM 函數傳回整數。

## 範例
<a name="r_SLICE_NUM-examples"></a>

下列範例顯示 EVENT 資料表的前十個 EVENT 列有哪些配量包含資料：

```
select distinct eventid, slice_num() from event order by eventid limit 10;

 eventid | slice_num
---------+-----------
       1 |         1
       2 |         2
       3 |         3
       4 |         0
       5 |         1
       6 |         2
       7 |         3
       8 |         0
       9 |         1
      10 |         2
(10 rows)
```

下列範例傳回代碼 (10000)，表示不含 FROM 陳述式的查詢在領導者節點上執行：

```
select slice_num();
slice_num
-----------
10000
(1 row)
```

# USER
<a name="r_USER"></a>

CURRENT\$1USER 的同義詞。請參閱 [CURRENT\$1USER](r_CURRENT_USER.md)。

# ROLE\$1IS\$1MEMBER\$1OF
<a name="r_ROLE_IS_MEMBER_OF"></a>

如果角色是另一個角色的成員，則傳回 true。超級使用者可以檢查所有角色的成員資格。具有 ACCESS SYSTEM TABLE 許可的普通使用者可以檢查所有使用者的成員資格。否則，一般使用者只能檢查他們有權存取的角色。如果提供的角色不存在或目前使用者無法存取該角色，Amazon Redshift 就會發生錯誤。

**資料共用考量**

當取用者叢集查詢參考此函數的共用物件時，例如檢視、RDS 政策或 DDM 政策，該函數會使用取用者叢集的安全內容進行評估。消費者的本機使用者、角色和群組成員資格會決定結果，而不是生產者叢集上定義的結果。如果您想要強制執行在生產者上實作的相同許可內容，請確定對應的角色名稱、群組名稱和使用者成員資格存在於取用者叢集上，並符合生產者上的角色名稱、群組名稱和使用者成員資格。

## 語法
<a name="r_ROLE_IS_MEMBER_OF-synopsis"></a>

```
role_is_member_of( role_name,  granted_role_name)
```

## 引數
<a name="r_ROLE_IS_MEMBER_OF-arguments"></a>

 *role\$1name*   
角色的名稱。

 *granted\$1role\$1name*   
授與角色的名稱。

## 傳回類型
<a name="r_ROLE_IS_MEMBER_OF-return-type"></a>

傳回 BOOLEAN。

## 範例
<a name="r_ROLE_IS_MEMBER_OF-example"></a>

下列查詢確認該角色不是 role1 的成員，也不是 role2 的成員。

```
SELECT role_is_member_of('role1', 'role2');

 role_is_member_of
-------------------
             False
```

# USER\$1IS\$1MEMBER\$1OF
<a name="r_USER_IS_MEMBER_OF"></a>

**重要**  
自 2026 年 2 月 16 日起，Amazon Redshift 將不再支援使用透過資料共用存取取用者使用者、角色或群組資訊的 `user_is_member_of` 和相關函數。

如果使用者是角色或群組的成員，則傳回 true。超級使用者可以檢查所有使用者的成員資格。屬於 sys:secadmin 或 sys:superuser 角色成員的一般使用者可以檢查所有使用者的成員資格。否則，一般使用者只能檢查自己。如果提供的身分不存在或目前的使用者無法存取角色，Amazon Redshift 就會傳送錯誤訊息。

**資料共用考量**

當取用者叢集查詢參考此函數的共用物件時，例如檢視、RDS 政策或 DDM 政策，該函數會使用取用者叢集的安全內容進行評估。消費者的本機使用者、角色和群組成員資格會決定結果，而不是生產者叢集上定義的結果。如果您想要強制執行在生產者上實作的相同許可內容，請確定對應的角色名稱、群組名稱和使用者成員資格存在於取用者叢集上，並符合生產者上的角色名稱、群組名稱和使用者成員資格。

## 語法
<a name="r_USER_IS_MEMBER_OF-synopsis"></a>

```
user_is_member_of( user_name,  role_name | group_name)
```

## 引數
<a name="r_USER_IS_MEMBER_OF-arguments"></a>

 *user\$1name*   
使用者的名稱。

 *role\$1name*   
角色的名稱。

 *group\$1name*   
群組名稱。

## 傳回類型
<a name="r_USER_IS_MEMBER_OF-return-type"></a>

傳回 BOOLEAN。

## 範例
<a name="r_USER_IS_MEMBER_OF-example"></a>

下列查詢確認使用者不是 role1 的成員。

```
SELECT user_is_member_of('reguser', 'role1');

 user_is_member_of
-------------------
           False
```

# VERSION
<a name="r_VERSION"></a>

 VERSION 函數會傳回目前安裝之版本的詳細資訊，而具體的 Amazon Redshift 版本資訊放在最後。

**注意**  
這是領導者節點函數。此函數在參考使用者建立的資料表、STL 或 STV 系統資料表，或 SVV 或 SVL 系統檢視時會傳回錯誤。

## 語法
<a name="r_VERSION-synopsis"></a>

```
VERSION()
```

## 傳回類型
<a name="r_VERSION-return-type"></a>

傳回 CHAR 或 VARCHAR 字串。

## 範例
<a name="r_VERSION-examples"></a>

下列範例顯示目前叢集的叢集版本資訊：

```
select version();
```

```
 version
 ------------------------------------------------------------------------------------------------------------------------               
 PostgreSQL 8.0.2 on i686-pc-linux-gnu, compiled by GCC gcc (GCC) 3.4.2 20041017 (Red Hat 3.4.2-6.fc3), Redshift 1.0.12103
```

其中 `1.0.12103` 是叢集版本編號。

**注意**  
若要強制將您的叢集版本更新至最新，請調整您的[維護時段](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html#rs-maintenance-windows)。

# 保留字
<a name="r_pg_keywords"></a>

以下是 Amazon Redshift 保留字的清單。您可將保留字用於分隔的分隔識別碼 (雙引號)。

**注意**  
雖然 START 和 CONNECT 不是保留字，但如果您在查詢中使用 START 和 CONNECT 做為資料表別名，請使用分隔識別碼或 AS，以避免在執行期失敗。

如需更多詳細資訊，請參閱 [名稱與識別碼](r_names.md)。

```
AES128
AES256
ALL
ALLOWOVERWRITE
ANALYSE
ANALYZE
AND
ANY
ARRAY
AS
ASC
AUTHORIZATION
AZ64
BACKUP
BETWEEN
BINARY
BLANKSASNULL
BOTH
BYTEDICT
BZIP2
CASE
CAST
CHECK
COLLATE
COLUMN
CONSTRAINT
CREATE
CREDENTIALS
CROSS
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_USER
CURRENT_USER_ID
DEFAULT
DEFERRABLE
DEFLATE
DEFRAG
DELTA
DELTA32K
DESC
DISABLE
DISTINCT
DO
ELSE
EMPTYASNULL
ENABLE
ENCODE
ENCRYPT     
ENCRYPTION
END
EXCEPT
EXPLICIT
FALSE
FOR
FOREIGN
FREEZE
FROM
FULL
GLOBALDICT256
GLOBALDICT64K
GRANT
GROUP
GZIP
HAVING
IDENTITY
IGNORE
ILIKE
IN
INITIALLY
INNER
INTERSECT
INTERVAL
INTO
IS
ISNULL
JOIN
LEADING
LEFT
LIKE
LIMIT
LOCALTIME
LOCALTIMESTAMP
LUN
LUNS
LZO
LZOP
MINUS
MOSTLY16
MOSTLY32
MOSTLY8
NATURAL
NEW
NOT
NOTNULL
NULL
NULLS
OFF
OFFLINE
OFFSET
OID
OLD
ON
ONLY
OPEN
OR
ORDER
OUTER
OVERLAPS
PARALLEL
PARTITION
PERCENT
PERMISSIONS
PIVOT
PLACING
PRIMARY
RAW
READRATIO
RECOVER
REFERENCES
REJECTLOG
RESORT
RESPECT
RESTORE
RIGHT
SELECT
SESSION_USER
SIMILAR
SNAPSHOT 
SOME
SYSDATE
SYSTEM
TABLE
TAG
TDES
TEXT255
TEXT32K
THEN
TIMESTAMP
TO
TOP
TRAILING
TRUE
TRUNCATECOLUMNS
UNION
UNIQUE
UNNEST
UNPIVOT
USER
USING
VERBOSE
WALLET
WHEN
WHERE
WITH
WITHOUT
```