T-SQL: использование CASE в инструкции UPDATE для обновления определенных столбцов в зависимости от условия

Мне интересно, возможно ли это вообще. Я хочу обновить столбец x, если условие истинно, иначе столбец y будет обновлен

UPDATE table SET
     (CASE (CONDITION) WHEN TRUE THEN columnx
                       ELSE columny
      END)
= 25

Я искал по всему, опробовал некоторые вещи и не смог найти решение. Я думаю, это невозможно, но я думал, что попрошу здесь и посмотрю, сделал ли кто-нибудь это раньше. Спасибо заранее.

Ответ 1

Вы не можете использовать условие, чтобы изменить структуру вашего запроса, а только данные. Вы можете сделать это:

update table set
    columnx = (case when condition then 25 else columnx end),
    columny = (case when condition then columny else 25 end)

Это семантически то же самое, но просто имейте в виду, что оба столбца всегда будут обновляться. Вероятно, это не вызовет каких-либо проблем, но если у вас высокий объем транзакций, это может вызвать проблемы concurrency.

Единственный способ сделать то, что вы просите, - это использовать динамический SQL. Это, однако, то, что я бы посоветовал вам держаться подальше. Решение выше почти наверняка будет достаточным для того, что вам нужно.

Ответ 2

UPDATE  table
SET     columnx = CASE WHEN condition THEN 25 ELSE columnx END,
        columny = CASE WHEN condition THEN columny ELSE 25 END

Ответ 3

введите описание изображения здесь

Я хочу изменить или обновить свой ContactNo до 8018070999, где есть 8018070777 с использованием оператора Case

update [Contacts] set contactNo=(case 
when contactNo=8018070777 then 8018070999
else
contactNo
end)

введите описание изображения здесь

Ответ 4

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

IF (CONDITION) IS TRUE
BEGIN
    UPDATE table SET columnx = 25
END
ELSE
BEGIN
    UPDATE table SET columny = 25
END

Теперь у этого есть еще одно преимущество: у него нет ненужных записей в таблице, как указано выше.

Ответ 5

Я знаю, что это очень старый вопрос, но это сработало для меня:

UPDATE TABLE SET FIELD1 =
CASE 
WHEN FIELD1 = Condition1 THEN 'Result1'
WHEN FIELD1 = Condition2 THEN 'Result2'
WHEN FIELD1 = Condition3 THEN 'Result3'
END;

С уважением

Ответ 6

Я считаю, что вы можете опустить обновление "нежелательных" столбцов, настроив остальные ответы следующим образом:
update table set columnx = (case when condition1 then 25 end), columny = (case when condition2 then 25 end)

Как я понимаю, это будет обновляться только тогда, когда условие выполнено.

Прочитав все комментарии, это наиболее эффективно:
Update table set ColumnX = 25 where Condition1 Update table set ColumnY = 25 where Condition1

Пример таблицы:
CREATE TABLE [dbo].[tblTest]( [ColX] [int] NULL, [ColY] [int] NULL, [ColConditional] [bit] NULL, [id] [int] IDENTITY(1,1) NOT NULL ) ON [PRIMARY]
Пример данных:
Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 0) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (null, null, 1) Insert into tblTest (ColX, ColY, ColConditional) values (1, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (2, null, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 1, null) Insert into tblTest (ColX, ColY, ColConditional) values (null, 2, null)

Теперь я предполагаю, что вы можете написать условие, которое обрабатывает null. Для моего примера я предполагаю, что вы написали такое условное выражение, которое оценивается как True, False или Null. Если вам нужна помощь в этом, дайте мне знать, и я сделаю все возможное. Теперь выполнение этих двух строк кода приводит к изменению X до 25, если и только если ColConditional является True (1) и Y до 25, если и только если ColConditional является False (0)

Update tblTest set ColX = 25 where ColConditional = 1 Update tblTest set ColY = 25 where ColConditional = 0

P.S. Нулевой случай никогда не упоминался в исходном вопросе или каких-либо обновлениях вопроса, но, как вы можете видеть, этот очень простой ответ обрабатывает их в любом случае.