Преобразовать псевдокод в действительный оператор SQL - PullRequest
1 голос
/ 14 октября 2019

Мне нужно преобразовать приведенный ниже код в действительный оператор SQL.

Я перепробовал несколько операторов Update, но потом понял, что могу использовать обновленное значение в более позднем операторе update. Это может привести к нескольким обновлениям, но исходный код обновляется только один раз. Я также пробовал CASE WHEN, но не могу найти способ разрешить CASE обновлять Annuitant_1_DOB или Owner_DOB.

If B1_Joint_Annuitant_Switch = 1 then
   If (ISNULL(Annuitant_1_DOB) or Annuitant_1_DOB < '1/1/1901') and ISNULL(Owner_DOB) = False then
      Annuitant_1_DOB = Owner_DOB
   Else
      Owner_DOB = Annuitant_1_DOB
   End If
Else
   If (ISNULL(Owner_DOB) or Owner_DOB < '1/1/1901') and ISNULL(Annuitant_1_DOB) = False then
      Owner_DOB = Annuitant_1_DOB
   Else
      Annuitant_1_DOB = Owner_DOB
   End IF
End IF

Конечный SQL должен работать так же, как оператор IF, и производить только 1 обновление данных,Спасибо

Попытка кода:

--If joint_annuitant_switch_Exhibit = 1 then
--   If (ISNULL(DOBofAnnuitant1) or DOBofAnnuitant1 < '1/1/1901') and ISNULL(DOBofOwner) = False then
Update [INS_VAL_SANDBOX].[dbo].[VA_Download]
SET Annuitant_1_DOB = Owner_DOB
Where (Annuitant_1_DOB IS NULL or Annuitant_1_DOB < '1/1/1901') and Owner_DOB IS NOT NULL and B1_Joint_Annuitant_Switch = '1'
--  Else
Update [INS_VAL_SANDBOX].[dbo].[VA_Download]
SET Owner_DOB = Annuitant_1_DOB
Where (Annuitant_1_DOB IS NOT NULL or Annuitant_1_DOB >= '1/1/1901') and Owner_DOB IS NULL and B1_Joint_Annuitant_Switch = '1'
--Else
--   If (ISNULL(DOBofOwner) or DOBofOwner < '1/1/1901') and ISNULL(DOBofAnnuitant1) = False then
Update [INS_VAL_SANDBOX].[dbo].[VA_Download]
SET Owner_DOB = Annuitant_1_DOB
Where (Owner_DOB IS NULL or Owner_DOB < '1/1/1901') and Annuitant_1_DOB IS NOT NULL and B1_Joint_Annuitant_Switch <> '1'
--  Else
Update [INS_VAL_SANDBOX].[dbo].[VA_Download]
Set Annuitant_1_DOB = Owner_DOB
Where (Owner_DOB IS NOT NULL or Owner_DOB >= '1/1/1901') and Annuitant_1_DOB IS NULL and B1_Joint_Annuitant_Switch <> '1'

И еще одна попытка (очевидно, не работает):

Select
CASE B1_Joint_Annuitant_Switch 
    When 1 Then
        CASE WHEN (Annuitant_1_DOB IS NULL or Annuitant_1_DOB < '1/1/1901') and Owner_DOB IS NOT NULL Then Annuitant_1_DOB = Owner_DOB
        ELSE Owner_DOB = Annuitant_1_DOB END
    ELSE
        CASE WHEN (Owner_DOB IS NULL or Owner_DOB < '1/1/1901') and Annuitant_1_DOB IS NOT NULL Then Owner_DOB = Annuitant_1_DOB
        ELSE Annuitant_1_DOB = Owner_DOB END
    END
From [INS_VAL_SANDBOX].[dbo].[VA_Download]

1 Ответ

1 голос
/ 14 октября 2019

Ваш код выглядит нормально для меня - единственное изменение, которое я хотел бы сделать, это иметь

BEGIN TRANSACTION;

в начале

и

COMMIT;

в конце, чтобы сделать весь процесс атомарным.

Как именно ваш код потерпел неудачу?

PS - Какого типа B1_Joint_Annuitant_Switch? Если это символ или varchar, то ваш код верен, если это число, то вы хотите удалить кавычки

  B1_Joint_Annuitant_Switch = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...