条件表达式

CASE

标准 SQL CASE 表达式有两种形式。 “简单”形式从左到右搜索每个 value 表达式,直到找到一个等于 expression 的表达式。

CASE expression
    WHEN value THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

返回匹配 valueresult。 如果没有找到匹配项,则返回 ELSE 子句中的 result(如果存在),否则返回 null。 示例

SELECT a,
       CASE a
           WHEN 1 THEN 'one'
           WHEN 2 THEN 'two'
           ELSE 'many'
       END

“搜索”形式从左到右评估每个布尔值 condition,直到找到一个为 true 的条件,并返回匹配的 result

CASE
    WHEN condition THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

如果没有任何条件为 true,则返回 ELSE 子句中的 result(如果存在),否则返回 null。 示例

SELECT a, b,
       CASE
           WHEN a = 1 THEN 'aaa'
           WHEN b = 2 THEN 'bbb'
           ELSE 'ccc'
       END

IF

IF 函数实际上是一个语言结构,等效于以下 CASE 表达式

CASE
    WHEN condition THEN true_value
    [ ELSE false_value ]
END
if(condition, true_value)

如果 condition 为 true,则评估并返回 true_value,否则返回 null,并且不评估 true_value

if(condition, true_value, false_value)

如果 condition 为 true,则评估并返回 true_value,否则评估并返回 false_value

COALESCE

coalesce(value1, value2[, ...])

返回参数列表中的第一个非空 value。 与 CASE 表达式类似,参数仅在必要时进行评估。

NULLIF

nullif(value1, value2)

如果 value1 等于 value2,则返回 null,否则返回 value1

TRY

try(expression)

评估表达式并通过返回 NULL 来处理某些类型的错误。

在希望查询在遇到损坏或无效数据时产生 NULL 或默认值而不是失败的情况下,TRY 函数可能很有用。 要指定默认值,可以使用 TRY 函数与 COALESCE 函数一起使用。

以下错误由 TRY 处理

  • 除以零

  • 无效的强制转换参数或无效的函数参数

  • 数值超出范围

示例

包含一些无效数据的源表

SELECT * FROM shipping;
 origin_state | origin_zip | packages | total_cost
--------------+------------+----------+------------
 California   |      94131 |       25 |        100
 California   |      P332a |        5 |         72
 California   |      94025 |        0 |        155
 New Jersey   |      08544 |      225 |        490
(4 rows)

没有 TRY 的查询失败

SELECT CAST(origin_zip AS BIGINT) FROM shipping;
Query failed: Can not cast 'P332a' to BIGINT

使用 TRYNULL

SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping;
 origin_zip
------------
      94131
 NULL
      94025
      08544
(4 rows)

没有 TRY 的查询失败

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

使用 TRYCOALESCE 的默认值

SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
 per_package
-------------
          4
         14
          0
         19
(4 rows)