如何在T-SQL中判断一个字符串是否为数字

16

有没有一种简单的方法在 MS SQL 2005 中判断字符串是否为整数(由数字组成)?

谢谢您的帮助。

7个回答

20

函数ISNUMERIC返回一个字符串是否为数值,但对于非整数也会返回True。

因此,您可以使用以下代码:

WHERE ISNUMERIC(str) AND str NOT LIKE '%.%' AND str NOT LIKE '%e%' AND str NOT LIKE '%-%'

4
'£' 或者 '0d0' 这样的字符串怎么办?ISNUMERIC 仍然会返回 1 - Tim Schmelter
我认为逐个排除字符并没有帮助,因为我们可以有多种组合。例如:特殊字符、字母等。 - Dev
在美国,'$'也会返回1(SQL 2022),尽管将'$'转换为十进制会出错。 - Chr.

19
尽管原帖是关于SQL 2005的,但我在2008 r2中发现直接使用where isnumeric(string)会导致错误4145(非布尔类型)。为了解决这个问题,请使用:where isnumeric(string) = 1

9
您可以使用LIKE运算符:
WHERE str NOT LIKE '%[^0-9]%'

1
使用 LTRIM(RTRIM(str)) NOT LIKE '%[^0-9]%' 可以允许数字周围有空格。 - sparebytes

2
请参考这个链接
CREATE Function dbo.IsInteger(@Value VarChar(18))
Returns Bit
As 
Begin

  Return IsNull(
 (Select Case When CharIndex('.', @Value) > 0 
              Then Case When Convert(int, ParseName(@Value, 1)) <> 0
                        Then 0
                        Else 1
                        End
              Else 1
              End
      Where IsNumeric(@Value + 'e0') = 1), 0)   

End

1

保证一个值符合4字节整数的要求有点棘手。

既然您正在使用2005 - 一种方法是尝试在try/catch块中转换该值。这将是确保它实际上是int的最佳方法。当然,您需要根据自己的要求在catch块中处理它不符合条件的情况。

另一种仅测试“数字”的方法是:

where strVal not like '%[^0-9]%'

这将错过-25.以及允许'99999999999999999999',因此您可能需要使用此方法包括其他标准。


0

使用(CAST(PATINDEX('%[^0-9]%', value) as BIT))处理所有字符


-1

标准T-SQL函数ISNUMERIC(expression)用于确定表达式是否为有效的数值类型。


确实是有效的数字类型,但它并不关心整数、小数、货币或浮点数。而且 OP 明确要求整数。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接