代码之家  ›  专栏  ›  技术社区  ›  Zuzi Mufu

SQL Server-正则表达式模式仅匹配字母数字字符

  •  1
  • Zuzi Mufu  · 技术社区  · 2 年前

    我有一个nvarchar(50)专栏 myCol 对于以下16位字母数字值,以“0”开头: 0b00d60b8d6cfb19, 0b00d60b8d6cfb05, 0b00d60b8d57a2b9

    我正在尝试使用删除行 麦可尔 不符合这三个标准的值。

    跟随 this article ,我可以选择以“0”开头的记录。然而,尽管 [a-z0-9] 作为正则表达式的一部分,它还不断选择 麦可尔 包含特殊字符的值,如 00-d@!b8-d6/f&#b .以下是我的选择查询:

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

    如何将表达式更改为仅选择具有 麦可尔 不包含特殊字符的值?

    2 回复  |  直到 2 年前
        1
  •  4
  •   Thom A    2 年前

    如果值必须仅包含a-z和数字,并且必须以a开头 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 然后(显然)将其反转,这意味着只有当值 只有 包含字母数字字符。

        2
  •  3
  •   squillman Johnny Fitz    2 年前

    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 用这个。