何时一次更新多个列的情况

时间:2012-06-07 12:26:56

标签: tsql sql-update case

我以前从未使用过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万条记录),此时它使用的资源根本不相关。

感谢。

2 个答案:

答案 0 :(得分:2)

假设我理解您的问题(即defendants_ALL_Fixed字段为空时只更新tiffAdds defendants_ALL_Fixed字段),您可以按照以下方式执行此操作(坚持使用案例):< / p>

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, ''))) = ''

答案 1 :(得分:0)

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