Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 社会保险号的T-SQL正则表达式(SQL Server 2008 R2)_Sql Server_Regex_Tsql_Sql Server 2008 R2 - Fatal编程技术网

Sql server 社会保险号的T-SQL正则表达式(SQL Server 2008 R2)

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,但我知道(好的,我非常确定)有一种方法可以缩短

我需要在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}'
但事实并非如此


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有什么好处?