【问题标题】:ISNUMERIC('07213E71') = True?ISNUMERIC('07213E71') = 真?
【发布时间】:2011-08-24 17:46:37
【问题描述】:

SQL 正在检测以下字符串 ISNUMERIC:

'07213E71'

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

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

我该怎么做?

【问题讨论】:

    标签: sql sql-server-2005 isnumeric


    【解决方案1】:

    我也遇到了同样的问题。 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 你是对的。我已经编辑了答案。谢谢你的警告:)
    【解决方案2】:

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

    您可以使用此ISNUMERIC(myValue + '.0e0') 来测试整数。有点神秘但有效。

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

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

    【讨论】:

    • 我不建议在查询中这样做,因为它在某些情况下会引发超时。 SQL 不是为了那个目的。
    • 为什么会导致超时?对我来说似乎是一个简单的解决方案
    • @Curt:我认为 elvenbyte 的意思是“不要在 WHERE 子句中使用它”。但是,您已经在列上有一个函数,所以附加一个字符串不会影响事情..
    • '0e0' 对于小数也将返回 true。要测试整数,您应该使用“.0e0”。您还可以使用以下方法测试正数:IsNumeric('-' + Value + '.0e0')
    • 可能还需要检查输入字符串的长度,以避免将太大的整数值分配给不足以容纳那么多的数据类型时出现溢出错误。带有 LEN() 检查的简单示例: DECLARE (a)value NVARCHAR(255) = '9876543210', (a)result INT ; IF ISNUMERIC((a)value + '.0e0') = 1 AND LEN((a)value)
    【解决方案3】:

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

    【讨论】:

    • 答案不多:它对 OP 有何帮助?
    【解决方案4】:

    在文档中它说

    ISNUMERIC 在输入表达式计算为有效整数、浮点数字、货币或小数类型时返回 1;否则返回 0。返回值 1 保证表达式可以转换为这些数字类型之一。

    您的数字也是浮点数(使用指数符号),因此拥有 ISITEGER 的唯一方法是在 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

    【讨论】:

      【解决方案5】:

      吹毛求疵:这是一个整数。相当于7213 * 10 ^ 71

      【讨论】:

      • 是的,但他想知道的是如何将它作为一个没有符号的公正数字传递给查询,因为 SQL 不理解该符号。
      • @elvenbyte 我读到他不想将 7213 * 10 ^ 71 视为整数(即​​使它是)
      猜你喜欢
      • 1970-01-01
      • 2011-12-22
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-12
      相关资源
      最近更新 更多