SQL LIKE运算符中竖线的用法及多前缀匹配实现
如何用单个LIKE运算符实现多前缀匹配?
我想把下面两个用OR连接的LIKE查询合并成单个LIKE比较:
SELECT * FROM dbo.Departments D WHERE D.SystemKey LIKE 'SCI%' OR D.SystemKey LIKE 'FOO%';
我尝试了下面的写法,以为方括号加竖线能匹配以'SCI'或'FOO'开头的SystemKey:
SELECT * FROM dbo.Departments D WHERE D.SystemKey LIKE '[SCI|FOO]%';
但实际返回的是所有以'S'、'C'、'I'、'|'、'F'或'O'开头的行,和预期不符。
我知道可以用下面的语句实现需求:
SELECT * FROM dbo.Departments D WHERE LEFT(D.SystemKey, 3) IN('SCI','FOO');
但我想知道有没有办法通过单个LIKE运算符的字符串比较来实现。
我用来测试的建表和插入数据代码如下:
CREATE TABLE dbo.Departments ( DepartmentID int IDENTITY(1,1) PRIMARY KEY, SystemKey nvarchar(10), Description nvarchar(50) ); GO INSERT dbo.Departments ( SystemKey, Description ) SELECT V.SystemKey, V.Description FROM ( VALUES (N'SCI001', N'Science 1'), (N'SCI010', N'Science 2'), (N'SCI011', N'Science 3'), (N'MAT001', N'Mathematics 1'), (N'MAT010', N'Mathematics 2'), (N'MAT011', N'Mathematics 3'), (N'SPA001', N'Spanish 1'), (N'SPA010', N'Spanish 2'), (N'SPA011', N'Spanish 3'), (N'FOO001', N'Food Technology 1'), (N'FOO010', N'Food Technology 2'), (N'FOO011', N'Food Technology 3'), (N'CAL001', N'Calisthenics 1'), (N'CAL010', N'Calisthenics 2'), (N'CAL011', N'Calisthenics 3') ) AS V(SystemKey, Description); GO
另外,下面的写法在当前测试数据中能得到正确结果,但如果存在以'FCO'开头的SystemKey,就会返回额外的错误结果:
SELECT * FROM dbo.Departments D WHERE D.SystemKey LIKE '[SF][CO][IO]%';
注:此问题曾被标记为重复,但关联问题聚焦于SQL Server中RegEx的使用,而本问题关注LIKE表达式的有限模式匹配语法。
结论
SQL Server的LIKE运算符原生语法不支持在单个模式中直接定义多个完整的前缀分支(类似正则表达式中(SCI|FOO)%的分支逻辑)。LIKE的方括号仅用于定义单个字符的可选集合,竖线|在LIKE模式中只是普通字符,没有“或”的语义。
如果必须用LIKE实现需求,只能保留OR连接两个LIKE条件的写法,这是最清晰且无歧义的方案:
SELECT * FROM dbo.Departments D WHERE D.SystemKey LIKE 'SCI%' OR D.SystemKey LIKE 'FOO%';
你提到的LEFT(D.SystemKey, 3) IN('SCI','FOO')也是高效可行的方案,尤其是当SystemKey列有索引时,这个写法能利用索引前缀扫描,性能可能优于LIKE(取决于索引情况)。
内容的提问来源于stack exchange,提问作者Fletch
相关产品推荐
相关产品推荐

