MSSQL检查列是否为全数字或为空

时间:2019-04-02 11:47:34

标签: sql-server tsql

我在表中有一个varchar字段。我必须检查哪些行包含数字(0-9)以外的任何内容。不允许使用其他任何字符(。等)。

ISNUMERIC并没有帮助,因为该字符串可以比在SQL Server中可转换为数字数据类型的任何字符串都长。

关于如何执行此操作的任何想法?

非常感谢!

2 个答案:

答案 0 :(得分:2)

假设“空”表示NULL

Field NOT LIKE '%[^0-9]%'
    OR Field IS NULL

获取仅包含数字或为空的值的示例:

declare @test table (Field varchar(32))

INSERT @test
VALUES
    (NULL),
    ('121414'),
    ('88977665'),
    ('234234f'),
    ('347238748d9')

select * from @test
where Field not like '%[^0-9]%'
    OR Field is null
  

字段

     

NULL

     

121414

     

88977665

获取包含非数字字符且不为空的值的示例:

declare @test table (Field varchar(32))

INSERT @test
VALUES
    (NULL),
    ('121414'),
    ('88977665'),
    ('234234f'),
    ('347238748d9')

select * from @test
where Field like '%[^0-9]%'
    AND Field is NOT null
  

字段

     

234234f

     

347238748d

答案 1 :(得分:0)

您可以尝试PATINDEX查找和拒绝非数字字符的值:

declare @t table (field varchar(40))
insert into @t (field)
values
('40340,033680998078'),
('40340'),
('033680998078')

select *
from @t
where patindex('%[^0-9]%',field)=0

此查询无法利用任何索引,因此必须扫描整个表。最好首先避免在该字段中存储非数字字符。

通常,如果字段包含数字数据,则应使用数字类型,而不是varchar。它应该是intbigintnumeric(...,0)

另一方面,该字段可以是存储例如发票编号,机票或增值税号的业务字段。

在那种情况下,您可能想使用CHECK约束来确保不能在表中插入无效值。使用PATINDEX可以做到这一点:

declare @t table 
( 
    field varchar(40) CHECK (patindex('%[^0-9]%',field)=0)
);

此检查约束将允许:

insert into @t (field)
values
('40340'),
('033680998078')

但是拒绝:

insert into @t (field)
values
('40340,033680998078')