Проверка ограничений на использование 10-значного символа для почтового индекса - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть таблица с типом столбца Char(10), названная postal Code, и мне нужна проверка Ограничения для всех значений, просто 10 цифр, как 1234567890 и ничего больше, я использую следующее:

CONSTRAINT [CH_PCDigit] CHECK ( [PostalCode] LIKE '%[^0-9]%'),
CONSTRAINT [CH_PCLength] CHECK ( LEN([PostalCode])=10)

но не работает правильно, почему? а каково ваше предложение? Есть ли способ объединить эти 2 ограничения с одним?

А что если я хочу почтовый индекс, подобный этому: 12345-54321 означает: 5digit-5digit? (Также тип должен быть Char(11)).

Кто-нибудь знает какой-нибудь хороший источник для проверки Rgex или Constraint Check в SQl?

Ответы [ 3 ]

10 голосов
/ 21 февраля 2012

SQL Server TSQL не поддерживает полноценные RegEx. Вы можете делать то, что хотите, в одном ограничении, например так:

CONSTRAINT [CH_PCDigit] 
    CHECK ([PostalCode] LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]')

или лучше:

CONSTRAINT [CH_PCDigit] 
    CHECK ([PostalCode] LIKE REPLICATE('[0-9]', 10))

Если вы хотите разрешить тире:

CREATE table  ChkTest
(
    PostalCode char(10) not null
        CONSTRAINT [CH_PCDigit]  
    CHECK ([PostalCode] LIKE REPLICATE('[0-9,-]', 10)) 
)

-- Test Code...

insert into ChkTest 
select '1234567890'

insert into ChkTest 
select '123456780'

insert into ChkTest 
select '12345678y0'

insert into ChkTest 
select '12345678901'

select * from ChkTest

insert into ChkTest 
select '12345-8901'
3 голосов
/ 02 августа 2013

Это тот, который принимает как почтовый индекс США, так и почтовый индекс Канады.

CONSTRAINT CH_PCDigit
CHECK (PostalCode LIKE '[0-9][0-9][0-9][0-9][0-9]' OR 
       PostalCode LIKE '[0-9][0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]' OR
       PostalCode LIKE '[A-Y][0-9][A-Z][0-9][A-Z][0-9]')
2 голосов
/ 21 февраля 2012

Вы можете использовать числовое, разделенное большое число:

CREATE TABLE a (
pc CHAR(10),
CONSTRAINT pc_c CHECK ( 
       LEN(pc) = 10 AND 
       ISNUMERIC(SUBSTRING(pc,1,5))=1 AND 
       ISNUMERIC(SUBSTRING(pc,6,5))=1)
) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...