2012-06-07 4 views
1

Я никогда не использовал 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 

Который не работает, и я понимаю, почему он не работает, но понятия не имею, куда идти отсюда и любая помощь было бы замечательно. Мы используем это только один раз в месяц для обновления данных (около 1,5 миллионов записей), а ресурсы, которые он использует, на данном этапе совсем не актуальны.

Спасибо.

ответ

2

Предполагая, что я понять Ваш вопрос (то есть только обновить defendants_ALL_Fixed поля с tiffAdds когда 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 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, ''))) = '') 

Edit 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 равно null или пустое, и именно поэтому я пытался его обернуть, а не писать инструкцию case для каждого, но я просто изменил каждую строку на tiffAdd. Спасибо! – korrowan

+0

@korrowan См. Редактировать 1 в моем ответе, если вы хотите только обновить, где tiffAdd = '' вам даже не нужно использовать CASE, просто добавьте предложение WHERE в оператор обновления. – HeavenCore

+0

Каковы последствия отказа от WHERE (protectants_ALL_Fixed.tiff = tiffAdds.Tiff)? Разве это не нужно из-за INNER JOIN? – korrowan

0

Почему вы не используете слияние вместо этого? Используйте слияние по каждому полю, проверяя, не является ли значение значением null или пустым. Я думаю, что он будет лучшим (использовал его на моем собственном решении).