2010-10-01 134 views
2

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

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

由于我的病情没有变化,这将是很好的设定基于这一条件,而不是使用多个case语句与重复的条件的所有领域。

回答

1

你可以使用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 
+0

是的。除了我没有更新。这种情况是更长的SELECT语句的一部分。但是,这种方法稍后会提到。谢谢。 – 2010-10-01 14:21:16

+0

@Count - 那么你可以使用相同的方法来做'SELECT'! – 2010-10-01 14:28:20

+0

这个建议非常有效。我将case语句放在派生表创建中,然后用新的派生版本替换了一个连接表。这给了我所需的灵活性,并允许我在select语句的主体中不使用case语句的多个实例。谢谢。 – 2010-10-01 15:26:10

2

不,案件只返回一个标量值。

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

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

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

+0

我的代码是写得不好。这不是一个更新语句,而是一个混乱的“AS”语法。更像是:当1则'foo'为ThisField时,'bar'为ThatField。但是,似乎答案是否定的。叹! – 2010-10-01 14:10:06

+0

我同意RedFilter。但是在一个复杂的案例陈述中,合并代码而不是重复“when”子句将是非常好的。 – 2010-10-01 14:18:55