2015-08-03 61 views
0

我需要在SQL Server 2008数据库表的varchar字段中找到无效的社会安全号码。 (有效的SSN的格式为###-##-#### - 只要数字是“3位破折号2位破折号4位”的数字就没有关系。社会安全号码(SQL Server 2008 R2)的T-SQL正则表达式

我确实有一个工作正则表达式:

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]' 

这确实发现该列中的无效核潜艇,但我知道(好吧 - 我敢肯定)有缩短的是,表明先前的模式可以有办法x迭代

我认为这样会工作:

'[0-9]{3}-[0-9]{2}-[0-9]{4}' 

但事实并非如此。

在选择中是否存在比上面那个更短的正则表达式?或者也许有,但T-SQL/SQL Server 2008不支持它!?

+1

TSQL没有原生Regex支持。它支持你使用的'LIKE',但这是一种非常简单的语言 - 根本不是真正的正则表达式。一个更好的计划可能是只存储9位数字(为此创建约束非常简单),只需在显示* SSN时插入破折号 - 除非实际需要支持存储无效数据。 –

回答

1

如果您打算获得LIKE表达式的较短变体,那么答案是否定的。

T-SQL,您只能使用以下通配符在模式


- 零个或多个字符的任意字符串。 WHERE title LIKE '%computer%'可在书名的任何位置找到所有的书名,字词computer

_(下划线)
任何单个字符。 WHERE au_fname LIKE '_ean'找到以ean(Dean,Sean等)结尾的所有四个字母的名字。
[]
指定范围内的任何单个字符([a-f])或集合([abcdef])。 WHERE au_lname LIKE '[C-P]arsen'将查找姓氏与arsen等结束和开始CP之间的任何单个字符,例如CarsenLarsenKarsen,和。在范围搜索中,范围中包含的字符可能因排序规则而异。
[^]
任何单个字符不在指定范围内([^a-f])或集合([^abcdef])。

因此,您的LIKE声明已经是最短的表达式。没有限制量词可以使用(如{min,max}),而不是速记类如\d

如果您使用MySQL,您可以使用更丰富的正则表达式实用程序,但事实并非如此。

+1

好的。谢谢你的解释,stribizhev。 – marky

0

我建议你使用这样的另一种解决方案:

-- 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

这对OP有什么好处? –