什么是 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 的核心能力之一。它不只是简单的数学计算,而是集算术、逻辑、字符串、日期、函数于一体的“数据加工引擎”。
从最基础的 +、-,到复杂的 CASE、COALESCE、自定义函数,表达式让你能够灵活应对各种数据处理需求。无论是做报表、清洗数据,还是实现业务规则,表达式都能帮你高效完成。
记住:表达式不改变原始数据,它只是在查询时“临时计算”出你想要的结果。这正是它强大又安全的原因。
掌握 PostgreSQL 表达式,意味着你已经迈出了从“查询数据”到“处理数据”的关键一步。继续练习,把表达式用在更多场景中,你会发现 SQL 远不止是“SELECT * FROM table”这么简单。