首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >社会保障号码的( Server 2008 R2)

社会保障号码的( Server 2008 R2)
EN

Stack Overflow用户
提问于 2015-08-03 13:05:33
回答 2查看 4.5K关注 0票数 4

我需要在Server 2008数据库表中的varchar字段中查找无效的社会保险号码。(有效的SSN被定义为###-##-####格式-不管数字是什么,只要它们是“3位破折号2位数字破折号4位”模式。)

我确实有一个工作准则:

代码语言:javascript
复制
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次迭代。

我以为这会成功的:

代码语言:javascript
复制
'[0-9]{3}-[0-9]{2}-[0-9]{4}'

但事实并非如此。

在select中是否有比上面的正则表达式更短的正则表达式?或者也许有,但是there / Server 2008不支持它!?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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结尾的作者姓氏,以CP之间的任何单个字符开头,例如CarsenLarsenKarsen等。在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同。^ 不在指定范围([^a-f])或集([^abcdef])内的任何单个字符。

因此,您的LIKE语句已经是最短的表达式。不能使用限制量词(如{min,max}),不能使用像\d这样的速记类。

如果您正在使用MySQL,您可以使用一组更丰富的regex实用程序,但事实并非如此。

票数 2
EN

Stack Overflow用户

发布于 2015-08-03 14:13:33

我建议你再用一个这样的解决方案:

代码语言:javascript
复制
-- 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]替换它,等等。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31788137

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档