【问题标题】:SQL Compare a field that is being updatedSQL 比较正在更新的字段
【发布时间】:2011-10-21 09:40:41
【问题描述】:

我有以下疑问:

UPDATE #Temp_SessionItem SET [Status] = 
    CASE
        WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL) AND [Status] = 1
            THEN 3
        WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL AND [Status] = 1
            THEN 2
    END

问题是当它被执行时它实际上并没有给我我期望的结果。即它不会将 [Status] 字段的值设置为 3,以防 [AddressFK] 或 [StatusFK] 为 NULL。相反,它只是在应该添加 3 时尝试将 NULL 添加到 Status。

如果我删除表达式的 AND [Status] = 1 部分,它确实返回 3,但它也会更新不是 [Status] = 1 的值。

我在这里有什么明显的遗漏吗?

我使用的是 SQL Server 2008。

编辑:

在 Royi Namir 向我指出之后,我意识到问题肯定出在执行此查询的存储过程的更深处。具体来说,#Temp_SessionItem 只是一个临时表。在上面提到的查询之后,我尝试使用以下查询更新原始表:

--  update the status of the original session item table
    UPDATE UploadSessionItem SET [Status] = T.[Status]
    FROM #Temp_SessionItem AS T
    WHERE UploadSessionItem.UploadSessionItemId  = T.ID

..这显然不起作用,因为所有 [Status] 项目仍然存在 1

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-update case


    【解决方案1】:

    如果您只想影响当前STATUS1 的行,则需要WHERE 子句:

    UPDATE #Temp_SessionItem SET [Status] = 
        CASE
            WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
                THEN 3
            WHEN [AddressFK] IS NOT NULL AND [StatusFK] IS NOT NULL
                THEN 2
        END
    WHERE [Status] = 1
    

    您显示的更新工作正常:

    create table UploadSessionItem(UploadSessionItemID int,Status int)
    insert into UploadSessionItem
    select 1,1 union all select 2,2
    create table #Temp_SessionItem (ID int,Status int)
    insert into #Temp_SessionItem select 1,4
    --Your UPDATE:
    UPDATE UploadSessionItem SET [Status] = T.[Status]
        FROM #Temp_SessionItem AS T
        WHERE UploadSessionItem.UploadSessionItemId  = T.ID
    --
    select * from UploadSessionItem
    

    结果:

    UploadSessionItemID Status
    1                   4
    2                   2
    

    因此,如果问题在其他地方,则不在您向我们展示的代码示例中。

    【讨论】:

      【解决方案2】:

      @bojanskr ,要么 [AddressFK] 和 [StatusFK] 都不是 null ,要么你的状态!=1

      更新前的状态值是多少?他是什么类型的人?

      在此处

      粘贴此查询的结果:

        select case when [AddressFK] IS NULL then 'AddressFKnull' else 'AddressFKNOTnull' end,
          case when [StatusFK] IS NULL then 'StatusFKnull' else 'StatusFKNOTnull' end , Status
          from  #Temp_SessionItem
      

      【讨论】:

      • 更新前状态为1,所以处理后应设置为3或2。状态为smallint类型
      • 可以为空?在更新之前他有什么价值?
      • 不,它不能为空。在更新之前它的值为 1
      • 由于问题出在其他地方,我会更新我的问题
      【解决方案3】:

      您没有默认情况,因此当这些条件都不为真时,您会得到 NULL。你可以这样重写:

      UPDATE #Temp_SessionItem SET [Status] = 
        CASE
          WHEN ([AddressFK] IS NULL OR [StatusFK] IS NULL)
              THEN 3
          ELSE 2
        END
      WHERE [Status] = 1
      

      【讨论】:

        猜你喜欢
        • 2019-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-24
        • 1970-01-01
        • 1970-01-01
        • 2017-12-10
        • 1970-01-01
        相关资源
        最近更新 更多