【问题标题】:SQL Server : How to test if a string has only digit charactersSQL Server:如何测试字符串是否只有数字字符
【发布时间】:2015-02-06 16:26:24
【问题描述】:

我正在使用 SQL Server 2008。我正在尝试测试字符串 (varchar) 是否只有数字字符 (0-9)。我知道 IS_NUMERIC 函数会给出虚假结果。 (我的数据可能有 $ 符号,它不应该通过测试。)所以,我避免使用该功能。

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

some_column LIKE '%[^0123456789]%'

我认为唯一数字测试会是类似的,但我画的是空白。有什么想法吗?

【问题讨论】:

  • 您是否关心字符串是否可以成功解析为 SQL Server 上的数字类型之一?我的意思是,这不会被解析,太长,但只包含数字:“9834759837459837983759837598739587398573985739875938759387593875938759387598375938759387593875938759387593875938759873495837958734985743983479837938759387593875983475” SPAN>
  • 这里的答案可以根据您的需要进行调整:stackoverflow.com/questions/16309072/…
  • 如果您只需要相反的结果集,只需否定您的 where 谓词:some_colum NOT LIKE '%[^0-9]%'

标签: sql sql-server sql-server-2008


【解决方案1】:

使用Not Like

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

演示

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

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

【讨论】:

  • 您使用的是双重否定。 (^ 否定字符类)。为什么不直接使用where some_column LIKE '%[0-9]%'
  • @jpaugh - 因为要求是查找字符串是否只有数字。您的查询也将返回字母数字字符串。
  • 你是对的!我并没有仔细考虑角色类之前和之后的%
【解决方案2】:

对于 SQL 2008 及更高版本,有一个名为 ISNUMERIC 的系统函数。一个例子:

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

我做了几个快速测试,还进一步查看了文档:

ISNUMERIC returns 1 when the input expression evaluates to a valid numeric data type; otherwise it returns 0.

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

-9879210433 会通过,但 987921-0433 不会。 $9879210433 会通过,但 9879210$433 不会。

因此,使用此信息,您可以根据 list of valid currency symbols+- 字符进行筛选。

【讨论】:

  • 天哪,我现在才从问题中看到这一点:IS_NUMERIC function can give spurious results. ooops
  • 检查 this 以将 IS_NUMERIC 限制为仅整数值。
  • 顺便说一句,IsNumeric 为 1,2,3,4 之类的字符串返回 1(即 true)
  • 由于某种原因,回车通过了数字测试
【解决方案3】:

解决方案: where some_column NOT LIKE '%[^0-9]%' 是正确的。

只有一个重要说明:当字符串列 = ''(空字符串)时添加验证。此方案将返回 '' 也是一个有效数字。

【讨论】:

  • 您的格式似乎不正确,您介意修正一下吗?
【解决方案4】:

可行的方法。上面的使用方式不行。

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

【讨论】:

    【解决方案5】:
    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
    

    【讨论】:

      【解决方案6】:

      我试图查找只有数字的字符串,没有标点符号或其他任何内容。我终于找到了一个可行的答案here

      使用 PATINDEX('%[^0-9]%', some_column) = 0 可以过滤掉除实际数字字符串之外的所有内容。

      【讨论】:

        【解决方案7】:

        所选答案无效。

        declare @str varchar(50)='79D136'
        
        select 1 where @str NOT LIKE '%[^0-9]%'
        

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

        【讨论】:

        • 它不返回 1,至少在我的 sql server 上。这是预期的行为,因为 79D136 或 79E136 不是整数
        猜你喜欢
        • 1970-01-01
        • 2015-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        相关资源
        最近更新 更多