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 withISNUMERIC()
,除了空格和斜杠在数字中无效,正如其他人所解释的那样。将您的数字存储在一列中,将非数字值存储在另一列中,这样就消除了很多麻烦...
【参考方案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)