CodeGym /课程 /SQL SELF /用 COALESCE() 处理计算中的 NULL

用 COALESCE() 处理计算中的 NULL

SQL SELF
第 9 级, 课程 3
可用

今天我们又要深入聊聊 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 的值,所以参数顺序很重要。

2
任务
SQL SELF, 第 9 级, 课程 3
已锁定
将 NULL 值替换为默认值
将 NULL 值替换为默认值
2
任务
SQL SELF, 第 9 级, 课程 3
已锁定
多级优先级的NULL值替换
多级优先级的NULL值替换
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION