SQL Server的ISNUMERIC函数

时间:2015-08-21 08:36:49

标签: sql sql-server-2012

我需要在SQL Server 2012中检查数字与否的列。

这是我的案例代码。

CASE
    WHEN ISNUMERIC(CUST_TELE) = 1 
      THEN CUST_TELE 
      ELSE NULL 
END AS CUSTOMER_CONTACT_NO

但是当达到'78603D99'值时,它返回1,这意味着SQL Server将此字符串视为数字。

为什么?

如何避免这类问题?

3 个答案:

答案 0 :(得分:15)

不幸的是,SQL Server中的ISNUMERIC()函数有许多怪癖。它并非完全错误,但它很少会在人们第一次使用它时达到预期效果。

但是,由于您使用的是SQL Server 2012,因此可以使用TRY_PARSE()函数来执行您想要的操作。

返回NULL: SELECT TRY_PARSE('7860D399' AS int)

返回7860399 SELECT TRY_PARSE('7860399' AS int)

https://msdn.microsoft.com/en-us/library/hh213126.aspx

显然,这适用于INT以外的数据类型。你说你想检查一个值是否为数字,但我认为你的意思是INT

答案 1 :(得分:3)

虽然try_convert()try_parse()适用于内置类型,但它可能无法完全符合您的要求。例如,它可能允许小数点,负号,并限制数字的长度。

此外,isnumeric()将识别负数,小数和指数表示法。

如果您只想测试数字的字符串,那么您可以使用not like逻辑:

(CASE WHEN CUST_TELE NOT LIKE '%[^0-9]%'
      THEN CUST_TELE 
 END) AS CUSTOMER_CONTACT_NO

这只是说CUST_TELE不包含任何不是数字的字符。

答案 2 :(得分:0)

除了添加一些警告外,没有什么实质内容。

1)ISNUMERIC()不会出现空格,但会破坏数字转换。

2)如果该字段中只有一个非数字字符,而您使用REPLACE删除它,则仍然需要处理空白(通常使用CASE语句)。

例如,如果该字段包含单个'-'字符,而您使用此字符:

cast(REPLACE(myField, '-', '') as decimal(20,4)) myNumField

它将失败,您将需要使用以下内容:

CASE WHEN myField IN ('','-') THEN NULL ELSE cast(REPLACE(myField, '-', '') as decimal(20,4)) END myNumField