请说明 (NOT) LIKE 运算子是用来做什么的?
2022年9月29日
💎 加入 E+ 成長計畫 如果你喜歡我們的內容,歡迎加入 E+,獲得更多深入的軟體前後端內容
LIKE
运算子是用来做模糊搜寻时使用的,它可以协助我们找到「具有特定模式」的资料,在使用上经常会搭配 %
来用。而 NOT LIKE
则是反过来,它可以协助我们找到「不具」特定模式的资料。举例来说,在读取、更新、删除上,我们可以这样使用 LIKE
-- 读取具有某个模式的资料
SELECT column FROM table_name WHERE column LIKE pattern;
-- 更新具有某个模式的资料
UPDATE table_name SET column=value WHERE column LIKE pattern;
-- 删除具有某个模式的资料
DELETE FROM table_name WHERE column LIKE pattern;
让我们透过实战题目来了解,LeetCode 的 1873. Calculate Special Bonus 正好是可以透过NOT LIKE
解的题目。
题目给了一个叫 Employees
的表 (如下),要我们算出每个员工的 bonus
。每位员工的bonus
是根据以下条件计算,如果员工的 ID 要是奇数,以及员工的名字开头不能是M
,则可以拿到薪水100%
的bonus
;如果不符合上述条件,拿到的bonus
会是0
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| employee_id | int |
| name | varchar |
| salary | int |
+-------------+---------+
看到题目给的范例。根据输入的 Employees
表,我们可以看到,有拿到 bonus
的只有 Addilyn 跟 Kannon。 Michael 虽然 ID 是奇数,但因为名字开头是 M
所以只拿到 0
;Juan 虽然名字开头不是 M
但因为 ID 是偶数,所以也是拿到 0
。
输入:
Employees table:
+-------------+---------+--------+
| employee_id | name | salary |
+-------------+---------+--------+
| 2 | Meir | 3000 |
| 3 | Michael | 3800 |
| 7 | Addilyn | 7400 |
| 8 | Juan | 6100 |
| 9 | Kannon | 7700 |
+-------------+---------+--------+
输出:
+-------------+-------+
| employee_id | bonus |
+-------------+-------+
| 2 | 0 |
| 3 | 0 |
| 7 | 7400 |
| 8 | 0 |
| 9 | 7700 |
+-------------+-------+
使用 NOT LIKE
上面提到 LIKE
可以用来搜寻具有特定模式的资料、NOT LIKE
可以用来搜寻不具特定模式的资料。而在这一题,「名字开头不是 M
」这个条件,正是要搜寻「不具 M
」这个特定模式,所以我们可以用 NOT LIKE
,把这句转换成 SQL 语法会变成:
-- 名字不为 M 开头
name NOT LIKE 'M%'
而这一题的完整解答如下:
SELECT employee_id,
IF (employee_id % 2 != 0 AND name NOT LIKE 'M%', salary, 0) as bonus
FROM Employees ORDER BY employee_id