【问题标题】:Case when to update multiple columns at once一次更新多个列的情况
【发布时间】:2012-06-07 12:26:55
【问题描述】:

我以前从未使用过 Case,也不确定如何执行此操作,但我们在进行批发更新时遇到了一些问题,因为地址发生了变化,现在数据中没有使用过。我试图将它用作 if then 语句,但我确信我做错了。当字段为空或为空时,我需要更新地址。

UPDATE    defendants_ALL_Fixed
SET              tiffAdd = tiffAdds.Add1, tiffZip = tiffAdds.Zip, tiffCity = tiffAdds.City, tiffState = tiffAdds.State
FROM         defendants_ALL_Fixed INNER JOIN
                      tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE     (defendants_ALL_Fixed.tiff = tiffAdds.Tiff)

我已经尝试将其包装成一个案例语句,例如:

SELECT
  a.tiffAdd
, CASE WHEN a.tiffAdd = '' THEN

UPDATE    defendants_ALL_Fixed
SET              tiffAdd = tiffAdds.Add1, tiffZip = tiffAdds.Zip, tiffCity = tiffAdds.City, tiffState = tiffAdds.State
FROM         defendants_ALL_Fixed INNER JOIN
                      tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
WHERE     (defendants_ALL_Fixed.tiff = tiffAdds.Tiff)

END
FROM defendants_ALL_Fixed a

这不起作用,我理解为什么它不起作用,但不知道从哪里开始,任何帮助都会很棒。我们每个月只使用一次来更新数据(大约 150 万条记录),它使用的资源目前完全不相关。

谢谢。

【问题讨论】:

    标签: tsql sql-update case


    【解决方案1】:

    假设我理解您的问题(即仅在 defendants_ALL_Fixed 字段为空白时将 defendants_ALL_Fixed 字段更新为 tiffAdds),您可以按以下方式执行此操作(坚持大小写):

    UPDATE  defendants_ALL_Fixed
    SET     tiffAdd = CASE WHEN LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = '' THEN tiffAdds.Add1
                           ELSE tiffAdd
                      END ,
            tiffZip = CASE WHEN LTRIM(RTRIM(ISNULL(tiffZip, ''))) = '' THEN tiffAdds.Zip
                           ELSE tiffZip
                      END ,
            tiffCity = CASE WHEN LTRIM(RTRIM(ISNULL(tiffCity, ''))) = '' THEN tiffAdds.City
                            ELSE tiffCity
                       END ,
            tiffState = CASE WHEN LTRIM(RTRIM(ISNULL(tiffState, ''))) = '' THEN tiffAdds.State
                             ELSE tiffState
                        END
    FROM    defendants_ALL_Fixed
            INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
    

    一个更简单(或者更确切地说,更容易阅读)的选项是基于WHERE 子句(每列一个更新语句)执行简单的更新语句:

    UPDATE  defendants_ALL_Fixed
    SET     tiffAdd = tiffAdds.Add1
    FROM    defendants_ALL_Fixed
            INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
    WHERE   ( LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = '' )
    

    编辑 1: 根据您的评论,这表明您可以只更新 tiffAdd = ''? 的所有列即

    UPDATE  defendants_ALL_Fixed
    SET     tiffAdd = tiffAdds.Add1 ,
            tiffZip = tiffAdds.Zip ,
            tiffCity = tiffAdds.City ,
            tiffState = tiffAdds.State
    FROM    defendants_ALL_Fixed
            INNER JOIN tiffAdds ON defendants_ALL_Fixed.tiff = tiffAdds.Tiff
    WHERE   LTRIM(RTRIM(ISNULL(tiffAdd, ''))) = ''
    

    【讨论】:

    • 它只需要在 tiffAdd 为空或为空时更新,这就是为什么我试图包装它而不是为每个写一个 case 语句,但我只是将每一行更改为 tiffAdd。谢谢!
    • @korrowan 请参阅我的回答中的编辑 1,如果您只想更新 where tiffAdd = '' 您甚至不需要使用 CASE,只需在更新语句中添加 WHERE 子句。
    • 省略 WHERE (defendants_ALL_Fixed.tiff = tiffAdds.Tiff) 有什么影响?是因为 INNER JOIN 而不需要吗?
    • 您不需要在where 子句中使用defendants_ALL_Fixed.tiff = tiffAdds.Tiff,因为您已经在连接的ON 子句中指定了这个,您只在旧的非ANSI 连接中使用了WHERE 子句样式连接
    • 明白了!我最初尝试使用 where 子句并假设被告人_ALL_Fixed.tiff = tiffAdds.Tiff 搞砸了,但我不知道我不需要它。非常感谢!
    【解决方案2】:

    为什么不使用合并呢?在每个字段上使用合并,检查值是否不为空或为空。我认为它可能是最好的(在我自己的解决方案中使用它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多