SELECT IsNumeric('472369326D4')
返回1。显然,字符串中有一个字母D
。为什么?
答案 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中运行代码,并观察代码失败。)