Oracle SQL Developer邮政编码

时间:2017-12-06 14:54:51

标签: sql oracle oracle11g

Oracle SQL Developer与Oracle 11g Express Edition中的检查约束存在问题。

我想检查存储为CHAR的邮政编码是否仅包含数字而不包含其他符号。

尝试了各种可能性但没有任何效果......

PLZ VARCHAR(5) NOT NULL

ADD CONSTRAINT TC_PLZ CHECK (PLZ LIKE '[0-9][0-9][0-9][0-9][0-9]')  

谢谢和最诚挚的问候,
迈克尔

2 个答案:

答案 0 :(得分:4)

使用regexp_like()

ADD CONSTRAINT TC_PLZ CHECK ( regexp_like(PLZ, '^[0-9]{5}$') )

Oracle - 与大多数数据库一样 - 仅支持LIKE中的ANSI标准通配符。对于零个或多个字符,这些字符为%,而对于一个字符,这些字符为_

正则表达式更强大(虽然通常较慢)。

这可能会更有效:

ADD CONSTRAINT TC_PLZ CHECK (translate(PLZ, '0123456789', '000000000') = '00000')

虽然为了清晰起见,我会使用正则表达式。

答案 1 :(得分:2)

如果要使用正则表达式模式,则需要在CHECK约束中使用正则表达式函数。这将有效:

create table t23 (

PLZ VARCHAR(5) NOT NULL
, CONSTRAINT TC_PLZ CHECK (regexp_LIKE(plz, '^[0-9]{5}$'))
);

虽然不需要正则表达式;这是另一种实现方式:

create table t42 (

PLZ NUMBER(5,0) NOT NULL
, CONSTRAINT T42_PLZ CHECK (length(plz)=5)
);

使用正确的数据类型存储数值是一种很好的做法。

结帐this LiveSQL demo

正如@ MT0指出的那样,如果有效值可以从前导零开始,则数字实现不正确。我的纯粹数据建模器角色声明必须是固定位数的值应从10000开始(对于五位数值)。但是,我必须承认我知道一个系统确实允许在数字"数字中使用前导零。领域;他们通过允许变量级别值来加剧这一点,这意味着代码0300识别出与00300不同的东西。什么百灵!