SQL Server列匹配自定义模式求助:含function及5-8位字母数字串
解决SQL Server中匹配包含特定字符串+5-8位字母数字序列的问题
首先,咱们先拆解你遇到的问题:你需要筛选出包含'function'(不区分大小写)且存在至少一段5-8位连续字母数字的行,之前的尝试没成功主要是因为SQL Server的LIKE语法不支持正则量词(比如{5,8}),而且匹配'function'的条件写得不对。
你的原语句问题分析
like '%function':这个只会匹配以'function'结尾的字符串,而你需要的是包含'function',所以应该改成%function%。'%[a-z0-9]{6}%':SQL Server的LIKE不支持{n}这种正则量词语法,无法直接指定重复次数,得换一种写法。
正确的解决方案
因为SQL Server的原生LIKE不支持量词,咱们可以用多个OR条件来覆盖5-8位的连续字母数字匹配,同时处理不区分大小写的需求:
SELECT * FROM ab WHERE -- 不区分大小写匹配包含'function'的行,两种方式选其一即可 -- 方式1:转小写后匹配 LOWER(ab.a) LIKE '%function%' -- 方式2:使用不区分大小写的排序规则(性能可能更好,避免全表转小写) -- ab.a COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%function%' -- 匹配存在5-8位连续字母数字的行 AND ( -- 匹配5位连续字母数字 ab.a LIKE '%[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]%' -- 匹配6位 OR ab.a LIKE '%[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]%' -- 匹配7位 OR ab.a LIKE '%[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]%' -- 匹配8位 OR ab.a LIKE '%[a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]%' )
说明
- 不区分大小写处理:
- 用
LOWER(ab.a)把列值转成小写后匹配%function%,简单直接。 - 用
COLLATE SQL_Latin1_General_CP1_CI_AS指定不区分大小写的排序规则,不需要转换列值,对大表来说性能更优。
- 用
- 字母数字匹配:
[a-z0-9]在不区分大小写的规则下会自动匹配大写字母,所以不用额外写[A-Z]。- 每个
LIKE条件对应一种长度的连续字母数字序列,用OR组合就能覆盖5-8位的所有情况。
- 针对你的示例数据:
- 行1包含'function',且有8位(123BA689)和7位(BAS54256)的序列,会被选中。
- 行2包含'function',且有7位(CHD12234)的序列,会被选中。
- 行3不包含'function',所以会被排除,符合你的期望输出。
如果你的需求更复杂(比如要排除那些字母数字序列是更长序列的一部分),可以结合PATINDEX和字符串长度判断,但对于当前需求来说,上面的写法已经足够简洁有效。
内容的提问来源于stack exchange,提问作者logziii
相关产品推荐
相关产品推荐

