我在表中有一个varchar字段。我必须检查哪些行包含数字(0-9)以外的任何内容。不允许使用其他任何字符(。等)。
ISNUMERIC并没有帮助,因为该字符串可以比在SQL Server中可转换为数字数据类型的任何字符串都长。
关于如何执行此操作的任何想法?
非常感谢!
答案 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。它应该是int
,bigint
或numeric(...,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')