CodeGym /课程 /SQL SELF /NULLIF() 函数 —— 语法和使用示例

NULLIF() 函数 —— 语法和使用示例

SQL SELF
第 9 级 , 课程 4
可用

咱们来聊聊另一个用来搞定神秘 NULL 的函数 —— NULLIF()。有时候你需要把某些值变成 NULL,这样数据处理起来才不会出幺蛾子。系好安全带,这趟旅程会很有意思!

NULLIF() 这个函数在 PostgreSQL 里超好用,它能帮你比较两个值,如果一样就返回 NULL,不一样就返回第一个值。就像在说:“这俩值一样?那就别管了!”

函数的基本语法如下:

NULLIF(value1, value2)

如果 value1value2 相等,结果就是 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_namepreferred_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_namefirst_name 一样时,结果就是 NULL

例子 3:数据过滤

有时候你只想选出两个字段值不一样的行。比如有个订单表,里面有 original_pricediscounted_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_salarybonus。如果 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 数据处理高手又近了一步!

1
调查/小测验
和 NULL 打交道第 9 级,课程 4
不可用
和 NULL 打交道
和 NULL 打交道
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION