SQL Server的ISNUMERIC函数

wee*_*raa 12 sql sql-server-2012

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

这是我的案例代码.

CASE
    WHEN ISNUMERIC(CUST_TELE) = 1 
      THEN CUST_TELE 
      ELSE NULL 
END AS CUSTOMER_CONTACT_NO
Run Code Online (Sandbox Code Playgroud)

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

这是为什么?

如何避免这种问题?

Pau*_*gle 16

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

但是,由于您使用的是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.


Gor*_*off 5

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

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

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

(CASE WHEN CUST_TELE NOT LIKE '%[^0-9]%'
      THEN CUST_TELE 
 END) AS CUSTOMER_CONTACT_NO
Run Code Online (Sandbox Code Playgroud)

这只是说不CUST_TELE包含非数字字符。