Presto | TRY 函数
语法
try(expression)
在计算表达式 expression 时,如果发生某些类型的错误,则返回 NULL
而不是抛出异常。
作用
TRY
函数的作用是在计算一个表达式,如果在计算过程中发生错误,则返回空值 NULL
。这在以下两种场景下非常有用:
- 查询结果中含有非法或无效数据,但你希望返回空值而不是报错。
- 为表达式指定一个默认值,在计算失败时返回这个默认值。
为实现第二个目的,可以将 TRY
函数与 COALESCE
函数结合使用。COALESCE
函数的作用是返回一系列值中的第一个非空值。所以通过以下方式可以为 TRY
函数指定默认值:
1 | COALESCE(TRY(expr1), default_value) |
如果 TRY
函数成功计算 expr1
并返回一个值(非 NULL
),COALESCE
函数会返回该值。但如果TRY
函数返回空值 NULL
,COALESCE
函数就会返回我们指定的 default_value
默认值。
TRY
函数可以处理以下错误:
- 除数为 0
- 无效的类型转换参数或无效的函数参数
- 数值超出范围
例如:
1 | SELECT TRY(5/0) -- Returns NULL |
TRY
函数会计算第一个参数中的表达式,如果发生上述某些错误,则返回 NULL
而不是报错失败。与 COALESCE
函数结合使用时,TRY
函数可以指定在发生错误时返回的默认值,而不是简单的 NULL
。
需要注意的是,TRY
函数允许在错误或无效的数据输入情况下继续查询,并返回预定的值或 NULL
,而不是使查询失败——这在某些情况下可能是更可取的方案。但是使用 TRY
和 COALESCE
函数并不会修正或移除问题数据,只是简单的规避错误继续运行查询。
示例
源表(shipping)中包含一些无效数据:
1 | WITH shipping AS ( |
结果如下:
origin_state | origin_zip | packages | total_cost |
---|---|---|---|
New Jersey | 8544 | 225 | 490 |
California | P332a | 5 | 72 |
California | 94025 | 0 | 155 |
California | 94131 | 25 | 100 |
在不使用 TRY
函数的情况下,查询失败:
1 | SELECT CAST(origin_zip AS BIGINT) FROM shipping; |
1 | Query failed: Can not cast 'P332a' to BIGINT |
使用 TRY
函数,返回 NULL 值:
1 | SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping; |
1 | origin_zip |
在不使用 TRY
函数的情况下,查询失败:
1 | SELECT total_cost / packages AS per_package FROM shipping; |
1 | Query failed: / by zero |
使用 TRY
和 COALESCE
函数指定默认值:
1 | SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping; |
1 | per_package |
(END)
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.