我有一个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
与此。