Установить несколько полей в одной инструкции - PullRequest
2 голосов
/ 01 октября 2010

Я не так хорошо знаком с SQL Server 2008 и не видел ответа на этот вопрос нигде. Позволяет ли TSQL в SQL Server 2008 задавать несколько полей в одном операторе case? Например:

case MyField
    when 1 then ThisField = 'foo', ThatField = 'bar'
    when 2 then ThisField = 'Mickey', ThatField = 'Mouse'
    else ThisField = NULL, ThatField = NULL
end

Поскольку мое условие не меняется, было бы неплохо установить все поля на основе этого условия вместо использования нескольких операторов case с дублированным условием.

Ответы [ 3 ]

2 голосов
/ 01 октября 2010

Вы можете использовать JOIN для производной таблицы или CTE

;WITH updates AS
(
SELECT 1 AS MyField, 'foo' AS ThisField, 'bar' AS ThatField UNION ALL
SELECT 2 AS MyField, 'Mickey' AS ThisField, 'Mouse' AS ThatField 
)
UPDATE    YourTable
SET              ThisField =updates.ThisField, ThatField=updates.ThatField
FROM         YourTable LEFT OUTER JOIN
                      updates ON YourTable.MyField = t.MyField

или для SELECT

;WITH mappings AS
(
SELECT 1 AS MyField, 'foo' AS ThisField, 'bar' AS ThatField UNION ALL
SELECT 2 AS MyField, 'Mickey' AS ThisField, 'Mouse' AS ThatField 
)
SELECT YourTable.MyField,  
       mappings.ThisField,
       mappings.ThatField
FROM         YourTable LEFT OUTER JOIN
                      mappings ON YourTable.MyField = t.MyField
2 голосов
/ 01 октября 2010

Нет, регистр возвращает только скалярное значение.

ThisField = case MyField when 1 then 'foo' when 2 then 'Mickey' end,
ThatField = case MyField when 1 then 'bar' when 2 then 'Mouse' end 
1 голос
/ 01 октября 2010

Когда вы используете CASE, вы можете использовать его только для получения выходного значения, а не для присвоения значения. Вы можете написать несколько запросов на обновление с предложением WHERE, чтобы получить то, что вы собираетесь обновить.

Только что видел, ответ от RedFilter, кажется, способ обновления в одном запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...