2014-04-15 59 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 
相關問題