SQL Server中LIKE模式匹配异常:为何[D]?[0-9]*%无法匹配?
SQL Server中LIKE通配符与正则表达式的区别及解决方案
你遇到的问题本质是SQL Server的LIKE操作符不支持标准正则表达式语法,它用的是一套专属的通配符规则,和你熟悉的正则完全是两码事,咱们拆解来看:
为什么第二个语句无法匹配?
先明确LIKE里的几个符号和正则的核心差异:
[]:这个是LIKE和正则都支持的字符范围匹配,所以[D]匹配单个D没问题;?:在正则里是“匹配前面的元素零次或一次”,但在LIKE里,它只代表单个问号字符,不是你想要的可选匹配逻辑;*:在正则里是“匹配前面的元素零次或多次”,但在LIKE里,它的作用是匹配零或多个任意字符(等价于正则的.*),你这里写的[0-9]*%逻辑完全重复,因为*已经覆盖了%的作用,组合起来自然达不到预期效果。
而第一个语句[D][0-9]%能生效,是因为它完全符合LIKE的规则:先匹配一个D,再匹配一个数字,最后匹配任意后续字符。
怎么解决?
根据你的需求,分两种场景给方案:
场景1:用LIKE实现等价逻辑(兼容所有SQL Server版本)
如果你要实现的是**“可选的D开头,后面跟零或多个数字,再后面任意字符”**(对应正则^D?\d*.*),用LIKE可以这么写:
SELECT * FROM MyTable WHERE MyColumn LIKE 'D%' -- 匹配所有D开头的情况(包括D+数字、D+其他字符) OR MyColumn LIKE '[0-9]%' -- 匹配数字开头的情况 OR MyColumn = ''; -- 如果需要匹配空字符串的话加上这条
如果是严格的**“D开头,后面跟零或多个数字,再任意字符”**(对应正则^D\d*.*),LIKE写法可以调整为:
SELECT * FROM MyTable WHERE MyColumn LIKE 'D[0-9]%' -- D+至少一个数字+后续字符 OR (MyColumn LIKE 'D%' AND MyColumn NOT LIKE 'D[^0-9]%'); -- D开头,后面没有非数字(即D后全是数字或空)
场景2:用正则函数(SQL Server 2016及以上版本)
从SQL Server 2016开始,官方支持REGEXP_LIKE函数(需要把数据库兼容性级别设为130或更高),这时候你就可以直接用标准正则语法了:
比如要匹配“可选D开头,后面零或多个数字”的字符串:
SELECT * FROM MyTable WHERE REGEXP_LIKE(MyColumn, '^D?[0-9]*');
如果要匹配“可选D开头,后面零或多个数字,再任意后续字符”,正则调整为^D?[0-9].*即可:
SELECT * FROM MyTable WHERE REGEXP_LIKE(MyColumn, '^D?[0-9].*');
补充:旧版本SQL Server的正则方案
如果你的SQL Server版本低于2016,没有REGEXP_LIKE,可以考虑创建CLR自定义函数来实现正则匹配,但这种方式需要服务器权限,一般优先推荐用LIKE模拟,或者升级版本。
内容的提问来源于stack exchange,提问作者Lokomotywa
相关产品推荐
相关产品推荐

