我正在使用SQL Server 2008 R2。当我执行以下查询时,当条形码内部显示“D”时,ISNUMERIC正在评估为true(1)。
SELECT ISNUMERIC('7210300106D30')
如果我用除D或E之外的其他字母执行相同的代码,它似乎评估为假(0),这是我所期望的。
SELECT ISNUMERIC('7210300106K30')
有谁可以请说明为什么会发生这种情况?感谢。
答案 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;