Oracle SQL — можно ли использовать CASE в контрольном ограничении для определения атрибутов данных?

#sql #oracle #constraints #check-constraints

#sql #Oracle #ограничения #ограничения проверки

Вопрос:

Я использую Oracle 10g и хочу применить ограничение к таблице, в которой значение, введенное для одного столбца, определяет, является ли другой столбец нулевым или НЕ является НУЛЕВЫМ. Столбец 1 может содержать только 1 или 0; столбец 2 — это VARCHAR2(255).

Я знаю, что работает следующее:

 CONSTRAINT ck_1 CHECK ((col1=1 AND col2 IS NOT NULL) OR (col1=0 AND col2 IS NULL));
  

Однако мне было интересно, можно ли использовать CASE для выполнения этого ограничения и установить атрибут NOT NULL для col2, или CASE можно использовать только для определения значений? т. Е. может ли что-то вроде этого работать:

 CONSTRAINT ck_1 CHECK (CASE WHEN col1=1 THEN col2 IS NOT NULL ELSE col2 IS NULL END);
  

Ответ №1:

Поскольку выражения CASE должны возвращать значение, а ограничения check являются логическими, вам придется сравнить результат с чем-то, например:

 CONSTRAINT ck_1 CHECK (CASE WHEN col2 IS NOT NULL THEN 1 ELSE 0 END = col1);