TRY_CAST 函式 - Amazon Redshift

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