SQL Server语言 - Regex模式只匹配字母数字字符



我有一个nvarchar(50)列myCol,其值类似于这些16位数字,字母数字值,以'0'开头:0b00d60b8d6cfb19, 0b00d60b8d6cfb05, 0b00d60b8d57a2b9

我试图删除行与myCol值不匹配的这3个标准。

通过这篇文章,我能够选择以"0"开头的记录。然而,尽管正则表达式的[a-z0-9]部分,它也继续选择myCol值包含特殊字符,如00-d@!b8-d6/f&#b。下面是我的select查询:

SELECT * from Table
WHERE myCol LIKE '[0][a-z0-9]%' AND LEN(myCol) = 16

表达式如何更改为仅选择不包含特殊字符的myCol值的行?

如果值必须只包含a-z和数字,并且必须以0开头,则可以使用以下命令:

SELECT *
FROM (VALUES(N'0b00d60b8d6cfb19'),
(N'0b00d60b8d6cfb05'),
(N'0b00d60b8d57a2b9'),
(N'00-d@!b8-d6/f&#b'))V(myCol)
WHERE V.myCol LIKE '0%' --Checks starts with a 0
AND V.myCol NOT LIKE '%[^0-9A-z]%' --Checks only contains alphanumerical characters
AND LEN(V.myCol) = 16;

第二个子句的工作原理是LIKE将匹配不是字母数字字符的任何字符。然后(显然)NOT将其反转,这意味着只有当值仅包含字母数字字符时,表达式才解析为TRUE。

SQL Server中的模式匹配不是很好,目前还没有真正的正则表达式支持。

模式中的%是包含示例中显示的特殊字符的内容。[a-z0-9]只匹配一个字符。如果你的字符长度是16,你只对字母和数字感兴趣,那么你可以为每个字符包含一个模式:

SELECT *
FROM Table
WHERE myCol LIKE '[0][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9]';

注意:你不需要AND LEN(myCol) = 16与此。

最新更新