2014-01-31 3 views
1

Если какой-либо один из следующих условий, я хочу код, чтобы перейти к следующему шагу выполнения:Использование вложенных IF ELSE заявления в SQL

  1. Имя, Фамилия и DOB: все три не являются пустой
  2. ID и DOB не является пустой
  3. ПНУЛИ и DOB не является пустым
  4. ID и номер группы не являются пустым

Ниже приведен код, у меня есть. Когда я запускаю его, предоставляя имя, фамилию и ДОБ (условие 1 выполнено), оно все равно не работает, так как условие 4 не выполняется. Может ли кто-нибудь сказать мне, что я делаю неправильно?

IF ((@FirstName IS NULL 
     OR Len(Ltrim(@FirstName)) = 0) 
    AND (@LastName IS NULL 
      OR Len(Ltrim(@LastName)) = 0) 
    AND (@DOB IS NULL)) 
    BEGIN 
     INSERT INTO @ValidationError 
        (errormessage) 
     VALUES  ('first name, last name and Date of Birth must be specified.' 
    ) 
    END 
ELSE 
    BEGIN 
     IF (@DOB IS NULL 
      AND @Id IS NULL) 
     BEGIN 
      INSERT INTO @ValidationError 
         (errormessage) 
      VALUES  ('Date of Birth and Id must be specified.') 
     END 
     ELSE 
     BEGIN 
      IF (@DOB IS NULL 
       AND @SSN IS NULL) 
       BEGIN 
        INSERT INTO @ValidationError 
           (errormessage) 
        VALUES  ('Date of Birth and SSN must be specified.') 
       END 
      ELSE 
       BEGIN 
        IF (@Id IS NULL 
         AND @GroupNumber IS NULL) 
        BEGIN 
         INSERT INTO @ValidationError 
            (errormessage) 
         VALUES  ('Id and Group Number must be specified.') 
        END 
       END 
     END 
    END 
+0

Я попытался следующие два варианта ответа ниже, но не может работать это. Вместо этого я обновляю параметр для каждой вставки в таблице @ValidationError, а затем использую метку GOTO, если параметр не обновляется (что означало бы, что ничего не было вставлено в таблицу). GOTO - это старая привычка, которую я только что вспомнил, с дней программирования FORTRAN. –

ответ

3

CASE утверждение было бы проще:

INSERT INTO @ValidationError (errormessage) 
SELECT CASE WHEN Criteria1 THEN 'first name, last name and Date of Birth must be specified.' 
      WHEN Criteria2 THEN 'Date of Birth and Id must be specified.' 
      WHEN Criteria3 THEN 'Date of Birth and SSN must be specified.' 
      WHEN Criteria4 THEN 'Id and Group Number must be specified.'   
     END 

Насколько ошибка в вашем синтаксисе, у вас есть посторонний BEGIN и END, я считаю, что следующий будет работать:

IF ((@FirstName IS NULL OR Len(Ltrim(@FirstName)) = 0) 
    AND (@LastName IS NULL OR Len(Ltrim(@LastName)) = 0) 
    AND (@DOB IS NULL)) 
    BEGIN 
      INSERT INTO @ValidationError 
         (errormessage) 
      VALUES  ('first name, last name and Date of Birth must be specified.') 
    END 
ELSE IF (@DOB IS NULL AND @Id IS NULL) 
    BEGIN 
     INSERT INTO @ValidationError 
        (errormessage) 
     VALUES  ('Date of Birth and Id must be specified.') 
    END 
ELSE IF (@DOB IS NULL AND @SSN IS NULL) 
    BEGIN 
     INSERT INTO @ValidationError 
        (errormessage) 
     VALUES  ('Date of Birth and SSN must be specified.') 
    END 
ELSE IF (@Id IS NULL AND @GroupNumber IS NULL) 
    BEGIN 
     INSERT INTO @ValidationError 
        (errormessage) 
     VALUES  ('Id and Group Number must be specified.') 
    END 
0

Во-первых, ваша логика терпит неудачу, потому что у вас есть if/then/elseif. Другими словами, если у кого-то есть имя, фамилия и дата рождения, тогда они передают первые критерии. Чем ты занимаешься? Вы идете и проверяете следующий. Неа. Они прошли, поэтому вы хотите продолжить.

Вы испытываете отказ от всех критериев, а не для отказа от одного из них. Ваши сообщения об ошибках отражают это. Не существует четырех сообщений об ошибках. Есть только один. В принципе, это конкатенация всех ваших, потому что ни одно из условий не будет выполнено.

Структура должна быть:

if (criteria1 failse) { 
    if (criteria2 fails) { 
     if (criteria3 fails) { 
      if (criteria4 fails) { 
       everything failse 
      } 
     } 
    } 
} 

Престол, если ничего не проходит, то вы не можете произвольно выбрать один выходит из строя.

Вы можете обернуть это в одном запросе:

insert into @ValidationError(errormessage) 
    SELECT 'You need to specify one of the following: '+ 
      'first name, last name and Date of Birth must be specified; ' + 
      'Date of Birth and Id must be specified; ' + 
      'Date of Birth and SSN must be specified; ' + 
      'Id and Group Number must be specified.'   
    from (select (case when not ((@FirstName IS NULL OR Len(Ltrim(@FirstName)) = 0) AND 
           (@LastName IS NULL OR Len(Ltrim(@LastName)) = 0) AND 
           (@DOB IS NULL) 
          ) 
         then 'Criteria1' 
         when not (@DOB IS NULL AND @Id IS NULL) 
         then 'Criteria2' 
         when not (@DOB IS NULL AND @SSN IS NULL) 
         then 'Criteria3' 
         when not (@Id IS NULL AND @GroupNumber IS NULL) 
        end) as whichsuccess 
     ) t 
    where whichsuccess is null; 
Смежные вопросы