

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 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/)。

# TRY\$1CAST 函数
<a name="r_TRY_CAST"></a>

与 CAST 函数相比，TRY\$1CAST 首先尝试将表达式强制转换为指定的类型。如果强制转换由于转换错误而失败，该操作将返回 null。如果未显式允许强制转换，该操作会返回错误。您可以在下面的使用说明中找到可能的转换列表。例如，不允许尝试将布尔值转换为时间戳。

## 语法
<a name="r_TRY_CAST-syntax"></a>

```
TRY_CAST(expression AS type)
```

## 参数
<a name="r_TRY_CAST-arguments"></a>

 *expression*   
计算结果为一个或多个值的表达式，如列名称或文本。转换 null 值将返回 null。表达式不能包含空白或空字符串。

 *type*   
 受支持的数据类型之一。有关数据类型的完全列表，请参阅[数据类型](c_Supported_data_types.md)。有关受支持的源数据类型和目标数据类型对的列表，请参阅下面的使用说明。

## 返回类型
<a name="r_TRY_CAST-return-type"></a>

TRY\$1CAST 返回由 *type* 参数指定的数据类型的值。如果转换失败，该操作将返回 null。

## 使用说明
<a name="r_TRY_CAST-usage-notes"></a>

以下是 Amazon Redshift 针对 TRY\$1CAST 支持的源数据类型和目标数据类型对的列表。

 *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 除外。

## 示例
<a name="r_TRY_CAST-examples"></a>

以下示例将 STRING 强制转换为 INTEGER。

```
SELECT TRY_CAST('123' AS INT);

int
----
123
```

以下示例返回 null。允许将 STRING 转换为 INTEGER，因此 TRY\$1CAST 不会返回错误，但是“foo”不是整数，因此该函数返回 null。

```
SELECT TRY_CAST('foo' AS INT)
```

以下示例返回错误，因为不允许将 BOOLEAN 转换为 TIMESTAMP。

```
SELECT TRY_CAST(true as timestamp);
```

由于 TRY\$1CAST 返回 null，而不是在转换失败时立即返回错误，因此您可以使用 TRY\$1CAST 筛选掉无效数据。请考虑以下示例，其中由于 Akua Mansa 的 age 列中存在转换失败，因此筛选掉了无效行。

```
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
```