问题 ISNUMERIC('07213E71')=真的吗?


SQL正在检测以下字符串 ISNUMERIC

'07213E71'

我相信这是因为'E'被归类为数学符号。

但是,我需要确保只有整数的值才返回True。

我怎样才能做到这一点?


1290
2018-05-13 07:58


起源



答案:


07213E71 是一个带有71个零的浮点数7213

你可以用它 ISNUMERIC(myValue + '.0e0') 测试整数。有点神秘但有效。

另一个测试是双重否定 myValue NOT LIKE '%[^0-9]%' 只允许数字0到9。

ISNUMERIC还有其他问题,这些问题都归结为1: +-


18
2018-05-13 08:03



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


答案:


07213E71 是一个带有71个零的浮点数7213

你可以用它 ISNUMERIC(myValue + '.0e0') 测试整数。有点神秘但有效。

另一个测试是双重否定 myValue NOT LIKE '%[^0-9]%' 只允许数字0到9。

ISNUMERIC还有其他问题,这些问题都归结为1: +-


18
2018-05-13 08:03



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


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


1
2018-05-13 08:02



是的,但他想知道的是如何将它作为一个没有符号的正数传递给查询,因为SQL不理解这种符号。 - elvenbyte
@elvenbyte我读到它不想将7213 * 10 ^ 71视为整数(即​​使它是) - Rowland Shaw


在文档中说

当输入表达式求值为有效整数时,ISNUMERIC返回1 浮点 数字,金钱或小数类型;否则返回0.返回值1保证表达式可以转换为这些数字类型之一。

您的数字也是浮点数(使用指数表示法),因此拥有ISINTEGER的唯一方法是在SQL上自己定义它。阅读以下链接。

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


1
2018-05-13 08:04





我遇到了同样的问题。 IsNumeric接受“$,€,+, - 等”作为有效输入,转换函数因此引发错误。 使用“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
2018-06-12 09:28



有点晚了,但不是 '%[0-9]%' 比赛 aaaaaa5aaaaa? - Marie
@marie你是对的。我编辑了答案。谢谢你的警告:) - Recev Yildiz


无论您使用何种语言,都必须确保它不受数据库调用的影响,然后将值传递给查询。可能SQL正在将该值理解为字符串。


-4
2018-05-13 08:04



答案不多:它如何帮助OP? - gbn
哦,也许我们必须完成所有的工作? - elvenbyte