如果条件满足,Oracle检查regexp

时间:2015-11-17 21:54:46

标签: sql regex oracle constraints

我想在Oracle服务器的表中添加约束。

如果用户从芬兰插入公民,我怎么能检查电话号码是10个号码(不是字母)?

这是我的代码:

ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (CASE Country  WHEN  'Finland'  THEN REGEXP_LIKE(Phone,'^[0-9]{10}$') END );

但是我收到以下错误:

  

ORA-00920:无效的关系运算符

2 个答案:

答案 0 :(得分:1)

尝试以适当的方式重写条件

ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (( Country  ='Finland' and REGEXP_LIKE(Phone,'^[0-9]{10}$')) or (Country!='Finland' or Country is null));

答案 1 :(得分:0)

检查约束需要解析为布尔表达式,并且案例解析为值,因此您需要将其与某些内容进行比较。因此,如果您对使用案例感到不满,则必须进行比较。或者更新它以不使用像@mina这样的案例写道:

设置我们的测试数据

create table citizen (
  id number,
  country varchar2(100),
  phone varchar2(10)
);

Table created.

insert into citizen values (10, 'Finland', '1234567890');
insert into citizen values (20, 'Ireland', 'abcdefghij');

尝试添加检查约束:

ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
  CHECK (CASE Country  WHEN  'Finland'  THEN REGEXP_LIKE(Phone,'^[0-9]{10}$') END );
                                                                                *
ERROR at line 2:
ORA-00920: invalid relational operator

但是如果我们修改它来进行比较:

ALTER TABLE CITIZEN ADD CONSTRAINT checkPhone
CHECK (case when country = 'Finland' and not REGEXP_LIKE(Phone,'^[0-9]{10}$') then 0 else 1 END);

Table altered.

然后我们可以测试它:

insert into citizen values (10, 'Finland', '123456789z');

ERROR at line 1:
ORA-02290: check constraint (CHECKPHONE) violated

insert into citizen values (100, 'Finland', '1234567890');
1 row created.