咱们来聊聊另一个用来搞定神秘 NULL 的函数 —— NULLIF()。有时候你需要把某些值变成 NULL,这样数据处理起来才不会出幺蛾子。系好安全带,这趟旅程会很有意思!
NULLIF() 这个函数在 PostgreSQL 里超好用,它能帮你比较两个值,如果一样就返回 NULL,不一样就返回第一个值。就像在说:“这俩值一样?那就别管了!”
函数的基本语法如下:
NULLIF(value1, value2)
如果 value1 和 value2 相等,结果就是 NULL。如果不等,结果就是 value1。
例子:
SELECT NULLIF(10, 10); -- 结果: NULL
SELECT NULLIF(10, 20); -- 结果: 10
SELECT NULLIF('hello', 'hello'); -- 结果: NULL
SELECT NULLIF('hello', 'world'); -- 结果: 'hello'
是不是很简单?现在我们来看看怎么在实际问题里用这个函数。
例子 1:防止除以零
除以零是所有程序员的噩梦。在 SQL 里你要是敢除以零,直接报错。这时候 NULLIF() 就能救你一命。
想象一下:有个 sales 表,里面有两个字段:revenue(收入)和 expenses(支出)。我们想算一下支出回报率(revenue / expenses),但有时候支出是 0。如果直接写查询不做判断,肯定会遇到除零错误。
sales 表:
| revenue | expenses |
|---|---|
| 1000 | 200 |
| 1500 | 0 |
| 2000 | 250 |
错误的查询:
SELECT revenue / expenses AS profitability
FROM sales;
-- 错误: 除以零!
用 NULLIF() 解决:
SELECT revenue / NULLIF(expenses, 0) AS profitability
FROM sales;
结果:
| profitability |
|---|
| 5.00 |
| NULL |
| 8.00 |
现在,如果 expenses 是 0,NULLIF(expenses, 0) 就会返回 NULL,而除以 NULL 不会报错,只会返回 NULL。
例子 2:把相同的值变成 NULL
假如你有个学生表,里面有 first_name 和 preferred_name 字段。有些学生喜欢用真名,有些喜欢用别名。如果两个名字一样,其实没必要显示 preferred_name。
students 表:
| first_name | preferred_name |
|---|---|
| John | Johnny |
| Anna | Anna |
| Alex | Lex |
用 NULLIF() 查询:
SELECT first_name,
NULLIF(preferred_name, first_name) AS display_name
FROM students;
结果:
| first_name | display_name |
|---|---|
| John | Johnny |
| Anna | NULL |
| Alex | Lex |
当 preferred_name 和 first_name 一样时,结果就是 NULL。
例子 3:数据过滤
有时候你只想选出两个字段值不一样的行。比如有个订单表,里面有 original_price 和 discounted_price。我们要找出那些有打折的订单。
orders 表:
| order_id | original_price | discounted_price |
|---|---|---|
| 1 | 100 | 100 |
| 2 | 200 | 180 |
| 3 | 150 | 150 |
用 NULLIF() 查询:
SELECT order_id, original_price, discounted_price
FROM orders
WHERE NULLIF(original_price, discounted_price) IS NOT NULL;
结果:
| order_id | original_price | discounted_price |
|---|---|---|
| 2 | 200 | 180 |
只有有打折的订单才会出现在结果里。
NULLIF() 的实用场景
场景 1:选择可选值
有时候你要从多个字段里选一个值,但要排除掉某些特定值。比如有个员工表,里面有 base_salary 和 bonus。如果 bonus 是 0,我们想把它变成 999。
employees 表:
| employee_id | base_salary | bonus |
|---|---|---|
| 1 | 50000 | 10000 |
| 2 | 40000 | 0 |
| 3 | 60000 | 5000 |
用 NULLIF() 查询:
SELECT employee_id,
base_salary + COALESCE(NULLIF(bonus, 0), 999) AS total_salary
FROM employees;
结果:
| employee_id | total_salary |
|---|---|
| 1 | 60000 |
| 2 | 40999 |
| 3 | 65000 |
如果 bonus 是 0,它就会变成 999。
场景 2:统计行数
我们可以用 NULLIF() 简化复杂的过滤条件。比如有个用户表,我们想一次查出总用户数和注册用户数(不包括 guest 状态)。
SELECT
COUNT(*) AS total_users,
COUNT(NULLIF(status, 'guest')) AS registered_users
FROM users;
就这样,只用一个 NULLIF() 函数,我们就能搞定很多事:从防止报错到让代码更清晰。现在你知道它怎么用了,离 PostgreSQL 数据处理高手又近了一步!
GO TO FULL VERSION