

 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/)。

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

# CAST 函數
CAST

CAST 函數會將一種資料類型轉換為另一個相容的資料類型。例如，您可以將字串轉換為日期，或將數值類型轉換為字串。CAST 會執行執行期轉換，這表示轉換不會變更來源資料表中值的資料類型。它僅在查詢的上下文中進行更改。

CAST 函數非常類似 [CONVERT 函數](r_CONVERT_function.md)，因為它們都將一種資料類型轉換為另一種資料類型，但它們的呼叫方式不同。

某些資料類型需要使用 CAST 或 CONVERT 函數來明確轉換為其他資料類型。其他資料類型可在另一個命令中隱含地轉換，而不需要使用 CAST 或 CONVERT。請參閱 [類型相容性與轉換](c_Supported_data_types.md#r_Type_conversion)。

## 語法
語法

使用兩種同等的語法格式中的任何一種，將運算式從一種資料類型轉換為另一種資料類型。

```
CAST ( expression AS type )
expression :: type
```

## 引數
引數

 *表達式*   
任何評估為一或多個值的表達式，例如欄名或常值。轉換 Null 值會傳回 Null。表達式不能包含空格或空字串。

 *type*   
其中一個支援的[資料類型](c_Supported_data_types.md)。

## 傳回類型
傳回類型

CAST 傳回 *type* 引數指定的資料類型。

**注意**  
如果您嘗試執行有問題的轉換，例如 DECIMAL 轉換導致精確度降低，Amazon Redshift 會傳回錯誤：  

```
select 123.456::decimal(2,1);
```
或造成溢位的 INTEGER 轉換：  

```
select 12345678::smallint;
```

## 範例
範例

一些範例使用範例 [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)
```