TRY_CAST 函數 - Amazon Redshift

自 2025 年 11 月 1 日起,Amazon Redshift 將不再支援建立新的 Python UDFs。如果您想要使用 Python UDFs,請在該日期之前建立 UDFs。現有的 Python UDFs將繼續如常運作。如需詳細資訊,請參閱部落格文章

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

TRY_CAST 函數

與 CAST 函數相比,TRY_CAST 會先嘗試將運算式轉換為指定的類型。如果轉換錯誤導致轉換失敗,操作會傳回 null。如果未明確允許轉換,操作會傳回錯誤。您可以在以下用量備註中找到可能的轉換清單。例如,不允許嘗試將布林值轉換為時間戳記。

語法

TRY_CAST(expression AS type)

引數

運算式

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

type

支援的資料類型之一。如需資料類型的完整清單,請參閱 資料類型。如需支援的來源資料類型和目標資料類型對清單,請參閱下列用量備註。

傳回類型

TRY_CAST 會傳回類型引數指定的資料類型值。如果轉換失敗,操作會傳回 null。

使用須知

以下是 Amazon Redshift 針對 TRY_CAST 支援的來源資料類型和目標資料類型對清單。

BOOL

SMALLINT、INT、BIINT、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、十進位、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、文字、VARCHAR、時間戳記TZ、日期、時間

TIMESTAMPTZ

BPCHAR、文字、VARCHAR、時間戳記、日期、時間、時區

日期

BPCHAR、文字、VARCHAR、時間戳記、時間戳記

時間

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