PostgreSQL 表达式(手把手讲解)

什么是 PostgreSQL 表达式?

在数据库的世界里,表达式就像是一道道数学题,但它不光是加减乘除,还能处理字符串、日期、逻辑判断,甚至调用函数。PostgreSQL 表达式,就是用来计算值的任意组合,它由操作符、函数、列名、常量等构成,最终返回一个结果。

你可以把它想象成一个“计算器”,只不过这个计算器能读取数据库里的数据,比如用户的名字、订单金额、创建时间,然后根据你的规则算出新的值。比如,你想把所有订单金额加上 10% 的税费,那就用一个表达式来完成:amount * 1.1

表达式是 SQL 语言中最灵活的部分。无论是 SELECT 查询、WHERE 条件、UPDATE 更新值,还是在 CREATE TABLE 时定义默认值,表达式都无处不在。掌握它,你就等于掌握了 SQL 的“编程能力”。

比如下面这个例子:

SELECT name, price * 1.1 AS price_with_tax
FROM products;

这里 price * 1.1 就是一个简单的表达式,它将每条记录的 price 字段乘以 1.1,计算出含税价格。注意,表达式的结果不会修改原表数据,只是临时展示。

基本运算与操作符

PostgreSQL 支持标准的算术、比较、逻辑操作符,这些是构建表达式的基础组件。

算术操作符

算术操作符用于数值计算,它们和我们日常用的数学符号基本一致。

操作符 说明 示例
+ 加法 10 + 5 → 15
- 减法 20 - 8 → 12
* 乘法 6 * 7 → 42
/ 除法(浮点) 15 / 4 → 3.75
# 整除(返回整数部分) 15 # 4 → 3
^ 幂运算 2 ^ 3 → 8
` /` 平方根
` /`
-- 计算员工工资涨幅 10%,并显示原工资和新工资
SELECT 
    name,
    salary AS original_salary,
    salary * 1.1 AS new_salary,  -- 表达式:原工资 * 1.1
    salary + (salary * 0.1) AS calculated_new_salary  -- 表达式:原工资 + 10% 增加额
FROM employees;

💡 小贴士:PostgreSQL 中 / 是浮点除法,# 是整除。如果你希望结果是整数,用 # 更合适。

比较操作符

用于判断两个值之间的关系,返回布尔值(TRUE / FALSE),常用于 WHERE 条件中。

操作符 说明
= 等于
<>!= 不等于
< 小于
> 大于
<= 小于等于
>= 大于等于
-- 找出价格高于 100 的商品
SELECT name, price
FROM products
WHERE price > 100;  -- 表达式:price > 100,返回 TRUE 或 FALSE

逻辑操作符

用于组合多个条件,控制表达式的结果。

操作符 说明
AND 逻辑与(两个都为真才为真)
OR 逻辑或(至少一个为真就为真)
NOT 逻辑非(取反)
-- 找出价格高于 100 且库存大于 10 的商品
SELECT name, price, stock
FROM products
WHERE price > 100 AND stock > 10;

✅ 提示:表达式中的逻辑判断可以嵌套,使用括号控制优先级,比如 (price > 100) AND (stock < 5 OR category = 'Electronics')

字符串与日期表达式

表达式不仅限于数字,还能处理文本和时间数据,这是 PostgreSQL 强大的地方。

字符串拼接与处理

PostgreSQL 使用 || 操作符来拼接字符串,类似其他语言中的 +

-- 将名字和姓氏拼接成全名
SELECT 
    first_name,
    last_name,
    first_name || ' ' || last_name AS full_name  -- 表达式:字符串拼接
FROM users;

输出结果:

first_name | last_name | full_name
-----------|-----------|-----------
张        | 伟        | 张 伟
李        | 芳        | 李 芳

此外,PostgreSQL 提供了丰富的字符串函数,可以组合成更复杂的表达式:

-- 将用户名转为大写,并加上前缀“USER_”
SELECT 
    username,
    'USER_' || UPPER(username) AS formatted_username  -- 表达式:函数 + 拼接
FROM users;

日期与时间表达式

日期表达式是业务系统中最常用的。PostgreSQL 支持对日期进行加减、比较、格式化。

-- 计算订单创建后 30 天的到期日
SELECT 
    order_id,
    created_at,
    created_at + INTERVAL '30 days' AS due_date  -- 表达式:日期 + 时间间隔
FROM orders;

你也可以用 EXTRACT 函数从日期中提取特定部分:

-- 提取订单创建的年份和月份
SELECT 
    order_id,
    created_at,
    EXTRACT(YEAR FROM created_at) AS order_year,  -- 表达式:提取年份
    EXTRACT(MONTH FROM created_at) AS order_month  -- 表达式:提取月份
FROM orders;

📌 小技巧:INTERVAL '1 month' 是一个表达式,表示一个月的时间间隔,可以加到日期上。

函数在表达式中的应用

PostgreSQL 内置了上百个函数,它们可以作为表达式的一部分,极大增强了表达式的表达力。

常用内置函数

函数 说明 示例
UPPER() 转大写 UPPER('hello') → 'HELLO'
LOWER() 转小写 LOWER('WORLD') → 'world'
TRIM() 去除空格 TRIM(' hello ') → 'hello'
LENGTH() 字符串长度 LENGTH('abc') → 3
COALESCE() 返回第一个非空值 COALESCE(NULL, 'default') → 'default'
NULLIF() 如果相等则返回 NULL NULLIF(5, 5) → NULL
-- 处理用户邮箱字段:去空格、转小写、若为空则用默认值
SELECT 
    email,
    COALESCE(TRIM(LOWER(email)), 'no-email@default.com') AS cleaned_email
FROM users;

🧠 比喻:函数就像表达式的“积木”,你把它们组合起来,就能搭建出复杂的数据处理逻辑。

自定义函数与表达式

你还可以创建自定义函数,然后在表达式中调用。

-- 创建一个函数:计算用户年龄(基于出生日期)
CREATE OR REPLACE FUNCTION calculate_age(birth_date DATE)
RETURNS INT
LANGUAGE SQL
AS $$
    SELECT EXTRACT(YEAR FROM AGE(birth_date));
$$;

-- 在表达式中使用函数
SELECT 
    name,
    birth_date,
    calculate_age(birth_date) AS age  -- 表达式:调用自定义函数
FROM users;

这样,你就把复杂的逻辑封装成了一个表达式,代码更清晰,复用性更高。

表达式在实际场景中的应用

场景一:动态计算折扣价

假设你有一个促销活动,规则是:价格超过 500 的商品打 8 折,否则不打折。

-- 使用 CASE 表达式实现动态折扣
SELECT 
    name,
    price,
    CASE 
        WHEN price > 500 THEN price * 0.8  -- 表达式:价格 > 500?是:打 8 折
        ELSE price  -- 否则:原价
    END AS discounted_price
FROM products;

✅ 这里的 CASE 是一个表达式,它根据条件返回不同值,是表达式中的“条件分支”。

场景二:统计用户活跃度

假设你想判断用户是否“活跃”:最近 30 天内有登录记录。

-- 使用表达式判断用户是否活跃
SELECT 
    username,
    last_login,
    CASE 
        WHEN last_login >= CURRENT_DATE - INTERVAL '30 days' THEN '活跃'
        ELSE '不活跃'
    END AS status  -- 表达式:日期比较 + 字符串判断
FROM users;

场景三:生成唯一编号

在某些系统中,你需要生成类似 INV-2024-001 的编号。

-- 使用表达式生成编号
SELECT 
    'INV-' || EXTRACT(YEAR FROM CURRENT_DATE) || '-' || 
    LPAD(COUNT(*)::TEXT, 3, '0') AS invoice_number
FROM orders
WHERE EXTRACT(YEAR FROM order_date) = EXTRACT(YEAR FROM CURRENT_DATE);

✅ 这个表达式结合了:日期提取、字符串拼接、数字补零(LPAD)等操作,展示表达式的强大组合能力。

总结

PostgreSQL 表达式是 SQL 的核心能力之一。它不只是简单的数学计算,而是集算术、逻辑、字符串、日期、函数于一体的“数据加工引擎”。

从最基础的 +-,到复杂的 CASECOALESCE、自定义函数,表达式让你能够灵活应对各种数据处理需求。无论是做报表、清洗数据,还是实现业务规则,表达式都能帮你高效完成。

记住:表达式不改变原始数据,它只是在查询时“临时计算”出你想要的结果。这正是它强大又安全的原因。

掌握 PostgreSQL 表达式,意味着你已经迈出了从“查询数据”到“处理数据”的关键一步。继续练习,把表达式用在更多场景中,你会发现 SQL 远不止是“SELECT * FROM table”这么简单。