#sql-server #if-statement #case #check-constraints
#sql-сервер #if-оператор #случай #проверка-ограничения
Вопрос:
Я пытаюсь установить условие в КОНТРОЛЬНОМ ограничении. Сценарий таков
- Когда значение column1 равно null, никаких действий не требуется
- Если столбец 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); — Будет вставлено, но это шойлд не будет вставлен