我需要在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}'但事实并非如此。
在select中是否有比上面的正则表达式更短的正则表达式?或者也许有,但是there / Server 2008不支持它!?
发布于 2015-08-03 13:43:57
如果你计划得到类似表达式的一个较短的变体,那么答案是否定的。
在T-SQL中,只能在模式中使用以下通配符
% -任何零个或多个字符的字符串。
WHERE title LIKE '%computer%'在书名中的任何地方都可以找到所有带有单词computer的书名。 _ (下划线) 任何一个角色。WHERE au_fname LIKE '_ean'查找以ean结尾的所有四个字母的名字(迪恩、肖恩等)。 指定范围内的任何单个字符([a-f])或集([abcdef])。WHERE au_lname LIKE '[C-P]arsen'查找以arsen结尾的作者姓氏,以C和P之间的任何单个字符开头,例如Carsen、Larsen、Karsen等。在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同。^ 不在指定范围([^a-f])或集([^abcdef])内的任何单个字符。
因此,您的LIKE语句已经是最短的表达式。不能使用限制量词(如{min,max}),不能使用像\d这样的速记类。
如果您正在使用MySQL,您可以使用一组更丰富的regex实用程序,但事实并非如此。
发布于 2015-08-03 14:13:33
我建议你再用一个这样的解决方案:
-- 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]替换它,等等。
https://stackoverflow.com/questions/31788137
复制相似问题