检查varchar是否为数字(TSQL)

检查varchar是否为数字(TSQL),tsql,numerical-methods,Tsql,Numerical Methods,有没有一种简单的方法来判断varchar是否是一个数字 示例: abc123-->无编号 123-->是的,这是一个数字 谢谢:)行 也请检查文章中的注释部分。您可以这样检查 declare @vchar varchar(50) set @vchar ='34343'; select case when @vchar not like '%[^0-9]%' then 'Number' else 'Not a Number' end ISNUMERIC不行-它告诉您字符串可以转换为任何数字类型,

有没有一种简单的方法来判断varchar是否是一个数字

示例:

abc123-->无编号

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

谢谢:)


也请检查文章中的注释部分。

您可以这样检查

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

ISNUMERIC不行-它告诉您字符串可以转换为任何数字类型,这几乎总是一条毫无意义的信息。例如,根据ISNUMERIC,以下所有内容都是数字:

英镑,美元,0d0

如果要检查数字且仅检查数字,则需要类似负数的表达式:

not Value like '%[^0-9]%'

我遇到了允许小数的需要,所以我使用了
而不是像“%$0-9.]%”这样的值
Wade73对小数的回答不太有效。我修改了它,只允许一个小数点

DECLARE @A nvarchar(100) = '12'
IF(ISNUMERIC(@A) = 1)
BEGIN
    PRINT 'YES NUMERIC'
END
declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
    (N'1234')
    , (N'000005')
    , (N'1,000')
    , (N'293.8457')
    , (N'x')
    , (N'+')
    , (N'293.8457.')
    , (N'......');

-- This shows that Wade73's answer allows some non-numeric values to slip through.
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like N'%.%.%'".
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t 
order by IsNumber;

Neizan的代码只允许一个“.”的值通过。冒着变得太迂腐的风险,我又添加了一个
子句

declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
    (N'1234')
    , (N'000005')
    , (N'1,000')
    , (N'293.8457')
    , (N'x')
    , (N'+')
    , (N'293.8457.')
    , (N'......')
    , (N'.')
    ;

-- This shows that Neizan's answer allows "." to slip through.
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like '.'".
select * from (
    select 
        MyVar
        , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' and MyVar not like '.' then 1 else 0 end as IsNumber 
    from 
        @MyTable
) t 
order by IsNumber;

使用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 

达米安·努非信仰者指出,他只对数字有用

Wade73增加了一个位来处理小数点

内赞做了一个额外的调整,就像不吃东西一样

不幸的是,它们似乎都不能处理负值,而且它们的值中似乎存在逗号问题

这里是我的调整,以拾取负值和带逗号的值

declare @MyTable table(MyVar nvarchar(10));
insert into @MyTable (MyVar) 
values 
(N'1234')
, (N'000005')
, (N'1,000')
, (N'293.8457')
, (N'x')
, (N'+')
, (N'293.8457.')
, (N'......')
, (N'.')
, (N'-375.4')
, (N'-00003')
, (N'-2,000')
, (N'3-3')
, (N'3000-')
;

-- This shows that Neizan's answer allows "." to slip through.
select * from (
select 
    MyVar
    , case when MyVar not like N'%[^0-9.]%' then 1 else 0 end as IsNumber 
from 
    @MyTable
) t order by IsNumber;

-- Notice the addition of "and MyVar not like '.'".
select * from (
select 
    MyVar
    , case when MyVar not like N'%[^0-9.]%' and MyVar not like N'%.%.%' and MyVar not like '.' then 1 else 0 end as IsNumber 
from 
    @MyTable
) t 
order by IsNumber;

--Trying to tweak for negative values and the comma
--Modified when comparison
select * from (
select 
    MyVar
    , case 
        when MyVar not like N'%[^0-9.,-]%' and MyVar not like '.' and isnumeric(MyVar) = 1 then 1
        else 0 
    end as IsNumber 
from 
    @MyTable
) t 
order by IsNumber;

别忘了从数据中排除回车

例如:

SELECT 
  Myotherval
  , CASE WHEN TRIM(REPLACE([MyVal], char(13) + char(10), '')) not like '%[^0-9]%' and RTRIM(REPLACE([MyVal], char(13) + char(10), '')) not like '.' and isnumeric(REPLACE([MyVal], char(13) + char(10), '')) = 1 THEN 'my number: ' +  [MyVal]
             ELSE ISNULL(Cast([MyVal] AS VARCHAR(8000)), '')
        END AS 'MyVal'
FROM MyTable

isnumeric
但我在上面添加了一个Microsoft Connect项目的链接,其中包含一些示例和MS说明。您需要匹配哪些数字格式?例如,您是否需要匹配像
1e23
这样的内容?如果出现IsNumeric怪癖,那么使用TRY\u CAST(ReqCol As INT)不为NULL如何?请接受damien的answer@Grady-我认为Damien下面的答案是一个更好的答案,正如所指出的,IsNumeric确实有一些限制。您确定没有遇到任何此类限制吗?向下滚动以注意下一个答案。“select isnumeric('138D47')返回1-1 isnumeric对于许多事情都是正确的,但如果强制转换为INT或Float,则会出现例外情况-请参阅一些示例-其中显示以下15个字符串都是“isnumeric”=1'$,“,”,“,”,“,”,“0e+99',“2e2',“12D4',”,1,1,1,1,1',“-”,“+”,CHAR(9),CHAR(10),CHAR(11),CHAR(12),CHAR(13)@Nuzzolilo,因为如果它是十六进制的东西,它似乎是数字的,而d是十六进制的一部分,数字也认为“-”是数字的。如果你只想要正整数,这是一个很好的方法,但如果您使用的是SQL 2012+,还需要允许其他类型的数字类型,我在下面添加了一些示例。当然,这比ISNUMERIC更好!这应该被标记为正确答案。这个和其他类似的答案会说原始问题的第一个例子是一个数字,因为它的一个字符是一个数字。如果您想知道所有字符都是数字,那该怎么办呢?@RosieC-或者,换句话说-
像“%[0-9]”这样的值将是“字符串至少包含一个数字字符”<代码>类似“[^0-9]%”的值将是“字符串至少包含一个非数字字符”。但是,同样,我的测试是
而不是“[^0-9]”这样的值。
否定了前面的测试,是“字符串不包含非数字字符”,我必须添加“.”。谢天谢地,我的数据中没有一个在错误的位置有“-”,这是最好的解决方案。使用%[^0-9.]%的解决方案似乎会在包含数字时返回一个数字,即使字符串中还有字符。这个TRY_CAST适合我。请记住,它需要SQL Server 2012+-不能在2008R2或更低版本上工作,也不能在其他RDBMS上工作