SQL Server中LIKE不支持部分正则语法,需修改正则表达式吗?
解决SQL Server LIKE不支持正则语法的问题
嘿,我来帮你搞定这个问题!先给你划个重点:SQL Server里的LIKE根本不是标准正则表达式!它只有自己那套简单的通配符规则(比如%、_、[]),你用的{}(指定重复次数)和|(或逻辑)都是正则专属语法,LIKE完全不认,这就是你查不到结果的核心原因。
你的正则规则拆解与转换
先看你给出的ProductIdFormat正则:[0-9]{8}|[0-9]{7}|[c-dC-D][0-9][0-9][a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9],它其实是三个独立规则的“或”逻辑,我们需要把每个规则转换成LIKE能识别的格式,再用OR连接:
- 匹配8位数字:正则
[0-9]{8}→LIKE格式:'[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'(直接写8个[0-9]表示8位数字) - 匹配7位数字:正则
[0-9]{7}→LIKE格式:'[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' - 匹配C10PA0024这类格式:正则
[c-dC-D][0-9][0-9][a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9]→ 这个部分LIKE能直接识别,因为[]范围匹配是支持的,直接保留即可。
可直接运行的查询语句
把转换后的规则用OR连接,替换你原来的查询,就能得到正确结果了:
SELECT ProductId FROM Company WHERE -- 匹配8位数字(比如03555521) ProductId LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' -- 匹配7位数字 OR ProductId LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]' -- 匹配C10PA0024这类格式 OR ProductId LIKE '[c-dC-D][0-9][0-9][a-zA-Z][a-zA-Z][0-9][0-9][0-9][0-9]'
如果ProductIdFormat是表中存储的字段
如果你的ProductIdFormat是存在表中的字段(不是硬编码的字符串),可以用动态SQL来自动转换正则语法,比如:
DECLARE @likeSql NVARCHAR(MAX) -- 先替换正则里的重复次数语法 SELECT @likeSql = REPLACE(REPLACE(ProductIdFormat, '{8}', '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'), '{7}', '[0-9][0-9][0-9][0-9][0-9][0-9][0-9]') -- 再替换正则的或逻辑为SQL的OR条件 SET @likeSql = REPLACE(@likeSql, '|', ''' OR ProductId LIKE ''') -- 拼接完整查询语句 SET @likeSql = 'SELECT ProductId FROM Company WHERE ProductId LIKE ''' + @likeSql + '''' -- 执行动态SQL EXEC sp_executesql @likeSql
⚠️ 注意:动态SQL要注意SQL注入风险,如果ProductIdFormat的内容不可控,需要额外做安全校验。
内容的提问来源于stack exchange,提问作者CestDede
相关产品推荐
相关产品推荐

