如何在SQL LIKE语句中转义加号(+)与减号(-)?
SQL LIKE 匹配加号(+)和减号(-)的正确方法
先看你遇到的核心问题:
执行这段SQL时:
Declare @email varchar(max) = '+' If @email LIKE '%[!#$%&''*+-/=?^_`{|}~]%' PRINT @email
加号(+)和减号(-)无法被正常匹配——因为在LIKE的字符类[]中,减号如果夹在两个字符之间,会被当作范围运算符(比如a-z表示从a到z的所有字符)。你写的*+-/会被SQL解析为「从*到/的字符范围」,而非单独的*、+、-、/,所以加号不在这个范围内,自然匹配失败。
另外,SQL Server的LIKE运算符不支持用\转义字符,所以你之前的转义操作完全无效。
正确处理方式
要让减号(-)作为普通字符被匹配,有两种可靠方法:
把减号放在字符类的开头或结尾
这样SQL不会将其识别为范围运算符,加号本身无需转义,直接放入字符类即可:Declare @email varchar(max) = '+' If @email LIKE '%[-!#$%&''*/=?^_`{|}~+]%' PRINT @email用方括号单独包裹减号
在字符类内部,用[-]表示普通的减号字符:Declare @email varchar(max) = '-' If @email LIKE '%[!#$%&''*+[-]/=?^_`{|}~]%' PRINT @email
验证示例
测试加号匹配:
Declare @email varchar(max) = '+' If @email LIKE '%[-!#$%&''*/=?^_`{|}~+]%' PRINT @email -- 正常输出"+"
测试减号匹配:
Declare @email varchar(max) = '-' If @email LIKE '%[-!#$%&''*/=?^_`{|}~+]%' PRINT @email -- 正常输出"-"
内容的提问来源于stack exchange,提问作者user8314628
相关产品推荐
相关产品推荐

