2012-06-07 85 views
1

我從來沒有使用過Case,但不知道如何做到這一點,但是由於地址發生變化,我們在執行批量更新時遇到了一些問題,這些地址正在進入未使用的數據至。我試圖用它作爲一個如果然後聲明,但我相信我做錯了。當字段爲空或空時,我需要更新地址。一次更新多個列的情況

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

假設我很理解你的問題(即只用tiffAdds更新defendants_ALL_Fixed場當defendants_ALL_Fixed字段爲空),你可以這樣做如下(案例貼):

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語句)簡單的更新語句:

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

它只需要更新,當tiffAdd爲空或空,這就是爲什麼我試圖包裝它,而不是爲每個寫一個case語句,但我只是將每一行都改爲tiffAdd。謝謝! – korrowan

+0

@korrowan請參閱我的答案編輯1,如果您只想更新tiffAdd ='',您甚至不需要使用CASE,只需在更新語句中添加WHERE子句即可。 – HeavenCore

+0

忽略WHERE(defendants_ALL_Fixed.tiff = tiffAdds.Tiff)的含義是什麼?這是不是因爲INNER JOIN? – korrowan

0

你爲什麼不改用合併?在每個字段上使用合併,檢查值是否爲空或空。我認爲它會是最好的(在我自己的解決方案中使用它)。