T-SQL: использование регистра в инструкции UPDATE для обновления определенных столбцов в зависимости от условия
Мне интересно, возможно ли это вообще. Я хочу обновить столбец x, если условие истинно, иначе столбец y будет обновлен
UPDATE table SET
(CASE (CONDITION) WHEN TRUE THEN columnx
ELSE columny
END)
= 25
Я искал повсюду, пробовал некоторые вещи и не могу найти решение. Я думаю, что это невозможно, но я подумал, что спрошу здесь и посмотрю, сделал ли кто-нибудь это раньше. Спасибо заранее.
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
Я считаю, что вы можете опустить обновление" нежелательных " столбцов, настроив другие ответы следующим образом:
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 случай не был упомянут в оригинальном вопрос или обновлять этот вопрос, но, как видите, это очень просто ответ обрабатывает их в любом случае.