MSSQL Проверить, все ли цифры в столбце или пустые - PullRequest
1 голос
/ 02 апреля 2019

У меня есть поле varchar в таблице. Я должен проверить, какие строки содержат ничего кроме цифр (0-9). Другие символы (. И т. Д.) Не допускаются.

ISNUMERIC бесполезен, поскольку строка может быть длиннее всего, что может быть преобразовано в числовой тип данных в SQL-Server.

Есть идеи, как это сделать?

Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Предположим, что "пусто" означает 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

0 голосов
/ 02 апреля 2019

Вы можете попробовать 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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...