Обновление SQL с регистром, либо назначить, либо ничего не делать - PullRequest
1 голос
/ 22 марта 2012

Возвращаясь к концу этого вопроса здесь , есть ли способ поместить оператор CASE в SQL UPDATE, который либо обновляет, либо ничего не делает. В настоящее время у меня есть ниже:

UPDATE CustomerAddress
SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE 0 END
FROM CustomerAddress
join #AddressToDeleteMasterOfLesserId p1 on CustomerAddress.Id=p1.[Id that is master]
join CustomerAddress c2 on p1.[Id to delete]=c2.Id 

Проблема возникает в этой строке:

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE **0** END

Когда я устанавливаю его на 0 в противном случае. Обновление должно проверить первое условие, и если это так, установить в 1, но если условие не выполняется, я не хочу устанавливать в 0, мне нужно сохранить исходное значение.

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *CustomerAddress.IsPrimary* END

Однако не работает, потому что он получает значение из оператора FROM, а не то значение, которое было установлено в данный момент. Что я хочу, это что-то вроде

SET IsPrimaryAddress = CASE WHEN c2.IsPrimaryAddress=1 THEN 1 ELSE *Do nothing* END

Но это все еще задание, и оно пытается установить на NULL.

Возможно ли это выше?

UPDATE:

Пример данных:

пара идентификаторов, которые представляют адрес как таковой

ID to keep  ID to delete
------------------------
10          21
10          22
11          31
12          41

Я сосредоточусь на том, что происходит с 10. Итак, 10 имеет IsPrimaryAddress=0, 21 имеет IsPrimaryAddress=1, а 22 имеет IsPrimaryAddress=0.

Я полагаю, что происходит следующее (в псевдокоде):

Установить IsPrimaryAddress = если 21.IsPrimaryAddress = 1, затем установить 21.IsPrimaryAddress, иначе установить 10.IsPrimaryAddress

Итак, мы установили 10.IsPrimaryAddress равным 1. Теперь:

Установить IsPrimaryAddress = если 22.IsPrimaryAddress = 1, затем установить 22.IsPrimaryAddress, иначе установить 10.IsPrimaryAddress

Что, я бы надеялся, 10.IsPrimaryAddress равно 1. Но, похоже, получено исходное значение, равное 0, и теперь обновление потеряно.

Ответы [ 3 ]

3 голосов
/ 22 марта 2012
SET CustomerAddress.IsPrimaryAddress = 
      CASE 
         WHEN c2.IsPrimaryAddress=1 
         THEN 1 
         ELSE CustomerAddress.IsPrimaryAddress 
      END

PS: я не уверен насчет имени таблицы, но идея в том, чтобы вернуть само значение столбца, чтобы оставить его без изменений, это обычная практика.

3 голосов
/ 22 марта 2012

Просто добавьте предложение WHERE, чтобы обновлять только те строки, которые необходимо обновить:

UPDATE CustomerAddress c1
  INNER JOIN #AddressToDeleteMasterOfLesserId p1 ON c1.Id = p1.[Id that is master]
  INNER JOIN CustomerAddress c2 ON p1.[Id to delete] = c2.Id
  SET c1.IsPrimaryAddress = 1
  WHERE c2.IsPrimaryAddress = 1
1 голос
/ 22 марта 2012
UPDATE c
SET IsPrimaryAddress = CASE 
  WHEN c2.IsPrimaryAddress = 1 THEN 1 
  ELSE c.IsPrimaryAddress
END
FROM dbo.CustomerAddress AS c
INNER JOIN #AddressToDeleteMasterOfLesserId AS p1 
  ON c.Id = p1.[Id that is master]
INNER JOIN dbo.CustomerAddress AS c2 
  ON p1.[Id to delete] = c2.Id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...