VARCHAR 列上的 ISNUMERIC 仍然返回数字吗?

Posted

技术标签:

【中文标题】VARCHAR 列上的 ISNUMERIC 仍然返回数字吗?【英文标题】:ISNUMERIC on VARCHAR Column returning numbers still? 【发布时间】:2015-12-17 22:28:23 【问题描述】:

为什么 ISNUMERIC = 0 返回带有空格和 '/' 的数字? 这是 SQL Server 2008 R2 顺便说一句

谢谢各位,

代码示例:

  SELECT A AS 'VARCHARCOLUMN' FROM TABLE
    WHERE ISNUMERIC(A) = 0

    TABLE Structure:
    ----------------------
        A  |   B    |   C   |
    ----------------------
      x    |        |       |
      .    |        |       |
      p    |        |       |
     1 7/2 |        |       |
     15.   |        |       |
      5    |        |       |


      Result set:
   ----------------------
        A  |   B    |   C   |
    ----------------------
      x    |        |       |
      p    |        |       |
     1 7/2 |        |       | <- Why is this returned???

【问题讨论】:

空格在数字中无效。你真的觉得这很令人惊讶吗? All kinds of problems with ISNUMERIC(),除了空格和斜杠在数字中无效,正如其他人所解释的那样。将您的数字存储在一列中,将非数字值存储在另一列中,这样就消除了很多麻烦... 【参考方案1】:

SQL Server 中的 IsNumeric 函数仅在表达式为有效数值类型时才返回 true。它不明白表达式是 1 和八分之七。它认为这是一个字符串。 MSDN IsNumeric Reference

【讨论】:

嗯,更准确地说,当表达式可以转换为任何有效的数字类型时。以SELECT ISNUMERIC('1e2'); 为例 - 这将返回 1,但 SELECT CONVERT(INT, '1e2'); 会产生错误。请改用FLOAT 绕过这个执行以下操作:SELECT A AS 'VARCHARCOLUMN' FROM TABLE WHERE ISNUMERIC(SUBSTRING(A,1,1)) = 0 升级到 SQL Server 2012 后,您可能想要查看 TRY_CAST,它类似于 CAST,但会悄悄地返回 NULL,而不是在强制转换失败时引发错误。这可以使转换代码更加流畅。【参考方案2】:

因为这些都不是数字。值 '1 7/2' 不是数值 - 它是一个字符串(斜线和空格不是数字)。

【讨论】:

空间有点无关紧要。 ISNUMERIC(' 1 ') 计算结果为 1 我意识到,但是第一个字符是一个数字,因此不会在结果集中返回......也许我的答案应该是将列解析为 1 个字符,然后使用 ISNUMERIC。 ..我会试试这个 @Gerrat 我不同意。这些都产生 0:SELECT ISNUMERIC('1 2'), ISNUMERIC(' '); 修剪 outer 空格的事实是无关紧要的 - OP 没有外部空格,它们在字符串中间有空格,这是不一样的事情。

以上是关于VARCHAR 列上的 ISNUMERIC 仍然返回数字吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有 ISNUMERIC 的派生表进行查询会导致转换失败(varchar 到 int)

当另一列具有特定值时,列上的 NOT NULL 约束

TEXT 列上的 MySQL 索引无效

在生产数据库中减少列大小并修剪数据,处理同一列上的约束/依赖关系

数组列上的 Postgres 全文搜索

Varchar 到数字的转换 - CLR 或 'e0'