本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
CAST 函數
CAST 函數會將一種資料類型轉換為另一個相容的資料類型。例如,您可以將字串轉換為日期,或將數值類型轉換為字串。CAST 會執行執行期轉換,這表示轉換不會變更來源資料表中值的資料類型。它僅在查詢的上下文中進行更改。
CAST 函數非常類似 CONVERT 函數,因為它們都將一種資料類型轉換為另一種資料類型,但它們的呼叫方式不同。
某些資料類型需要使用 CAST 或 CONVERT 函數來明確轉換為其他資料類型。其他資料類型可在另一個命令中隱含地轉換,而不需要使用 CAST 或 CONVERT。請參閱類型相容性與轉換。
語法
使用兩種同等的語法格式中的任何一種,將運算式從一種資料類型轉換為另一種資料類型。
CAST ( expression AS type ) expression :: type
引數
- 運算式
-
任何評估為一或多個值的表達式,例如欄名或常值。轉換 Null 值會傳回 Null。運算式不能包含空白或空白字串。
- type
-
支援的其中一個資料類型,除了 VARBYTE、二進位和二進位變異資料類型。
傳回類型
CAST 傳回 type 引數指定的資料類型。
注意
AWS Clean Rooms 如果您嘗試執行有問題的轉換,例如失去精確度的 DECIMAL 轉換,就會傳回錯誤,如下所示:
select 123.456::decimal(2,1);
或造成溢位的 INTEGER 轉換:
select 12345678::smallint;
範例
下列兩個查詢相同。都是將小數值轉換為整數:
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_CHAR。
在此範例中,整數轉換為字元字串:
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)