SQL LIKE 查询的一个问题

在做用户管理的时候,用户表(users) 有一个字段(dept)用来存储用户所在部门的信息, 字段的值一般是这样的,各级部门间使用横杠分隔:

XX宝-技术部
XX宝-技术部-数据仓库


1
2
3
4
5

我们的系统有一个根据用户所在部门进行过滤的功能,所以我们用了类似下面的查询语句:

SELECT * FROM users WHERE dept LIKE "XX宝-技术部%";


1
2
3
4

这样的性能还好,但是今天发现一个问题是,当有两个部门名称很相似,比如:

XX宝-CEO
XX宝-CEO办公室

1
2
3
4

这时在查询 XX宝CEO 的时候就会把 XX宝-CEO办公室 的用户也查询出来。

于是想到正则表达式:

SELECT *
FROM users
WHERE REGEXP_LIKE(dept, "^XX宝-CEO$")
OR REGEXP_LIKE(dept, "^XX宝-CEO-[\w\-]+");

1
2
3
4
5
6

合并正则表达式的另一解:

SELECT *
FROM users
WHERE REGEXP_LIKE(dept, "^XX宝-CEO($|-[\w\-]+)");

1
2
3
4
5

杯具的性能问题。

突然想到

SELECT *
FROM users
WHERE dept="XX宝-CEO"
OR dept LIKE "XX宝-CEO-%";

1
2
3
4
5
6

于是简单有效的解决了这个问题。

Help
[count]gg 跳转到第 [count] 行,默认第 1 行。
[count]G 跳转到第 [count] 行,默认最后一行。
[count]j 向下跳转 [count] 行,默认跳转一行。
[count]k 向上跳转 [count] 行,默认跳转一行。
/ 开始搜索。按 <Esc> 退出。
gh 跳转到首页。
gb 跳转到博客首页。
gw 跳转到 Wiki 首页。
gt 跳转到我的 Twitter Profile 页。
gp 跳转到我的 Github Profile 页。
? 打开帮助。按 <Esc> 退出。