Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 在Check中使用where子句_Oracle_Where Clause_Check Constraint - Fatal编程技术网

Oracle 在Check中使用where子句

Oracle 在Check中使用where子句,oracle,where-clause,check-constraint,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',

我有一种情况,当另一个字段是某些值时,一个字段可以为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中执行此操作?

您可以执行以下操作:

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 */)
        )
);
注释的
和b为null
应该存在,这取决于您是否希望在其他情况下要求该值为null

演示:


谢谢你,我删除了这两个约束,并做了一个新的:“约束BestAndEntityCheck检查”(“键入”IN('Power Tab'、'Guitar Pro'、'Video Lesson')和BestandLocatie不为空)或(“键入”IN('Tab'、'Bass Tab'、'Chords'、'Drum Tab'、'Ukulee Chords'))”)现在它也应该工作了,如果我看得快一点,你的反应也很相似。
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