PostgreSQL LIKE 子句(实战指南)

PostgreSQL LIKE 子句:轻松掌握模糊查询的利器

在日常开发中,我们经常会遇到这样的场景:用户输入一个关键词,比如“张”,希望查出所有姓张的人;或者想搜索包含“邮件”字样的邮箱地址。这时候,精确匹配(=)就显得力不从心了。这时候,PostgreSQL 提供的强大功能——LIKE 子句,就派上用场了。

LIKE 子句是 SQL 中用于模式匹配的重要工具,尤其适用于文本字段的模糊搜索。它让你可以基于特定的模式来筛选数据,而不需要完全匹配整个字符串。它就像一个“智能过滤器”,能帮你从海量数据中快速找出符合条件的记录。

想象一下你在图书馆找书。如果你只知道书名里有“编程”两个字,但不知道全名,直接用“= 编程”肯定找不到。但如果你说“书名里包含‘编程’”,图书馆员就能帮你定位到所有相关书籍。LIKE 子句就相当于这个“智能过滤器”。


LIKE 子句的基本语法与核心符号

LIKE 子句的基本语法非常直观:

SELECT column_name
FROM table_name
WHERE column_name LIKE 'pattern';

其中,pattern 是你要匹配的模式,它支持两个关键通配符:

  • %:代表任意数量的字符(包括零个字符)
  • _:代表恰好一个字符

举个例子,如果想找出所有名字以“张”开头的人:

SELECT name
FROM users
WHERE name LIKE '张%';

这里,'张%' 表示:以“张”开头,后面可以跟任意数量的字符。所以“张三”“张小明”“张伟”都会被匹配。

再比如,查找名字是三个字且第三个字是“明”的人:

SELECT name
FROM users
WHERE name LIKE '__明';

这里的 __明 表示前两个字符任意,第三个字符必须是“明”。所以“李明”“王明”会被匹配,但“张伟”不会。

💡 小贴士% 是最常用的通配符,相当于“任意长度的字符串”。而 _ 更精确,用于匹配固定长度的字符。


常见用法场景与实战案例

匹配开头或结尾

当你需要查找以某个字符串开头的数据时,用 % 放在结尾即可。

比如,查找所有以“admin”开头的用户名:

SELECT username
FROM users
WHERE username LIKE 'admin%';

这会返回 adminadmin_useradmin_panel 等所有以“admin”开头的用户名。

反过来,如果想查以“.jpg”结尾的文件名:

SELECT file_name
FROM files
WHERE file_name LIKE '%.jpg';

这能精准筛选出所有图片文件,即使文件名很长也没问题。

模糊中间匹配

有时候我们只记得某个关键词出现在字符串中间。比如,想查所有包含“测试”两个字的订单备注:

SELECT order_id, remark
FROM orders
WHERE remark LIKE '%测试%';

这里的 %测试% 表示:前面任意,中间有“测试”,后面也任意。所以“测试用例”“测试通过”“系统测试”都会被查出来。

实战建议:在搜索功能中,这种“任意位置包含关键词”的查询非常常见。可以配合前端输入框动态构建 LIKE 模式。


大小写敏感性与不区分大小写的写法

PostgreSQL 的 LIKE 默认是区分大小写的。比如:

SELECT name
FROM users
WHERE name LIKE 'zhang%';

这条语句只会匹配“zhang”开头的名字,而“Zhang”“Zhang123”不会被匹配。

如果你希望忽略大小写,可以使用 ILIKE(Insensitive LIKE):

SELECT name
FROM users
WHERE name ILIKE 'zhang%';

ILIKE 会将“zhang”“Zhang”“ZHANG”都视为匹配项。

⚠️ 注意:ILIKE 是 PostgreSQL 特有的语法,不是所有数据库都支持。如果你在 MySQL 或 SQLite 中开发,需要使用 UPPER()LOWER() 函数来实现类似效果。


使用 ESCAPE 关键字处理特殊字符

当你的搜索模式中包含 %_ 本身时,它们会被当作通配符,这就可能出错。比如,你想查找文件名中包含 % 字符的记录:

SELECT file_name
FROM files
WHERE file_name LIKE '%\%%';

但这里 % 会被解释为通配符,导致查询失效。

这时就需要用 ESCAPE 关键字来转义特殊字符。例如:

SELECT file_name
FROM files
WHERE file_name LIKE '%\%%' ESCAPE '\';

ESCAPE '\' 告诉数据库:\ 是转义符。所以 \% 就表示字面意义的 %,而不是通配符。

同样,如果想匹配 _,可以写成 \_

SELECT file_name
FROM files
WHERE file_name LIKE '%\_test%' ESCAPE '\';

这表示查找包含“_test”的文件名,而不是匹配一个字符加“test”。

🧠 形象比喻ESCAPE 就像在字符串中给特殊字符加“引号”,告诉数据库:“别急,这个字符不是通配符,它是普通字符。”


与 NOT LIKE 的搭配使用

除了 LIKE,你还可以使用 NOT LIKE 来排除某些模式。

比如,查出所有用户名不以“test”开头的用户:

SELECT username
FROM users
WHERE username NOT LIKE 'test%';

这在清理数据或筛选非测试账号时非常有用。

再比如,排除所有邮箱中包含“spam”字样的记录:

SELECT email
FROM users
WHERE email NOT LIKE '%spam%';

这样可以有效过滤掉垃圾邮件来源。


性能优化建议:何时该用 LIKE,何时不该用

虽然 LIKE 很强大,但使用不当会影响性能。以下是一些关键建议:

1. 避免前导通配符

如果写成 LIKE '%abc',数据库无法使用索引,必须全表扫描,效率极低。

比如:

-- ❌ 不推荐:前导通配符,性能差
SELECT name FROM users WHERE name LIKE '%明';

2. 优先使用前缀匹配

如果可能,尽量让通配符在末尾,比如 LIKE 'abc%',这时数据库可以使用 B-Tree 索引快速定位。

-- ✅ 推荐:前缀匹配,可走索引
SELECT name FROM users WHERE name LIKE '张%';

3. 考虑使用全文搜索

对于复杂的模糊搜索(如多个关键词、词干匹配等),建议使用 PostgreSQL 的 tsvectortsquery 实现全文搜索,性能远优于 LIKE


实际项目中的应用示例

假设你正在开发一个电商后台系统,需要实现商品搜索功能。用户输入“运动鞋”想查所有相关商品。

SELECT product_name, price
FROM products
WHERE product_name ILIKE '%运动鞋%'
   OR product_name ILIKE '%跑鞋%'
   OR product_name ILIKE '%运动鞋%'
   OR product_name ILIKE '%运动休闲鞋%';

这个查询会返回所有包含“运动鞋”“跑鞋”等关键词的商品,支持大小写不敏感,非常实用。

如果你的搜索需求更复杂,还可以将 LIKEORAND 结合,构建更灵活的查询逻辑。


总结与建议

PostgreSQL LIKE 子句 是处理模糊查询的得力工具,掌握它能让你在开发中更灵活地应对各种搜索需求。从基础的前缀匹配,到中间匹配、大小写不敏感搜索,再到特殊字符处理,它覆盖了大多数实际场景。

但也要注意:LIKE 不是万能的。在性能要求高的场景下,应避免使用前导通配符,优先考虑索引优化或使用全文搜索功能。

最后,记住一点:好的查询,不仅要有功能,还要有性能。在使用 LIKE 时,多思考一下是否可以优化模式,是否能利用索引,会让你的系统跑得更快、更稳。

掌握 LIKE,就是掌握了一种更聪明的“找数据”方式。希望这篇教程能帮你真正理解并灵活运用它。