语法

try(expression)

在计算表达式 expression 时,如果发生某些类型的错误,则返回 NULL 而不是抛出异常。

作用

TRY 函数的作用是在计算一个表达式,如果在计算过程中发生错误,则返回空值 NULL。这在以下两种场景下非常有用:

  1. 查询结果中含有非法或无效数据,但你希望返回空值而不是报错。
  2. 为表达式指定一个默认值,在计算失败时返回这个默认值。

为实现第二个目的,可以将 TRY 函数与 COALESCE 函数结合使用。COALESCE 函数的作用是返回一系列值中的第一个非空值。所以通过以下方式可以为 TRY 函数指定默认值:

1
COALESCE(TRY(expr1), default_value)

如果 TRY 函数成功计算 expr1 并返回一个值(非 NULL),COALESCE 函数会返回该值。但如果TRY 函数返回空值 NULLCOALESCE 函数就会返回我们指定的 default_value 默认值。

TRY 函数可以处理以下错误:

  • 除数为 0
  • 无效的类型转换参数或无效的函数参数
  • 数值超出范围

例如:

1
2
SELECT TRY(5/0) -- Returns NULL
SELECT COALESCE(TRY(5/0), 0) -- Returns 0

TRY 函数会计算第一个参数中的表达式,如果发生上述某些错误,则返回 NULL 而不是报错失败。与 COALESCE 函数结合使用时,TRY 函数可以指定在发生错误时返回的默认值,而不是简单的 NULL

需要注意的是,TRY 函数允许在错误或无效的数据输入情况下继续查询,并返回预定的值或 NULL,而不是使查询失败——这在某些情况下可能是更可取的方案。但是使用 TRYCOALESCE 函数并不会修正或移除问题数据,只是简单的规避错误继续运行查询。

示例

源表(shipping)中包含一些无效数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
WITH shipping AS (
SELECT
'California' AS origin_state,
'94131' AS origin_zip,
25 AS packages,
100 AS total_cost
UNION ALL
SELECT
'California',
'P332a',
5,
72
UNION ALL
SELECT
'California',
'94025',
0,
155
UNION ALL
SELECT
'New Jersey',
'08544',
225,
490
)

SELECT * FROM shipping

结果如下:

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
2
3
4
5
6
7
origin_zip
------------
94131
NULL
94025
08544
(4 rows)

在不使用 TRY 函数的情况下,查询失败:

1
SELECT total_cost / packages AS per_package FROM shipping;
1
Query failed: / by zero

使用 TRYCOALESCE 函数指定默认值:

1
SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
1
2
3
4
5
6
7
per_package
-------------
4
14
0
2
(4 rows)

(END)