Oracle:如何使用case来制定复杂约束

时间:2012-05-23 08:19:54

标签: oracle check-constraints

以下条件约束根本不起作用。有可能以一种有效的方式制定吗?

ALTER TABLE eni_trasc_voci_pwr_fatt
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione IS NULL
END);

3 个答案:

答案 0 :(得分:5)

尝试以下方法:

ALTER TABLE eni_trasc_voci_pwr_fatt
ADD CONSTRAINT tvp_constraint_1 CHECK (
CASE WHEN TVP_CODICE_ASSOGGETAMEN = '-' THEN tvp_regione else null end IS NULL);

答案 1 :(得分:3)

看起来你想要逻辑蕴涵(“如果X然后是Y”),这在逻辑上等同于“(不是X)或Y”。 CASE用于创建有限地图。

你的约束应该是

TVP_CODICE_ASSOGGETAMEN != '-' OR TVP_REGIONE IS NULL

答案 2 :(得分:2)

我认为如果没有案例陈述,你可以做你想做的事情:

create table t1 (c1 varchar2(10), c2 varchar2(10));

alter table t1 add constraint t1_chk1 check ( (c1 = '-' and c2 is null) or (c1 != '-' and c2 is not null) );

现在尝试插入一些值:

SQL> insert into t1 values ('-', 'reject');
insert into t1 values ('-', 'reject')  
*
ERROR at line 1:
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated


SQL>
SQL> insert into t1 values ('-', null);

1 row created.

SQL>
SQL> insert into t1 values ('a', null);
insert into t1 values ('a', null)
*
ERROR at line 1:
ORA-02290: check constraint (SODONNEL.T1_CHK1) violated


SQL>
SQL> insert into t1 values ('a', 'accept');

1 row created.