SQL 服务器 - 正则表达式模式仅匹配字母数字字符

SQL Server - Regex pattern match only alphanumeric characters

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

我正在尝试删除 myCol 值不符合这 3 个条件的行。

通过关注 this article,我能够 select 以“0”开头的记录。然而,尽管正则表达式的 [a-z0-9] 部分,它也保留 selecting myCol 包含特殊字符如 00-d@!b8-d6/f&#b 的值。下面是我的 select 查询:

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

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

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

您的模式中的 % 包括您在示例中显示的特殊字符。 [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

如果值只能包含 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 然后(显然)颠倒了这一点,这意味着只有当值 only 包含字母数字字符时,表达式才解析为 TRUE。