2015-12-17 51 views
0

爲什麼ISNUMERIC = 0會返回帶空格和'/'的數字? 這是SQL Server 2008 R2的BTWVARCHAR上的ISNUMERIC列返回數字還是?

謝謝你們,

代碼示例:

SELECT A AS 'VARCHARCOLUMN' FROM TABLE 
    WHERE ISNUMERIC(A) = 0 

    TABLE Structure: 
    ---------------------- 
     A | B | C | 
    ---------------------- 
     x |  |  | 
     . |  |  | 
     p |  |  | 
    1 7/2 |  |  | 
    15. |  |  | 
     5 |  |  | 


     Result set: 
    ---------------------- 
     A | B | C | 
    ---------------------- 
     x |  |  | 
     p |  |  | 
    1 7/2 |  |  | <- Why is this returned??? 
+1

空格在數字上無效。你真的覺得這令人驚訝嗎? –

+0

[ISNUMERIC()']的各種問題(http://web.archive.org/web/20051025015615/http://www.aspfaq.com/show.asp?id=2390),除了正如其他人所解釋的那樣,空格和斜線在一些數字中是無效的。將您的數字存儲在一列中,將非數字值存儲在另一列中,這樣可以消除大部分頭痛...... –

回答

0

SQL Server中的IsNumeric函數只在表達式是有效的數值類型時才返回true。它不明白表達是1和7八分之一。它認爲這是一個字符串。 MSDN IsNumeric Reference

+2

好吧,更準確地說,表達式可以轉換爲任何有效的數字類型。以'SELECT ISNUMERIC('1e2');'爲例 - 這個返回1,但是'SELECT CONVERT(INT,'1e2');'產生一個錯誤。改爲使用'FLOAT'。 –

+0

解決此問題執行以下操作: SELECT A AS'VARCHARCOLUMN'FROM TABLE WHERE ISNUMERIC(SUBSTRING(A,1,1))= 0 –

+0

一旦開始使用SQL Server 2012,您可能需要考慮[ TRY_CAST'](https://msdn.microsoft.com/en-us/library/hh974669.aspx),它與'CAST'類似,但會安靜地返回NULL,而不是在投射失敗時產生錯誤。這可以使轉換代碼更加流暢。 –

0

因爲這些都不被認爲是數字。值'1 7/2'不是數字值 - 它是一個字符串(斜槓和空格是非數字的)。

+0

該空間有點不相關。 'ISNUMERIC('1')'評估爲'1'。 – Gerrat

+0

我意識到,然而,第一個字符是一個數字,不會返回結果集,因爲這...也許我的答案應該是解析列爲1個字符,然後使用ISNUMERIC ...我會試試這個 –

+4

@格拉特我不同意。這兩個都產生0:'SELECT ISNUMERIC('1 2'),ISNUMERIC('');'* outer *空格被修剪的事實是無關緊要的--OP沒有外部空間,它們在中間有空格的字符串,這是不一樣的事情。 –

相關問題