2014-10-19 19 views
1

中使用where子句我有一個情況,其中一個字段可以爲NULL,而另一個字段爲特定值時,其他字段應該爲非NULL。在檢查

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

我做了兩個約束,第一個確保只能輸入「類型」中的某些值。

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

其他約束(這給出了一個錯誤,缺少右括號)應確保BestandLocatie是NOT NULL,當「類型」是某些類型:

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

當我搜索了Where子句我只在select語句中找到它的例子。這是否意味着我不能在這裏使用它,還有其他的方法嗎?或者我必須在最終應用程序中檢查它,還是隻能在PLSQL中完成?

回答

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 
+0

謝謝,我刪除了兩個約束並提出一個新問題: 'IN(約束BestandEnTypeCheck CHECK(( 「類型」' 電源選項卡」, '吉他臨', '視頻課程' )AND BestandLocatie is not NULL)或(「Type」IN('Tab', 'Bass Tab','Chords','Drum Tab','Ukulele Chords')))'現在它應該可以工作,非常類似如果我很快看到它,也是你的迴應。 – Politiepet 2014-10-19 13:31:41