SQL — Добавить условие If else в ограничение ПРОВЕРКИ

#sql-server #if-statement #case #check-constraints

#sql-сервер #if-оператор #случай #проверка-ограничения

Вопрос:

Я пытаюсь установить условие в КОНТРОЛЬНОМ ограничении. Сценарий таков

  1. Когда значение column1 равно null, никаких действий не требуется
  2. Если столбец 1 не равен нулю, то в столбце 3 должен быть определен код

Например, если учащийся запросил (1), то он должен был выполнить действие (посещенное как код 1 или вызванное как код 2)

таблица-ИЗОБРАЖЕНИЕ

 CREATE TABLE [dbo].[enquiry_details](
    [Id] uniqueidentifier NOT NULL,
    [Name] [varchar] (100) NOT NULL,
    [Enquired] [int] NULL,
    [location] [int] NOT NULL,
    [Action_Type] [int] NULL,
     -- CONSTRAINT menu_key CHECK ((Enquired IS NOT NULL)and Action_Type IN ('11','22'))
     --CONSTRAINT menu_key CHECK (IF(Enquired!= null)  Action_Type IN ('11','22'))
     CONSTRAINT menu_key CHECK (IF(Enquired is not null)  Action_Type IN ('11','22'))
    -- CONSTRAINT menu_keyi CHECK (CASE WHEN Enquired IS NOT NULL THEN Action_Type IN ('11','22') END)
     -- CONSTRAINT menu_keyi CHECK (CASE WHEN LEN(Enquired)>0 THEN (Action_Type '11' OR Action_Type='22') ELSE NULL END)
) 
  

Комментарии:

1. Добавьте свои данные в виде форматированного текста вместо изображения — лучше для всех.

2. @Damien Даже это не работает ПРОВЕРКА ключа меню ОГРАНИЧЕНИЙ (((Запрошено ЗНАЧЕНИЕ NULL) ИЛИ (Запрошено значение not null И [Action_Type] В (’11’,’22’))))

Ответ №1:

Не думайте о выполнении условного кода — просто подумайте о формировании единой части логики:

 CONSTRAINT menu_key CHECK (Enquired is null OR  Action_Type IN ('11','22'))
  

Первая часть OR будет false, если Enquired не равно null, и в этом случае только вторая часть OR может удовлетворять общему условию.

Комментарии:

1. Возможно, мне не совсем понятно объяснили. @Damien Ваше решение будет работать частично, но вот что именно необходимо ВСТАВИТЬ В ЗНАЧЕНИЯ [enquiry_details] (1,ABC, 1,5,11); — Будет вставлена ВСТАВКА В ЗНАЧЕНИЯ [enquiry_details] (5, JKL, NULL, 7,66); — Выдаст ошибку, но ожидает, что это будет вставлено ВСТАВКА В ЗНАЧЕНИЯ [enquiry_details] (5,XYZ, NULL, 7,11); — Будет вставлено, но это шойлд не будет вставлен