SQL IsNumeric函数

时间:2018-08-22 19:17:04

标签: sql sql-server-2008

SELECT IsNumeric('472369326D4')

返回1。显然,字符串中有一个字母D。为什么?

2 个答案:

答案 0 :(得分:10)

472369326D4是有效的float类型。将D4转换为四个0值,将D之前的值乘以10000

示例sql

SELECT cast('472369326D4' as float) 
SELECT cast('472369326D3' as float) 
SELECT cast('472369326D2' as float) 

输出:

4723693260000
472369326000
47236932600

答案 1 :(得分:0)

您可能想要这样的逻辑:

(case when str not like '%[^0-9]%' then 1 else 0 end) as isNumeric

或者,如果要允许使用小数和负号,则逻辑会比较麻烦:

(case when str not like '%.%.%' and str not like '%[^.0-9]%' and
           str not like '-%[^.0-9]%'
      then 1 else 0
 end)

我强烈建议您使用isnumeric() 。它产生奇怪的结果。除了“ d”外,还允许使用“ e”。

在SQL Server 2012+中,您可以尝试以下操作:

select x, isnumeric(x), try_convert(float, x)
from (values ('$'), ('$.'), ('-'), ('.')) v(x)

所有这些都为1返回isnumeric,但为转换返回NULL,这意味着您不能将值转换为浮点数。 (您可以改为使用convert()在SQL Server 2008中运行代码,并观察代码失败。)