我在SQL Server中遇到了一个问题,我认为这是一个错误 - 但我不确定。
我的用户输入了一个负号,标志和数字之间有空格。所以在我的代码中,当我检查值是数字时,它的结果是 true 但是当我尝试将它转换为float时它有一个错误......
SELECT ISNUMERIC('- 49.5')
结果:1
SELECT CONVERT(FLOAT, '- 49.5')
将数据类型varchar转换为float时出错。
答案 0 :(得分:4)
来自BOL:
对于某些不是数字的字符,ISNUMERIC返回1,例如 加号(+),减号( - )和有效货币符号,如美元 sign($)。有关货币符号的完整列表,请参阅货币和 smallmoney(Transact-SQL)。
最好使用TRY_CAST/CONVERT/PARSE
(SQL Server 2012 +):
SELECT TRY_CAST('- 49.5' AS FLOAT);
如果您的号码代表价格/尺寸/ ...我强烈建议您使用DECIMAL/NUMERIC
而不是FLOAT
。
修改强>
我无法使用TRY_CAST。因为ISNUMERIC改变了我的代码流。
是的,你可以:
IF TRY_CAST(@val AS FLOAT) IS NULL
-- @val is not a number
ELSE
-- @val is number
答案 1 :(得分:2)
不,这不是错误。
如https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql中所述,当输入表达式可以转换为以下任何数据类型时,ISNUMERIC
函数返回1:int
,numeric
,{{ 1}},bigint
,money
,smallint
,smallmoney
,tinyint
,float
,decimal
。
虽然值“ - 49.5”无法转换为real
,int
或numeric
,但可以将其转换为float
:
money
返回SELECT CONVERT(MONEY,'- 49.5')
答案 2 :(得分:1)
Sql的定义如下,并在msdn
中提到对于某些不是数字的字符,例如加号(+),减号( - )和有效货币符号(如美元符号($)),ISNUMERIC返回1。
所以IsNumeric
给你1,因为它遇到-
和数字(不包括空格)。但convert
失败,因为数字之间有空格。
IsNumeric可以有趣的行为。
以下也返回1
SELECT isnumeric('- .');
编辑:
你曾说过你不能使用ISNUMERIC
之外的任何其他内容,但考虑ISNUMERIC
未知行为(可能是sql server中的错误)
找到一个有趣的参考ISNumeric() StackExchange说下面的内容;
如果您使用的是SQL Server 2012+,请使用
TRY_CONVERT
或TRY_CAST
来检查字符串是否可以转换为某种给定类型。在它们提供足够功能的地方,它们优于TRY_PARSE
,因为后者涉及通过CLR集成进行更昂贵的处理。
答案 3 :(得分:1)
看上去' - 49.5' 。 (减号和数字之间的空格)不是数字。 Oracle 也存在同样的问题:
select cast('- 49.5' as float) from dual
给出错误: [代码:1722,SQL状态:42000] ORA-01722:无效数字
这很好用:
select cast('-49.5' as float) from dual;
与 JavaScript 相同:
Number("-49.5")
-49.5
Number("- 49.5")
NaN
Java
System.out.println (Float.valueOf("- 49.5"))
抛出异常:java.lang.NumberFormatException:对于输入字符串:" - 49.5"
与 Python
相同Python 2.7.10 (default, Jul 15 2017, 17:16:57)
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> float("-49.5")
-49.5
>>> float("- 49.5")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: - 49.5
>>>
与Mac(Xcode)上的 C 相同
printf("%f", atof("- 49.5"));
打印:0.000000