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