SAFE_CAST

更新时间:
复制 MD 格式

MaxCompute SAFE_CAST 是数据类型转换函数,用于将表达式(expr)转换为目标数据类型(type)。

功能介绍

CAST函数支持将一个表达式结果(expr)转换成目标数据类型(type),SAFE_CAST相比于CAST核心区别在于转换失败时的处理方式:

  • CAST:当表达式无法转换为目标类型时(如将非数字字符串转为整数),会直接抛出运行时错误,导致整个查询失败中断。

  • SAFE_CAST:当表达式无法转换为目标类型时,不会抛出错误,而是返回 NULL,从而保证查询能够正常完成。

因此,SAFE_CAST 特别适用于数据质量不确定、可能存在脏数据的场景,能够有效避免因个别异常数据导致整个任务失败的问题。

SAFE_CAST函数支持将表达式结果(expr)转换为INT 和 BIGINT 两种目标数据类型:

当前 SAFE_CAST 仅支持 INT 和 BIGINT 两种目标类型,不支持 CAST 所支持的其他数据类型(如 STRING、DOUBLE、DATETIME 等)。

SAFE_CAST AS INT

命令格式

SAFE_CAST (<expr> AS INT)

参数说明

expr: 必填。待转换的表达式。

返回值说明

返回值为转换后的目标数据类型(INT)。转换成功时返回对应值;转换失败时返回 NULL(而非报错),这也是 SAFE_CAST 区别于 CAST 的核心行为。具体规则如下:

  • 若待转换的数据为包含非数字字符的字符串(如:'123abc')

    • 非严格模式(默认)下(odps.sql.udf.strict.mode=false),返回字母前的数字部分。

    • 严格模式下(odps.sql.udf.strict.mode=true),返回 NULL。

  • 若待转换的数据为纯非数字字符的字符串(如:'abc')

    • 非严格模式(默认)下(odps.sql.udf.strict.mode=false),则返回 NULL。

    • 严格模式下(odps.sql.udf.strict.mode=true),返回 NULL。

使用示例

-- 非严格模式(默认)
SELECT  SAFE_CAST('123abc' AS INT) AS toint
        ,SAFE_CAST('abc' AS INT) AS toint2
;

-- 返回结果
+-------+--------+
| toint | toint2 |
+-------+--------+
| 123   | NULL   |
+-------+--------+

-- 严格模式
SET odps.sql.udf.strict.mode=true;
SELECT  SAFE_CAST('123abc' AS INT) AS toint
        ,SAFE_CAST('abc' AS INT) AS toint2
;

-- 返回结果
+-------+--------+
| toint | toint2 |
+-------+--------+
| NULL  | NULL   |
+-------+--------+

SAFE_CAST AS BIGINT

命令格式

SAFE_CAST (<expr> AS BIGINT)

参数说明

expr: 必填。待转换的表达式。

返回值说明

返回值为转换后的目标数据类型(BIGINT)。转换成功时返回对应值;转换失败时返回 NULL(而非报错),这也是 SAFE_CAST 区别于 CAST 的核心行为。具体规则如下:

  • 若待转换的数据为包含非数字字符的字符串(如:'123abc')

    • 非严格模式(默认)下(odps.sql.udf.strict.mode=false),返回字母前的数字部分。

    • 严格模式下(odps.sql.udf.strict.mode=true),返回 NULL。

  • 若待转换的数据为纯非数字字符的字符串(如:'abc')

    • 非严格模式(默认)下(odps.sql.udf.strict.mode=false), 则返回 0。

    • 严格模式下(odps.sql.udf.strict.mode=true),均返回 NULL。

使用示例

-- 非严格模式(默认)
SELECT  SAFE_CAST('123abc' AS BIGINT) AS tobigint
        ,SAFE_CAST('abc' AS BIGINT) AS tobigint2
;

-- 返回结果
+------------+------------+
| tobigint   | tobigint2  |
+------------+------------+
| 123        | 0          |
+------------+------------+

-- 严格模式
SET odps.sql.udf.strict.mode=true;
SELECT  SAFE_CAST('123abc' AS BIGINT) AS tobigint
        ,SAFE_CAST('abc' AS BIGINT) AS tobigint2
;

-- 返回结果
+------------+------------+
| tobigint   | tobigint2  |
+------------+------------+
| NULL       | NULL       |
+------------+------------+