约束检查邮政编码的10位字符使用

时间:2012-02-21 10:18:54

标签: sql sql-server-2008 tsql

我有一个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))。

是否有人知道SQl中Rgex或Constraint Check的任何良好来源?

3 个答案:

答案 0 :(得分:10)

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'

答案 1 :(得分:3)

这是一个同时接受美国邮政编码和加拿大邮政编码的人。

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 :(得分:2)

你可以使用isnumeric,拆分大号:

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)
)