我需要在SQL Server 2008数据库表的varchar
字段中找到无效的社会安全号码。 (有效的SSN以###-##-####
格式定义 - 无论数字是什么,只要它们是“3位数字短划线2位数短划线4位数”模式。
我有一个工作正则表达式:
SELECT *
FROM mytable
WHERE ssn NOT LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'
这确实在列中找到了无效的SSN,但我知道(好吧 - 我很确定)有一种方法可以缩短它以指示前一个模式可以有x次迭代。
我认为这会奏效:
'[0-9]{3}-[0-9]{2}-[0-9]{4}'
但事实并非如此。
在选择中是否有比上面更短的正则表达式?或许有,但T-SQL / SQL Server 2008不支持它!?
如果您打算获得LIKE表达式的较短变体,那么答案是否定的。
在T-SQL中,您只能在模式中使用以下通配符:
% - 任何零个或多个字符的字符串。
WHERE title LIKE '%computer%'
在书名的任何地方找到所有书籍标题computer
。_(下划线) 任何一个角色。
WHERE au_fname LIKE '_ean'
找到所有以ean
(Dean,Sean等)结尾的四个字母的名字。 [] 指定范围内的任何单个字符([a-f]
)或set([abcdef]
)。WHERE au_lname LIKE '[C-P]arsen'
发现作者姓氏以arsen
结尾,并以C
和P
之间的任何单个字符开头,例如Carsen
,Larsen
,Karsen
等。在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同。 [^] 任何不在指定范围([^a-f]
)或集合([^abcdef]
)内的单个字符。
所以,你的LIKE
语句已经是最短的表达。没有限制量词可以使用(像{min,max}
那样),而不是像\d
这样的速记类。
如果您使用的是MySQL,则可以使用更丰富的正则表达式实用程序,但事实并非如此。
我建议你使用另一个这样的解决方案:
-- Use `REPLICATE` if you really want to use a number to repeat
Declare @rgx nvarchar(max) = REPLICATE('#', 3) + '-' +
REPLICATE('#', 2) + '-' +
REPLICATE('#', 4);
-- or use your simple format string
Declare @rgx nvarchar(max) = '###-##-####';
-- then use this to get your final `LIKE` string.
Set @rgx = REPLACE(@rgx, '#', '[0-9]');
你也可以使用像'_'
这样的字符然后用[A-Z]
替换它等等。