SQL使用CASE语句更新列中的行

时间:2013-01-17 21:03:12

标签: sql sql-server case

我有两个表,Users和#TempTable(用户的子集)。我想更新Users表中的列IsActive。如果#TempTable中的用户也在Users表中,我想设置IsActive = 1,否则设置IsActive = 0。

从不在#TempTable中的用户获取用户(对于这些用户,IsActive应设置为0):

-- (Users \ #TempTable) U (#TempTable \ Users)
SELECT  u.UserName
FROM    Users u 
WHERE   (u.UserName) NOT IN 
    (SELECT t.[User Name] FROM #TempTable t) 
UNION ALL 
SELECT  t.[User Name] 
FROM    #TempTable t
WHERE   (t.[User Name]) NOT IN 
    (SELECT u.UserName FROM Users u)

让我们将其称为ResultSet。我很感激UPDATE声明的一些帮助。我希望能做的是:

UPDATE Users
SET IsActive = (CASE WHEN User.UserName IN ResultSet THEN 0 ELSE 1 END) 

无需为每个User.UserName写出CASE WHEN。提前谢谢!

1 个答案:

答案 0 :(得分:5)

您可以在UPDATE语句中使用连接。

UPDATE Users
SET Users.Active = CASE WHEN T.UserName is null THEN 0 ELSE 1 END 
FROM Users AS U
LEFT JOIN #TempTable AS T ON U.UserName = T.UserName

注意:

  • 您也可以使用子查询但速度要慢得多(n平方的顺序不是n的顺序)。对于少数用户而言,这无关紧要。

  • 我做了而不是测试所以我上面的代码中可能有错误/错误


根据关于这不起作用的疯狂评论我实施了一个小提琴。

享受它的工作:

http://sqlfiddle.com/#!6/25235/3