2010-10-01 67 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