社交安全号码的T-SQL Regex(SQL Server 2008 R2)

问题描述 投票:2回答:2

我需要在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不支持它!?

sql-server regex tsql sql-server-2008-r2
2个回答
1
投票

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

所以,你的LIKE语句已经是最短的表达。没有限制量词可以使用(像{min,max}那样),而不是像\d这样的速记类。

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


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]替换它等等。

© www.soinside.com 2019 - 2024. All rights reserved.