今天我们又要深入聊聊 NULL 的处理方式,顺便认识一个超实用的函数 —— COALESCE()。这个函数能让你优雅地搞定数据里的 NULL 值。
举个例子:你有一张员工表,但有些员工的工资信息缺失。如果我们想给所有人涨工资,会发生什么?肯定不行啊。因为 NULL 不能直接参与运算。那如果我们想把 NULL 工资换成 0 呢?这时候 COALESCE() 就派上用场了。
COALESCE() —— 这是个函数,会返回你传进去的参数列表里第一个不是 NULL 的值。如果所有值都是 NULL,那它就返回 NULL。简单说,就是:“给我第一个靠谱的值就行!”
语法
COALESCE(value1, value2, ..., value_n)
value1、value2、...、value_n —— 这些就是你传给函数的参数。它会返回第一个不是 NULL 的值。
COALESCE() 的用法例子
来几个例子。
例子 1:把 NULL 换成 0
假设我们有张 salaries 表:
| id | name | salary |
|---|---|---|
| 1 | Otto | 50000 |
| 2 | Maria | NULL |
| 3 | Alex | 60000 |
| 4 | Anna | NULL |
我们想算一下工资总和——很简单:
SELECT SUM(salary) AS total_salary
FROM salaries;
SUM() 会自动忽略 NULL,所以没啥问题。
但如果我们想给每个员工都发 1000 奖金,再算总工资呢?
SELECT SUM(salary+1000) AS total_salary
FROM salaries;
这结果就不对劲了。最好的办法是直接用 COALESCE 把 NULL 换成 0。来看怎么写:
SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;
结果:
| total_salary |
|---|
| 110000 |
这样写更靠谱也更安全。
例子 2:把 NULL 换成默认值
比如我们有张 students 表,里面有名字和地址:
| id | name | address |
|---|---|---|
| 1 | Anna | Kanne |
| 2 | Peter | NULL |
| 3 | Lisa | Painful |
| 4 | Alex | NULL |
我们想把地址里的 NULL 换成“未填写”:
SELECT name, COALESCE(address, '未填写') AS resolved_address
FROM students;
查询结果:
| name | resolved_address |
|---|---|
| Anna | Kanne |
| Peter | 未填写 |
| Lisa | Painful |
| Alex | 未填写 |
例子 3:用多个值兜底
有时候 NULL 需要用一串值来兜底。比如我们想优先显示名字、朋友昵称,实在没有就用“无名氏”。users 表:
| user_id | first_name | short_name | full_name |
|---|---|---|---|
| 1 | John | Jonny | Johnny Walker |
| 2 | NULL |
Pete | Peter Kamen |
| 3 | NULL |
NULL |
SQL:
SELECT user_id,
COALESCE(first_name, short_name, '无名氏') AS display_name
FROM users;
结果:
| user_id | display_name |
|---|---|
| 1 | John |
| 2 | Pete |
| 3 | 无名氏 |
COALESCE() 的实际用法
实际开发里,COALESCE() 就是处理脏数据的救命稻草。
来看看它在各种场景下怎么帮忙。
例子 1:文本字段的值替换
原始 customers 表:
| id | name | address |
|---|---|---|
| 1 | Alex Lin | 123 Maple St |
| 2 | Maria Chi | NULL |
| 3 | Anna Song | 456 Oak Ave |
| 4 | Otto Art | NULL |
| 5 | Liam Park | 789 Pine Rd |
SQL:
SELECT name, COALESCE(address, '未填写') AS address
FROM customers;
结果:
| name | address |
|---|---|
| Alex Lin | 123 Maple St |
| Maria Chi | 未填写 |
| Anna Song | 456 Oak Ave |
| Otto Art | 未填写 |
| Liam Park | 789 Pine Rd |
例子 2:报表数据准备
原始 sales 表:
| id | product | price |
|---|---|---|
| 1 | Widget A | 100 |
| 2 | Widget B | NULL |
| 3 | Widget C | 250 |
| 4 | Widget D | NULL |
| 5 | Widget E | 300 |
SQL:
SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;
结果:
| total_sales |
|---|
| 650 |
用 COALESCE() 时常见的坑
虽然 COALESCE() 看起来简单又万能,但用的时候还是有几个坑要注意。
数据类型不匹配。传给 COALESCE() 的所有参数,数据类型要兼容。比如不能把字符串和数字混着用。
-- 错误示例
SELECT COALESCE(salary, '未填写') FROM employees;
-- salary 是数字字段,'未填写' 是文本。
忽略参数顺序。COALESCE() 返回第一个不是 NULL 的值,所以参数顺序很重要。
GO TO FULL VERSION