OR 拼接多个 LIKE 条件是最通用解法,兼容所有 SQL 数据库,语义清晰且可利用前缀索引;正则虽紧凑但性能差、索引支持弱;SUBSTRING+IN 方案存在长度固定、索引失效等缺陷。

LIKE 本身不支持多个前缀的“或”匹配
SQL 标准的 LIKE 只接受单个模式字符串,无法直接写成 column LIKE 'abc%' OR 'def%' OR 'xyz%' —— 这种语法会报错,因为 OR 左右必须是布尔表达式,而 'def%' 是字符串字面量,不是有效条件。
用 OR 拼接多个 LIKE 条件是最通用解法
兼容所有 SQL 数据库(MySQL、PostgreSQL、SQL Server、Oracle 等),语义清晰,执行计划也容易理解:
SELECT * FROM users WHERE name LIKE 'admin%' OR name LIKE 'test%' OR name LIKE 'dev%';
- 每个
LIKE独立走索引(如果列上有前缀索引或 B-tree 索引且模式不以通配符开头) - 注意:若前缀含前导通配符(如
LIKE '%abc'),索引基本失效 - 超过 5–10 个前缀时,语句变长,可读性下降,但仍是安全选择
正则替代方案(取决于数据库支持)
PostgreSQL 和 MySQL 8.0+ 支持正则,能更紧凑地表达多前缀:
- PostgreSQL:
WHERE name ~ '^((admin|test|dev).*)$' - MySQL 8.0+:
WHERE name REGEXP '^admin|^test|^dev'(^表示行首,等价于前缀) - 注意:正则通常比
LIKE慢,且无法利用标准 B-tree 索引加速;PostgreSQL 的pg_trgm扩展可优化部分正则,但需额外配置 - SQL Server 和 SQLite 原生不支持此类正则前缀匹配,强行用
LIKE+OR是唯一稳妥路径
避免用 IN + SUBSTRING 做前缀判断
有人尝试 WHERE SUBSTRING(name, 1, 3) IN ('adm', 'tes', 'dev'),这看似简洁,但有硬伤:
- 长度固定(比如只取前 3 字符),无法处理长度不同的前缀(如
'root'vs'a') -
SUBSTRING计算导致索引失效,全表扫描风险高 - 空值或短于指定长度的字段会返回
NULL或截断结果,逻辑易出错
真正需要动态多前缀匹配时,OR 套多个 LIKE 仍是首选。复杂场景下,把前缀列表提前存入临时表再 JOIN,反而更容易控制性能和可维护性。










