条件表达式
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。 |
返回
- 与首个匹配 expression 的 value 相关联的 result。
- 如果没有匹配 expression 的 value,则返回 ELSE 子句中的 result。
- 如果没有 ELSE 子句且没有匹配 expression 的 value,则返回 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