Sql server 社会保险号的T-SQL正则表达式(SQL Server 2008 R2)
我需要在SQL Server 2008数据库表的Sql server 社会保险号的T-SQL正则表达式(SQL Server 2008 R2),sql-server,regex,tsql,sql-server-2008-r2,Sql Server,Regex,Tsql,Sql Server 2008 R2,我需要在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,但我知道(好的,我非常确定)有一种方法可以缩短
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中是否有比上面的正则表达式更短的正则表达式?或者可能有,但T-SQL/SQL Server 2008不支持它!?如果您计划获得一个更短的同类表达式变体,那么答案是否定的 在中,您只能在模式中使用以下通配符: %
-零个或多个字符的任何字符串。
WHERE title(如“%computer%”)
在书名的任何位置查找所有带有computer
一词的书名
(下划线)任何单个字符。
其中类似于“\u ean”的au\u fname
查找以ean
结尾的所有四个字母的名字(Dean、Sean等)。
[]
指定范围(
[a-f]
)或集合([abcdef]
)内的任何单个字符。
其中au_lname类似于“[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]
等替换它。TSQL不支持本地正则表达式。它支持你正在使用的类似于,但这是一种非常简单的语言,根本不是真正的正则表达式。更好的计划可能是只存储9位数字(创建约束非常简单)并在显示SSN时插入破折号-除非您确实需要支持存储无效数据。好的。感谢您的解释,Stribizev。这对OP有什么好处?