SQL Server:如何测试一个字符串是否只包含数字字符

60

我正在使用 SQL Server 2008。我想测试一个字符串(varchar)是否只包含数字字符(0-9)。我知道 IS_NUMERIC 函数可能会给出虚假结果。(我的数据可能有美元符号,这些符号不应该通过测试。)因此,我避免使用那个函数。

我已经有了一个测试来查看字符串中是否有任何非数字字符,即,

some_column LIKE '%[^0123456789]%'

我认为只有数字的测试应该类似,但是我暂时想不出来。有什么想法吗?


你是否关心字符串在 SQL Server 上能否成功解析为数字类型?我的意思是,这个字符串太长了无法被解析,但它只包含数字:"9834759837459837983759837598739587398573985739875938759387593875938759387598375938759387593875938759387593875938759873495837958734985743983479837938759387593875983475"。 - Lasse V. Karlsen
这里的答案可以根据您的需求进行调整:https://dev59.com/t3HYa4cB1Zd3GeqPNJd_ - Tab Alleman
如果您只需要相反的结果集,请否定您的where谓词:some_colum NOT LIKE '%[^0-9]%' - ckerth
8个回答

92

使用 Not Like

where some_column NOT LIKE '%[^0-9]%'

演示

declare @str varchar(50)='50'--'asdarew345'

select 1 where @str NOT LIKE '%[^0-9]%'

2
你使用了双重否定。(^ 取消字符类)。为什么不直接使用 where some_column LIKE '%[0-9]%' - jpaugh
9
@jpaugh - 因为要求是仅查找字符串是否仅包含数字。您的查询也会返回包含字母和数字的字符串。 - Pரதீப்
你说得对!我没有仔细考虑字符类前后的“%”。 - jpaugh
这也返回空字符串 - The Thirsty Ape

19

SQL 2008及以上版本有一个名为ISNUMERIC的系统函数,例如:

SELECT myCol
FROM mTable
WHERE ISNUMERIC(myCol)<> 1;

我进行了几项快速测试,并进一步查看了文档:

ISNUMERIC在输入表达式评估为有效的数值数据类型时返回1;否则返回0。

这意味着它是相当可预测的,例如

-9879210433可以通过,但987921-0433不行。 $9879210433可以通过,但9879210$433不行。

因此,根据有效货币符号列表以及+-字符,您可以进行筛选。


哦,天啊,我现在才从问题中看到这个:“IS_NUMERIC函数可能会给出虚假的结果。” 哎呀。 - Bensonius
请点击这里,以仅将IS_NUMERIC限制为整数值。 - SiZiOUS
顺便提一下,IsNumeric对于像1、2、3、4这样的字符串返回1(即true)。 - Nir
1
由于某种原因,回车符会通过isnumeric测试。 - KeithL

3
解决方案: where some_column NOT LIKE '%[^0-9]%' 是正确的。
重要提示:在字符串列= ''(空字符串)的情况下添加验证。这种情况将返回''也是一个有效数字。

2
你的格式似乎不正确,能否修正一下? - Chabo

1

这是一种可行的方法。上面使用的方式不会起作用。

declare @str varchar(50)='79136'

select 
  case 
    when  @str LIKE replicate('[0-9]',LEN(@str)) then 1 
    else 0 
  end

declare @str2 varchar(50)='79D136'

select 
  case 
    when  @str2 LIKE replicate('[0-9]',LEN(@str)) then 1 
    else 0 
  end

0
DECLARE @x int=1
declare @exit bit=1
WHILE @x<=len('123c') AND @exit=1
BEGIN
IF ascii(SUBSTRING('123c',@x,1)) BETWEEN 48 AND 57
BEGIN
set @x=@x+1
END
ELSE
BEGIN
SET @exit=0
PRINT 'string is not all numeric  -:('
END
END

0
我试图仅查找数字字符串,不包含任何标点或其他字符。最终,我在这里找到了一个可行的解决方案。
使用PATINDEX('%[^0-9]%', some_column) = 0,可以过滤掉除了实际数字字符串以外的所有内容。

0

它正常工作了!!!

SELECT my_field FROM my_table WHERE REGEXP_LIKE(my_field, '[^0-9]') - only with char
 SELECT my_field FROM my_table WHERE REGEXP_LIKE(my_field, '[0-9]') - only numbers

目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0
所选答案不起作用。
declare @str varchar(50)='79D136'

select 1 where @str NOT LIKE '%[^0-9]%'

我没有解决方案,但知道这个潜在的陷阱。如果您将字母“D”替换为科学计数法中的“E”,情况也是如此。


它在我的SQL服务器上并不返回1。这是预期的行为,因为79D136或79E136不是整数。 - Raymond Holmboe

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