2014-10-19 5 views
1

У меня есть ситуация, когда поле может быть NULL, когда другое поле является определенным значением, а для других оно должно быть NOT NULL.Использование where where в Check

"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'))) 

Когда я искал, где положение Я только нашел примеры этого в некоторых операторах. Означает ли это, что я не могу использовать его здесь, есть ли другой способ сделать это, или я должен проверить это в конечном приложении или это можно сделать только в 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

Спасибо, я удалил оба ограничения и сделал новый: 'CONSTRAINT BestandEnTypeCheck ЧЕК (("Тип" IN (' Мощность Tab», 'Guitar Pro', 'Видео урок') И BestandLocatie IS NOT NULL) ИЛИ («Type» IN («Tab», «Басовая вкладка», «Аккорды», «Барабанная вкладка», «Укулелевые аккорды»))) «Теперь это должно работать так же хорошо, тоже вы ответ, если я посмотрю на него быстро. – Politiepet

Смежные вопросы