【问题标题】:Convert pseudo code to valid SQL statement将伪代码转换为有效的 SQL 语句
【发布时间】:2019-10-14 15:00:19
【问题描述】:

我需要将以下代码转换为有效的 SQL 语句。

我尝试了多个更新语句,但后来意识到我可以在以后的更新语句中使用更新的值。这可能会导致多次更新,但原始代码只更新一次。 我也尝试过 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]

【问题讨论】:

    标签: sql sql-update


    【解决方案1】:

    你的代码对我来说看起来不错——我要做的唯一改变就是有一个

    BEGIN TRANSACTION;
    

    一开始

    还有一个

    COMMIT;
    

    最后使整个过程原子化。

    您的代码究竟是如何失败的?

    PS -- B1_Joint_Annuitant_Switch 是什么类型的?如果它是字符或 varchar,那么你的代码是正确的,如果它是一个数字,那么你想删除引号

      B1_Joint_Annuitant_Switch = 1
    

    【讨论】:

    • 你指的是哪一个,多次更新?恐怕我可能会在第一条语句中更新 Annuitant_1_DOB,然后使用它在第二条语句(和第三条语句)中设置一个值。我不应该更新多个值。我真的只想运行其中一个更新,而不是所有更新。B1_Joint_Annuitant_Switch 是 varchar。
    • @JRDew 如果您使用 begin transaction 和 commit 多次更新就可以了——因为 where 语句只允许更新发生在不同的记录上。如果没有正在进行的事务,如果其他用户进来并在更新之间更改它们,则可能是错误的。事务将确保它是原子的
    • 谢谢,我不熟悉 BEGIN TRANSACTION 和 COMMIT。我现在要去了解更多。谢谢您的帮助。我担心多个更新会在同一个记录上运行,因为我一直在进行更新,但情况似乎并非如此。再次感谢。
    • 是的,在标记为已解决之前,我只是在研究 BEGIN TRANSACTION。现在完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2011-01-24
    • 2012-05-08
    • 2014-05-28
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多