Tsql 在单个case语句中设置多个字段

Tsql 在单个case语句中设置多个字段,tsql,sql-server-2008,case,Tsql,Sql Server 2008,Case,我对SQLServer2008不太熟悉,在其他任何地方我都没有看到这个问题的答案。SQL Server 2008中的TSQL是否允许在单个case语句中设置多个字段。例如: case MyField when 1 then ThisField = 'foo', ThatField = 'bar' when 2 then ThisField = 'Mickey', ThatField = 'Mouse' else ThisField = NULL, ThatField =

我对SQLServer2008不太熟悉,在其他任何地方我都没有看到这个问题的答案。SQL Server 2008中的TSQL是否允许在单个case语句中设置多个字段。例如:

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

由于我的条件不变,因此最好基于该条件设置所有字段,而不是使用多个case语句和重复的条件。

否,case只返回标量值

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

当您使用CASE时,您只能使用它来获取输出值,而不能指定值。可以使用WHERE子句编写多个update查询,以获取要更新的内容


刚才看到,RedFilter的答案似乎是在一个查询中更新的方式。

您可以使用对派生表或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
或选择


我的代码写得很糟糕。这不是一个update语句,而是一个混乱的语法。更像:当1然后“foo”作为这个字段,“bar”作为那个字段。但是,答案似乎是否定的。唉!我同意RedFilter。但是在复杂的case语句中,最好合并代码,而不是重复when子句.True。除了我没有更新。这种情况是较长的SELECT语句的一部分。然而,这种方法在后面会被提到。谢谢。@Count-您可以使用相同的方法进行选择!这个建议非常有效。我将case语句放在派生表创建中,然后用新的派生版本替换联接表。这给了我所需的灵活性,并允许我在select语句体中不使用case语句的多个实例。谢谢
;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