SQL IsNumeric返回True但SQL报告的转换失败'

Kyl*_*ard 10 sql t-sql sql-server

假设以下数据:

Column1 (data type: varchar(50))
--------
11.6
-1
1,000
10"    
Non-Numeric String
Run Code Online (Sandbox Code Playgroud)

我有一个查询,它从此列中提取数据,并希望确定该值是否为数字,然后在我的查询中将其返回.所以我正在做以下事情

SELECT CASE
       WHEN IsNumeric(Replace(Column1, '"', '')) = 1 THEN Replace(Column1, '"', '')
       ELSE 0
   END AS NumericValue
Run Code Online (Sandbox Code Playgroud)

SQL正在报告:

将varchar值'11 .6'转换为数据类型int时转换失败.

为什么?我也试图强迫这个:

SELECT CASE
       WHEN IsNumeric(Replace(Column1, '"', '')) = 1 THEN cast(Replace(Column1, '"', '') AS float)
       ELSE 0
   END AS NumericValue
Run Code Online (Sandbox Code Playgroud)

我得到了:

将数据类型varchar转换为float时出错.

Qua*_*noi 11

您需要用句点替换逗号:

CAST(REPLACE(column, ',', '.') AS FLOAT)
Run Code Online (Sandbox Code Playgroud)

SQL Server输出使用locale定义的小数分隔符,但不会将CASTs中的句点除以数字类型之外的任何内容.


bre*_*dan 5

SQL isnumeric 有很多问题。例如:

select isnumeric('1e5')
Run Code Online (Sandbox Code Playgroud)

这将返回 1,但在许多语言中,如果您尝试将其转换为数字,则会失败。更好的方法是使用您需要检查的参数创建您自己的用户定义函数:

http://www.tek-tips.com/faqs.cfm?fid=6423


Pol*_* F. 5

首先将字符串转换为money,然后将其转换为任何其他数字格式,因为money类型始终提供真正的数字字符串.那你永远不会看到错误.

在您的查询中尝试以下内容,您就会知道我在说什么.两者都将返回2345.5656.Money数据类型舍入到4个小数位,因此转换会导致舍入到4个小数位.

SELECT CAST('2,345.56556' as money), CAST('$2,345.56556' as money)
Run Code Online (Sandbox Code Playgroud)

施放(施放('2,344'作为钱)作为浮动)将完美地工作或施放(施放('2,344'作为金钱)作为小数(7,2))也将起作用.

甚至施放(CAST('$ 2,345.56556'作为货币)作为int)将完美地将其四舍五入到最接近的整数.