2014-04-15 26 views
0

我的任务是验证MSSQL数据库中的现有数据。我有一些SQL体验,但显然还不够。我们有一个邮政编码字段,必须是5或9位数(美国邮政编码)。我们在拉链领域发现的是嵌入式空间以及未来将会阻止的其他古怪事物。我已经搜查足以找到喜欢那个离开我这个“新手办法”的参考文献:使用SQL - 如何匹配确切数量的字符?

ZIP NOT LIKE '[0-9][0-9][0-9][0-9][0-9]' 
AND ZIP NOT LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' 

这真的是我必须编写?有没有类似的...?

ZIP NOT LIKE '[\d]{5}' AND ZIP NOT LIKE '[\d]{9}' 

我会不愿意验证更长的字段!我想,最终,两个代码序列将同样有效(或应该是)。

感谢您的帮助

+0

不明白你想从中得到什么。你应该能够选择那里的任何东西(考虑它可能只是一个字符串),并且去掉你不想编程的任何字符。 – durbnpoisn

回答

2

不幸的是,就像是没那么这样的事\d的正则表达式兼容。虽然,具有数字功能相结合的长度功能可以提供可接受的结果:

WHERE ISNUMERIC(ZIP) <> 1 OR LEN(ZIP) NOT IN(5,9) 

我不过不推荐,因为它ISNUMERIC将返回1为+, - 或有效的货币符号。特别是减号可能在数据集中很普遍,所以我仍然赞成你的“新手”方法。

另一种方法是使用:

ZIP NOT LIKE '%[^0-9]%' OR LEN(ZIP) NOT IN(5,9) 

这会发现其中拉链不包含不是0-9(即只允许0-9),其中长度不是5或任何字符的任何行9.

0

有几种方法可以实现这一点。

  1. 您可以将其替换[0-9]_

    ZIP NOT LIKE '_'

  2. 使用LEN(),所以它就像

    LEN(ZIP)NOT IN(5 ,9)

0

您正在寻找LENGTH()

select * from table WHERE length(ZIP)=5; 

select * from table WHERE length(ZIP)=9; 
0

要测试非数字值,您可以使用ISNUMERIC()

WHERE ISNUMERIC(ZIP) <> 1 
相关问题