Amazon Redshift 自 2025 年 11 月 1 日起不再支援建立新的 Python UDF。如果您想要使用 Python UDF,請在該日期之前建立 UDF。現有 Python UDF 將繼續正常運作。如需詳細資訊,請參閱部落格文章
TRY_CAST 函式
與 CAST 函式相比,TRY_CAST 會先嘗試將表達式轉換為指定的類型。如果因轉換錯誤而導致轉換失敗,操作會傳回 null。如果未明確允許轉換,操作會傳回錯誤。您可以在以下使用須知中找到可能的轉換清單。例如,不允許嘗試將布林值轉換為時間戳記。
語法
TRY_CAST(expression AS type)
引數
- 表達式
-
任何評估為一或多個值的表達式,例如欄名或常值。轉換 Null 值會傳回 Null。表達式不能包含空格或空字串。
- "type"
-
其中一種支援的資料類型。如需資料類型的完整清單,請參閱 資料類型。如需支援的來源資料類型和目標資料類型配對清單,請參閱下列使用須知。
傳回類型
TRY_CAST 會傳回 type 引數所指定資料類型的值。如果轉換失敗,操作會傳回 null。
使用須知
以下是 Amazon Redshift 針對 TRY_CAST 支援的來源資料類型和目標資料類型配對清單。
- 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 除外。
範例
下列範例會將 STRING 轉換為 INTEGER。
SELECT TRY_CAST('123' AS INT);int ---- 123
以下範例傳回 NULL。允許將 STRING 轉換為 INTEGER,因此 TRY_CAST 不會傳回錯誤,但 'foo' 不是整數,因此函式會傳回 null。
SELECT TRY_CAST('foo' AS INT)
下列範例會傳回錯誤,因為不允許將 BOOLEAN 轉換為 TIMESTAMP。
SELECT TRY_CAST(true as timestamp);
由於 TRY_CAST 傳回 null,而不是在轉換失敗時立即傳回錯誤,因此您可以使用 TRY_CAST 來篩選出無效的資料。請考慮以下範例,其中由於 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