与 CAST 函数相比,TRY_CAST 首先尝试将表达式强制转换为指定的类型。如果强制转换由于转换错误而失败,该操作将返回 null。如果未显式允许强制转换,该操作会返回错误。您可以在下面的使用说明中找到可能的转换列表。例如,不允许尝试将布尔值转换为时间戳。
语法
TRY_CAST(expression AS type)
参数
- expression
-
计算结果为一个或多个值的表达式,如列名称或文本。转换 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 的 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