跳到主要内容

PostgreSQL 条件表达式

在 PostgreSQL 中,条件表达式是一种强大的工具,允许你根据特定条件返回不同的值。它们可以帮助你在查询中实现逻辑分支,从而更灵活地处理数据。本文将介绍 PostgreSQL 中常用的条件表达式,包括 CASECOALESCENULLIF,并通过实际案例展示它们的用法。

1. CASE 表达式

CASE 表达式是 PostgreSQL 中最常用的条件表达式之一。它允许你根据条件返回不同的值。CASE 表达式有两种形式:简单 CASE 和搜索 CASE

简单 CASE 表达式

简单 CASE 表达式根据一个表达式的值来匹配不同的条件。语法如下:

sql
CASE expression
WHEN value1 THEN result1
WHEN value2 THEN result2
...
ELSE default_result
END

示例:

假设我们有一个 students 表,其中包含学生的成绩等级(A、B、C、D、F)。我们想要将等级转换为对应的描述:

sql
SELECT name,
grade,
CASE grade
WHEN 'A' THEN '优秀'
WHEN 'B' THEN '良好'
WHEN 'C' THEN '及格'
WHEN 'D' THEN '不及格'
ELSE '未知'
END AS grade_description
FROM students;

输出:

namegradegrade_description
AliceA优秀
BobB良好
CharlieC及格
DavidD不及格
EveF未知

搜索 CASE 表达式

搜索 CASE 表达式允许你使用更复杂的条件。语法如下:

sql
CASE
WHEN condition1 THEN result1
WHEN condition2 THEN result2
...
ELSE default_result
END

示例:

假设我们有一个 orders 表,其中包含订单金额。我们想要根据订单金额将订单分类为“小订单”、“中订单”或“大订单”:

sql
SELECT order_id,
amount,
CASE
WHEN amount < 100 THEN '小订单'
WHEN amount BETWEEN 100 AND 500 THEN '中订单'
ELSE '大订单'
END AS order_size
FROM orders;

输出:

order_idamountorder_size
150小订单
2200中订单
3600大订单

2. COALESCE 表达式

COALESCE 表达式用于返回参数列表中的第一个非空值。如果所有参数都为 NULL,则返回 NULL。语法如下:

sql
COALESCE(value1, value2, ..., valueN)

示例:

假设我们有一个 employees 表,其中包含员工的电话号码和备用电话号码。我们想要获取每个员工的可用电话号码:

sql
SELECT name,
COALESCE(phone, backup_phone, '无联系方式') AS contact_info
FROM employees;

输出:

namecontact_info
Alice123-456-7890
Bob987-654-3210
Charlie无联系方式

3. NULLIF 表达式

NULLIF 表达式用于比较两个值,如果它们相等,则返回 NULL,否则返回第一个值。语法如下:

sql
NULLIF(value1, value2)

示例:

假设我们有一个 products 表,其中包含产品的价格和折扣价格。我们想要获取产品的实际价格(如果折扣价格与价格相同,则返回 NULL):

sql
SELECT product_name,
price,
discount_price,
NULLIF(price, discount_price) AS actual_price
FROM products;

输出:

product_namepricediscount_priceactual_price
Laptop10008001000
Phone500500NULL
Tablet300250300

实际应用场景

场景 1:动态计算折扣

假设我们有一个 orders 表,其中包含订单金额和客户类型。我们想要根据客户类型动态计算折扣:

sql
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 表,其中包含销售数据和销售人员的备注。我们想要获取销售数据,但如果备注为空,则显示“无备注”:

sql
SELECT sale_id,
sale_amount,
COALESCE(notes, '无备注') AS sale_notes
FROM sales;

总结

PostgreSQL 的条件表达式提供了强大的工具来处理复杂的逻辑和数据转换。通过 CASECOALESCENULLIF,你可以轻松地在查询中实现条件分支、处理空值和比较数据。掌握这些表达式将大大提高你在 PostgreSQL 中处理数据的能力。

附加资源

练习

  1. 编写一个查询,使用 CASE 表达式将员工的工资等级分类为“低”、“中”、“高”。
  2. 使用 COALESCE 表达式处理一个包含多个可能为 NULL 的列的表,并返回第一个非空值。
  3. 使用 NULLIF 表达式比较两个列,并在它们相等时返回 NULL

通过完成这些练习,你将更好地理解 PostgreSQL 条件表达式的用法和应用场景。