在Check中使用where子句

时间:2014-10-19 13:13:07

标签: oracle where-clause check-constraint

我有一种情况,当另一个字段是特定值时,字段可以为NULL,而对于其他字段,它应该是非NULL。

"Type"              VARCHAR2(30)      NOT NULL,
BestandLocatie      VARCHAR2(150)     NULL,

我做了两个约束,第一个约束确保只有" Type"中的某些值。可以输入。

CONSTRAINT TypeCheck
          CHECK ("Type" IN ('Tab', 'Bass Tab', 'Chords', 'Power Tab', 'Guitar Pro', 
                    'Video Lesson', 'Drum Tab', 'Ukulele Chords')),

另一个约束(给出错误,缺少右括号)应该确保当" Type"时,BestandLocatie不为NULL。是某些类型:

CONSTRAINT BestandLocatieCheck 
    CHECK (BestandLocatie IS NOT NULL WHERE ("Type" IN ('Power Tab', 'Guitar Pro'
                            'Video Lesson')))

当我搜索Where子句时,我只在select语句中找到了它的例子。这是否意味着我不能在这里使用它,是否有其他方法可以执行此操作,或者我必须在最终应用程序中检查它还是只能在PLSQL中完成?

1 个答案:

答案 0 :(得分:3)

您可以这样做:

alter table foo add (constraint check_b 
  check ( (a in ('a', 'b') and b is not null)
       or (a not in ('a', 'b') /* and b is null */)
        )
);

评论and b is null应该在那里,具体取决于您是否要求在其他情况下该值为空。

演示:

SQL> create table foo (a varchar(2) not null, b varchar(2));

SQL> alter table foo add (constraint check_b check (
  (a in ('a', 'b') and b is not null) or (a not in ('a', 'b') and b is null))
);

Table altered.

SQL> insert into foo values ('a', 'b');

1 row created.

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


SQL> insert into foo values ('c', null);

1 row created.

SQL> insert into foo values ('c', 'b');
insert into foo values ('c', 'b')
*
ERROR at line 1:
ORA-02290: check constraint (MAT.CHECK_B) violated