ILIKE是PostgreSQL中大小写不敏感的LIKE替代操作符,直接替换LIKE即可实现忽略大小写匹配,支持%、_等通配符及ESCAPE子句,可在WHERE和ON条件中直接使用,但无法利用普通索引加速%开头的模糊查询。

ILIKE 就是 LIKE 的大小写不敏感版,直接换掉就行
不用改表结构、不用加函数、不用设 COLLATE,只要把 LIKE 换成 ILIKE,查询就自动忽略大小写。比如查名字含 “admin” 的用户:WHERE name ILIKE '%admin%',能同时匹配 'Admin'、'ADMIN'、'admin123',而 LIKE 默认一个都捞不到。
ILIKE 支持所有 LIKE 的语法,但别乱套函数
ILIKE 完全兼容 LIKE 的通配符和转义写法,包括 %(任意长度)、_(单字符)、ESCAPE 子句。常见错误是画蛇添足:WHERE UPPER(name) ILIKE '%JOHN%' —— 这既没意义(ILIKE 本身已忽略大小写),又干扰执行计划;正确写法就是 WHERE name ILIKE '%john%' 或 WHERE name ILIKE 'John%'。
需要匹配字面量 % 或 _ 时,必须用 ESCAPE,例如查带下划线的标签:WHERE tag ILIKE '%\_%' ESCAPE '\'。
前缀匹配能走索引,%开头的全表扫描躲不掉
ILIKE 本身不直接利用普通 B-tree 索引,但前缀匹配('abc%')在默认 collation 下可命中索引;后缀('%xyz')或中段匹配('%abc%')必然全表扫描。
- 能走索引:
WHERE name ILIKE '张%'、WHERE email ILIKE 'user@%' - 无法走索引:
WHERE filename ILIKE '%.pdf'、WHERE title ILIKE '%error%' - 想加速
%...%类查询,得上pg_trgm扩展 + GIN 索引,不是靠改写ILIKE
JOIN 条件里直接用 ILIKE,别拆成 LOWER() 配对
多表关联时字段大小写不一致(比如用户表存小写邮箱,订单表存大写),直接在 ON 里用 ILIKE 最干净:ON users.email ILIKE orders.owner_email。别写成 ON LOWER(users.email) = LOWER(orders.owner_email) —— 多一次函数调用,且如果任一字段为 NULL,结果就是 NULL(不满足等值条件),而 ILIKE 对 NULL 的处理更符合直觉(NULL ILIKE 'xxx' 返回 NULL,不影响外连接逻辑)。
注意:ILIKE 是 PostgreSQL 特有语法,跨数据库迁移时得换成双 UPPER() 或适配目标库的方案。

















