ISNUMERIC('07213E71') = True?

12
SQL检测到以下字符串ISNUMERIC

'07213E71'

我认为这是因为'E'被归类为数学符号。 然而,我需要确保仅返回整数值为真。 我该怎么做?
5个回答

21

07213E71 是一个浮点数,表示 7213 后面跟着 71 个零。

你可以使用 ISNUMERIC(myValue + '.0e0') 来测试整数。这有点神秘,但是可行的。

另一种测试方法是使用双重否定 myValue NOT LIKE '%[^0-9]%' ,它只允许数字 0 到 9。

ISNUMERIC 还有其他问题,因为这些都会返回 1:+-


1
我不建议在查询中这样做,因为在某些情况下会导致超时。SQL并不适用于这种目的。 - elvenbyte
为什么这会导致超时?对我来说似乎是一个简单的解决方案。 - Curtis
@Curt:我猜elvenbyte的意思是“不要在WHERE子句中使用它”。但是,您已经在列上有一个函数,因此附加字符串不会影响任何事情。 - gbn
'0e0'也会返回分数,要测试整数,您应该使用'.0e0'。 您还可以使用此来测试正数:IsNumeric('-' + Value + '.0e0') - George Mastros
1
有时候需要检查输入字符串的长度,以避免将过大的整数值分配给不能容纳那么多数据的数据类型而导致溢出错误。以下是一个使用LEN()检查的简单示例:DECLARE (a)value NVARCHAR(255) = '9876543210', (a)result INT; IF ISNUMERIC((a)value + '.0e0') = 1 AND LEN((a)value) < 10 SET (a)result = (a)value ; SELECT (a)result。(是的,我知道,最大的INT实际上应该是2147483647,使用LEN()进行限制可以将其限制为999999999)。 - Andreas Jansson

1
挑剔一点:这是一个整数。它相当于 7213 * 10 ^ 71

1
是的,但他想知道的是如何将它作为一个没有符号的数字传递给查询,因为SQL不理解那个符号。 - elvenbyte
@elvenbyte 我理解他不想把7213 * 10 ^ 71看作整数(尽管它是整数)。 - Rowland Shaw

1

在文档中它说:

当输入表达式评估为有效的整数、浮点数、货币或十进制类型时,ISNUMERIC返回1;否则返回0。返回值为1保证表达式可以转换为这些数字类型之一。

你的数字也是浮点数(带指数符号),因此唯一的方法是在SQL上自定义ISINTEGER。请阅读以下链接。

http://classicasp.aspfaq.com/general/what-is-wrong-with-isnumeric.html

附加内容:

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=59049

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


0

我遇到了同样的问题。IsNumeric函数接受"$, €, +, -, 等等"作为有效输入,而Convert函数由于这个原因会抛出错误。 使用"LIKE" SQL语句解决了我的问题。希望它能帮助其他人。

SELECT UnitCode, UnitGUID, Convert(int, UnitCode) AS IntUnitCode
      FROM [NG_Data].[NG].[T_GLB_Unit]  
     WHERE ISNULL(UnitType,'') <>'Department'
       AND UnitCode NOT LIKE '%[^0-9]%'
  ORDER BY IntUnitCode

PS:不要责怪我使用“UnitCode”作为nvarchar :) 这是一个旧项目 :)


有点晚了,但是 '%[0-9]%' 不匹配 aaaaaa5aaaaa 吗? - Marie
@marie 你说得对。我已经编辑了答案。谢谢你的提醒 :) - Mehmet Recep Yildiz

-4

无论您使用哪种语言,都必须确保从数据库调用中获取值,并将其传递给查询。可能SQL会将该值视为字符串。


1
不是很有用的答案:它如何帮助OP? - gbn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接