SQL Server通配符使用技巧:模糊匹配与中英文姓名区分
在SQL Server中,熟练掌握通配符是解决复杂数据筛选问题的关键。本文介绍如何利用LIKE运算符结合_、[]、[^]进行基础模糊匹配,以及如何借助PATINDEX函数处理更复杂的中文与英文混合字符识别场景。
基础通配符:_的单字符匹配
_符号用于匹配恰好一个字符。此特性常用于固定长度的字符串筛选,如身份证号码、特定代码或短名字过滤。
第1步:查找符合特定结尾的三字母名字
目的:从人名表中筛选出名字以an结尾且总长度为3个字母的记录。
- 入口:查询编辑器或SSMS。
- 操作:使用
WHERE FirstName LIKE '_an'。 - 参数说明:
_代表任意单字符,紧随其后的an为固定后缀。
--使用_运算符查找Person表中以an结尾的三字母名字
USE AdventureWorks2012;
GO
SELECT FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE '_an'
ORDER BY FirstName;
排除与范围:[^]和[]的使用
方括号[]定义了字符集,配合^可进行取反操作,适用于需要排除特定干扰字符的场景。
第2步:组合使用[^]进行排除筛选
目的:查找所有以Al开头,但第三个字母不是a的名字。
- 入口:同上。
- 动作:构建条件
'Al[^a]%'。 - 完成状态
%匹配剩余任意字符,[^a]确保第三位非a。
--使用[^]运算符在Contact表中查找所有名字以Al开头且第三个字母不是字母a的人
USE AdventureWorks2012;
GO
SELECT FirstName, LastName
FROM Person.Person
WHERE FirstName LIKE 'Al[^a]%'
ORDER BY FirstName;
第3步:利用[]界定数值范围
目的:识别地址中包含连续四位数字邮政编码的记录。
- 入口:连接人员、地址表后筛选。
- 动作:使用
WHERE a.PostalCode LIKE '[0-9][0-9][0-9][0-9]'。
--使用[]运算符查找其地址中有四位邮政编码的所有Adventure Works雇员的ID和姓名
USE AdventureWorks2012;
GO
SELECT e.BusinessEntityID, p.FirstName, p.LastName, a.PostalCode
FROM HumanResources.Employee AS e
INNER JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID
INNER JOIN Person.BusinessEntityAddress AS ea ON e.BusinessEntityID = ea.BusinessEntityID
INNER JOIN Person.Address AS a ON a.AddressID = ea.AddressID
WHERE a.PostalCode LIKE '[0-9][0-9][0-9][0-9]';
结果集中包含例如EmployeeID为290的Lynn Tsoflias,其邮政编码为3000。
进阶应用:PATINDEX处理中英文混合命名
当需求涉及Unicode字符(如中文汉字)时,基础LIKE能力有限。可利用PATINDEX函数配合字符区间(如[吖-坐]涵盖常见汉字GBK码位)来区分纯文本。
第4步:分类存储不同语言环境的名称
目的:将测试数据按“纯英文”、“纯中文”和“中英混合”进行分类打标。
- 准备条件:创建包含中文和英文名字的临时表
tb。 - 核心逻辑:
-[a-z]:定位拉丁字母。
-[吖-坐]:定位常见汉字区间。
- 结合UNION ALL输出不同标签。
--将一张表中名字为中英文的区分出来
create table tb(name nvarchar(20))
insert into tb values('kevin')
insert into tb values('kevin刘')
insert into tb values('刘')
select *,'Eng' from tb where patindex('%[a-z]%',name) > 0 and (patindex('%[吖-坐]%',name) = 0)
union all
select *,'CN' from tb where patindex('%[吖-坐]%',name) > 0 and patindex('%[a-z]%',name) = 0
union all
select *,'Eng&CN' from tb where (patindex('%[吖-坐]%',name) > 0) and patindex('%[a-z]%',name) > 0
运行后结果为:kevin标记为Eng,刘标记为CN,kevin刘标记为Eng&CN。
总结
日常开发中,简单的结构查询优先使用LIKE配合通配符提升可读性;面对涉及编码集、多语言混杂的高阶清洗任务时,可引入PATINDEX进行区间判断。以上就是SQL Server通配符使用的详细内容,更多关于数据库查询优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









