请说明 (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
🧵 如果你想收到最即時的內容更新,可以在 FacebookInstagram 上追蹤我們