Skip to main content

条件表达式

CASE

按顺序遍历条件并返回与匹配条件关联的结果值。

句法 1

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

参数

参数描述
condition一个求值为 BOOLEAN 值的表达式。
result一个值或求值为值的表达式。
如果其关联的 condition 求值为 true,则 CASE 表达式返回 result

返回

  • 与首个求值为 true 的 condition 相关联的 result
  • 如果没有 condition 求值为 true,则返回 ELSE 子句中的 result
  • 如果没有 ELSE 子句且没有 condition 求值为 true,则返回 NULL。

句法 2

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

参数

参数描述
expression一个求值为值的表达式。
首先计算 expression,然后将其值与 WHEN 子句中的 value 进行比较。
value一个值或求值为值的表达式。
每个值都是与 expression 可能匹配的值。
result一个值或求值为值的表达式。
如果 CASE 表达式关联的 value 与 expression 匹配,则返回 result

返回

  • 与首个匹配 expressionvalue 相关联的 result
  • 如果没有匹配 expressionvalue,则返回 ELSE 子句中的 result
  • 如果没有 ELSE 子句且没有匹配 expressionvalue,则返回 NULL。

示例

以下语句(使用句法 1)将 'taxi_trips' 表中每次行程的距离分为四个级别。

SELECT id, distance,
CASE
WHEN (distance < 3) THEN 'short'
WHEN (distance >= 3 AND distance < 10) THEN 'mid'
WHEN (distance >= 10 AND distance < 20) THEN 'long'
WHEN (distance >= 20) THEN 'extra'
END AS "Category"
FROM taxi_trips;
 id | distance | Category 
----+----------+----------
1 | 16 | long
2 | 23 | extra
3 | 6 | mid
4 | 9 | mid

以下语句(使用句法 2)根据其数字对每次行程的距离进行分类。

SELECT id, distance,
CASE LENGTH (distance::VARCHAR)
WHEN 1 THEN 'One-digit'
WHEN 2 THEN 'Double-digit'
WHEN 3 THEN 'Three-digit'
END AS Digit
FROM taxi_trips;
 id | distance |    Digit     
----+----------+--------------
1 | 16 | Double-digit
2 | 23 | Double-digit
3 | 6 | One-digit
4 | 9 | One-digit
(4 rows)

COALESCE

返回第一个非空值,如果所有值都为空,则返回 null。

句法
COALESCE ( value [ , ... ] )

NULLIF

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

句法
NULLIF ( value1, value2 )

greatest

此函数可返回表达式列表中的最大值。参数列表中的 NULL 值将被忽略。只有当所有表达式的值都为 NULL 时,结果才为 NULL。

句法
greatest(value1, value2, ...)ANY
示例
greatest(1, 2, 3)3

create table t(id INT, v1 INT2, v2 INT4, v3 INT8);

insert into t values (1, 1, 2, 3), (2, 2, NULL, 5), (3, NULL, NULL, 8), (4, NULL, NULL, NULL);

select greatest(v1, v2, v3) from t order by id;
------ 结果
3, 5, 8, NULL

least

此函数可返回表达式列表中的最小值。参数列表中的 NULL 值将被忽略。只有当所有表达式的值都为 NULL 时,结果才为 NULL。

句法
least(value1, value2, ...)ANY
示例
create table t(id INT, v1 INT2, v2 INT4, v3 INT8);

insert into t values (1, 1, 2, 3), (2, 2, NULL, 5), (3, NULL, NULL, 8), (4, NULL, NULL, NULL);

select least(1, 2, 3); -- 结果:1

select least(v1, v2, v3) from t order by id;
------ 结果
1, 2, 8, NULL