使用SQL - 如何匹配确切数量的字符?

时间:2014-04-15 19:18:48

标签: sql sql-server regex sql-like

我的任务是验证MSSQL数据库中的现有数据。我有一些SQL经验,但显然还不够。我们有一个邮政编码字段,必须是5或9位数字(美国邮政编码)。我们在邮政领域发现的是嵌入式空间和将来会被阻止的其他奇怪之处。我已经搜索了足够多的LIKE参考资料,让我接受了这个“新手方法”:

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

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

感谢您的帮助

4 个答案:

答案 0 :(得分:2)

不幸的是,LIKE不是正则表达式兼容的,所以没有排序\d。虽然将长度函数与数字函数组合可以提供可接受的结果:

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

但是我不推荐它,因为它的ISNUMERIC将返回1表示+, - 或有效的货币符号。特别是减号可能在数据集中很普遍,所以我仍然喜欢你的新手&#34;做法。

另一种方法是使用:

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

将找到任何一行,其中zip不包含任何不是0-9的字符(即只允许0-9),其中长度不是5或9。

答案 1 :(得分:0)

你可以通过几种方式实现这一目标。

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

    ZIP不喜欢' _ '

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

    LEN(ZIP)NOT IN(5,9)

答案 2 :(得分:0)

您正在寻找LENGTH()

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

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

答案 3 :(得分:0)

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

WHERE ISNUMERIC(ZIP) <> 1