PostgreSQL 条件表达式
在 PostgreSQL 中,条件表达式是一种强大的工具,允许你根据特定条件返回不同的值。它们可以帮助你在查询中实现逻辑分支,从而更灵活地处理数据。本文将介绍 PostgreSQL 中常用的条件表达式,包括 CASE
、COALESCE
和 NULLIF
,并通过实际案例展示它们的用法。
1. CASE 表达式
CASE
表达式是 PostgreSQL 中最常用的条件表达式之一。它允许你根据条件返回不同的值。CASE
表达式有两种形式:简单 CASE
和搜索 CASE
。
简单 CASE 表达式
简单 CASE
表达式根据一个表达式的值来匹配不同的条件。语法如下:
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END
示例:
假设我们有一个 students
表,其中包含学生的成绩等级(A、B、C、D、F)。我们想要将等级转换为对应的描述:
SELECT name,
grade,
CASE grade
WHEN 'A' THEN '优秀'
WHEN 'B' THEN '良好'
WHEN 'C' THEN '及格'
WHEN 'D' THEN '不及格'
ELSE '未知'
END AS grade_description
FROM students;
输出:
name | grade | grade_description |
---|---|---|
Alice | A | 优秀 |
Bob | B | 良好 |
Charlie | C | 及格 |
David | D | 不及格 |
Eve | F | 未知 |
搜索 CASE 表达式
搜索 CASE
表达式允许你使用更复杂的条件。语法如下:
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END
示例:
假设我们有一个 orders
表,其中包含订单金额。我们想要根据订单金额将订单分类为“小订单”、“中订单”或“大订单”:
SELECT order_id,
amount,
CASE
WHEN amount < 100 THEN '小订单'
WHEN amount BETWEEN 100 AND 500 THEN '中订单'
ELSE '大订单'
END AS order_size
FROM orders;
输出:
order_id | amount | order_size |
---|---|---|
1 | 50 | 小订单 |
2 | 200 | 中订单 |
3 | 600 | 大订单 |
2. COALESCE 表达式
COALESCE
表达式用于返回参数列表中的第一个非空值。如果所有参数都为 NULL
,则返回 NULL
。语法如下:
COALESCE(value1, value2, ..., valueN)
示例:
假设我们有一个 employees
表,其中包含员工的电话号码和备用电话号码。我们想要获取每个员工的可用电话号码:
SELECT name,
COALESCE(phone, backup_phone, '无联系方式') AS contact_info
FROM employees;
输出:
name | contact_info |
---|---|
Alice | 123-456-7890 |
Bob | 987-654-3210 |
Charlie | 无联系方式 |
3. NULLIF 表达式
NULLIF
表达式用于比较两个值,如果它们相等,则返回 NULL
,否则返回第一个值。语法如下:
NULLIF(value1, value2)
示例:
假设我们有一个 products
表,其中包含产品的价格和折扣价格。我们想要获取产品的实际价格(如果折扣价格与价格相同,则返回 NULL
):
SELECT product_name,
price,
discount_price,
NULLIF(price, discount_price) AS actual_price
FROM products;
输出:
product_name | price | discount_price | actual_price |
---|---|---|---|
Laptop | 1000 | 800 | 1000 |
Phone | 500 | 500 | NULL |
Tablet | 300 | 250 | 300 |
实际应用场景
场景 1:动态计算折扣
假设我们有一个 orders
表,其中包含订单金额和客户类型。我们想要根据客户类型动态计算折扣:
SELECT order_id,
amount,
customer_type,
CASE
WHEN customer_type = 'VIP' THEN amount * 0.9
WHEN customer_type = 'Regular' THEN amount * 0.95
ELSE amount
END AS discounted_amount
FROM orders;
场景 2:处理缺失数据
假设我们有一个 sales
表,其中包含销售数据和销售人员的备注。我们想要获取销售数据,但如果备注为空,则显示“无备注”:
SELECT sale_id,
sale_amount,
COALESCE(notes, '无备注') AS sale_notes
FROM sales;
总结
PostgreSQL 的条件表达式提供了强大的工具来处理复杂的逻辑和数据转换。通过 CASE
、COALESCE
和 NULLIF
,你可以轻松地在查询中实现条件分支、处理空值和比较数据。掌握这些表达式将大大提高你在 PostgreSQL 中处理数据的能力。
附加资源
练习
- 编写一个查询,使用
CASE
表达式将员工的工资等级分类为“低”、“中”、“高”。 - 使用
COALESCE
表达式处理一个包含多个可能为NULL
的列的表,并返回第一个非空值。 - 使用
NULLIF
表达式比较两个列,并在它们相等时返回NULL
。
通过完成这些练习,你将更好地理解 PostgreSQL 条件表达式的用法和应用场景。