检查varchar是否为数字(TSQL)

gra*_*ady 58 t-sql numerical-methods

有没有一种简单的方法来确定varchar是否是一个数字?

例子:

abc123 - >没有号码

123 - >是的,它是一个数字

谢谢 :)

Dam*_*ver 131

ISNUMERIC不会这样做 - 它告诉你字符串可以转换为任何数字类型,这几乎总是一个无知的信息.例如,根据ISNUMERIC,以下所有内容均为数字:

£,$,0d0

如果要检查数字和只检查数字,可以使用负LIKE表达式:

not Value like '%[^0-9]%'
Run Code Online (Sandbox Code Playgroud)

  • ISNUMERIC还认为" - "是数字. (2认同)
  • @RosieC - 或者,换句话说 - "像'%[0-9]%'`的值将是"字符串包含至少一个数字字符".`'like'%[^ 0-9]%'`将是"字符串包含至少一个非数字字符".但是,同样,我的测试是'不像'%[^ 0-9]%'的值,它否定了之前的测试并且"字符串不包含非数字字符" (2认同)

Sac*_*hag 30

ISNUMERIC会这样做

请查看文章中的NOTES部分.

  • @Grady - 我认为下面的Damien的答案更好,因为IsNumeric确实有一些限制.你确定,你没有遇到任何这样的限制吗? (8认同)
  • 向下滚动以注意下一个答案. (3认同)
  • "select isnumeric('138D47')"返回1 (3认同)

Bin*_*nil 26

你可以这样检查

declare @vchar varchar(50)
set @vchar ='34343';
select case when @vchar not like '%[^0-9]%' then 'Number' else 'Not a Number' end
Run Code Online (Sandbox Code Playgroud)


Dan*_*eld 19

使用SQL Server 2012+,如果您有特定需求,可以使用TRY_*函数.例如,

-- will fail for decimal values, but allow negative values
TRY_CAST(@value AS INT) IS NOT NULL 

-- will fail for non-positive integers; can be used with other examples below as well, or reversed if only negative desired
TRY_CAST(@value AS INT) > 0

-- will fail if a $ is used, but allow decimals to the specified precision
TRY_CAST(@value AS DECIMAL(10,2)) IS NOT NULL 

-- will allow valid currency
TRY_CAST(@value AS MONEY) IS NOT NULL  

-- will allow scientific notation to be used like 1.7E+3
TRY_CAST(@value AS FLOAT) IS NOT NULL 
Run Code Online (Sandbox Code Playgroud)

  • 请记住,它需要 SQL Server 2012+ - 不适用于 2008R2 或更低版本,也不适用于其他 RDBMS (2认同)

Wad*_*e73 8

我遇到了允许十进制值的需要,所以我使用了 not Value like '%[^0-9.]%'