SQL Server ISNUMERIC返回错误的数据

时间:2017-03-14 13:55:27

标签: sql sql-server tsql

我正在使用SQL Server 2008 R2。当我执行以下查询时,当条形码内部显示“D”时,ISNUMERIC正在评估为true(1)。

 SELECT ISNUMERIC('7210300106D30')

如果我用除D或E之外的其他字母执行相同的代码,它似乎评估为假(0),这是我所期望的。

 SELECT ISNUMERIC('7210300106K30')

有谁可以请说明为什么会发生这种情况?感谢。

5 个答案:

答案 0 :(得分:6)

修改

我的初步答案是错误的,因为e在科学记数法中用于指定指数,而D也用于表示数字格式。

喜欢10e3

  

请注意" e"和" d" (每个人都忘记了这一点)不是   在结果中包含为数字,因为单个" e"或者" d不是   被认为是数字。但是,这些字母代表两个   不同形式的数字符号(带有" e"的那个)   科学计数法)。所以,如果你有任何看起来像   以下,ISNUMERIC将其识别为" Numeric" ...

     

SELECT ISNUMERIC(' 0d2345')SELECT ISNUMERIC(' 12e34')

http://www.sqlservercentral.com/articles/ISNUMERIC()/71512/

<击> 它可能会将其视为十六进制数,这是数字序列中的任何内容:

0123456789ABCDEF
  

十六进制描述了一个base-16数字系统。也就是说,它在为下一个数字添加新位置之前描述了包含16个连续数字作为基本单位(包括0)的编号系统。 (注意我们使用&#34; 16&#34;这里用十进制数来解释一个数字,它将是&#34; 10&#34;十六进制。)十六进制数字是0-9然后使用字母AF。
  http://whatis.techtarget.com/definition/hexadecimal

<击>

答案 1 :(得分:5)

如果您要查找数字字符串,请不要使用isnumeric()。只需使用like

select (case when col like '%[^0-9]%' then 0 else 1 end) as IsAllDigits

如果您想尝试转化,请使用try_convert()

select (case when try_convert(bigint, col) is null then 0 else 1 end) as IsConvertable

答案 2 :(得分:1)

看起来@ Tschallacka的回答是正确的。输入被视为十六进制数。

如果没有预期,您可以按以下方式操作:

SELECT ISNUMERIC(RTRIM('7210300106D30') + '.')

答案 3 :(得分:1)

我会使用TRY_CAST (... as bigint)

众所周知,ISNUMERIC有一个点,一个空格,一个字母E和其他几个

 SELECT TRY_CAST('7210300106D30' AS bigint)

给出NULL,因此它不是数字

旧版本的更新

使用LIKE和否定

IF '7210300106D30' LIKE '%[^0-9]%'
    PRINT 'broke'
ELSE
    PRINT 'OK'


IF '143618726378451623' LIKE '%[^0-9]%'
    PRINT 'broke'
ELSE
    PRINT 'OK'

答案 4 :(得分:1)

试试这个

这里TRY_CONVERT尝试将值转换为bigint格式
      如果给定值不是纯数,则TRY_CONVERT返回null
 通过使用'case',我们将不可转换的值返回为0,将可转换的值返回为1

 SELECT   
        CASE WHEN TRY_CONVERT(bigint , '7210300106D30') IS NULL   
        THEN 0  
        ELSE 1
    END AS Value;