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


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

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

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

4 82

4 ответа:

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

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

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

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

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

enter image description here

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

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

enter image description here

Я считаю, что вы можете опустить обновление" нежелательных " столбцов, настроив другие ответы следующим образом:
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)

Теперь я предполагаю, что вы можете написать условное выражение, которое обрабатывает нули. Для моего примера, я предполагая, что вы написали такое условие, которое оценивается как True, False или Null. Если вам нужна помощь с этим, дайте мне знать, и я сделаю все возможное.

Теперь запуск этих двух строк кода действительно изменяет X на 25 тогда и только тогда, когда ColConditional истинно(1) и Y на 25 тогда и только тогда, когда ColConditional ложно(0)

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

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