正确使用Sql CASE语句

时间:2014-01-16 16:25:22

标签: sql-server-2008 tsql case

我有以下查询,我用它来更新性别列,如果它设置为男性,然后更新为M,为女性,更新为F

该声明第一次正常运行。

UPDATE [People].[People]
SET GENDER = CASE WHEN GENDER = 'Male' THEN 'M' 
WHEN GENDER = 'Female' THEN 'F'  END WHERE Id=40

我的问题是,如果性别已经是'M',那么当再次运行该语句时,'M'设置为NULL

我可以在下面做,但似乎有点软糖

UPDATE [People].[People]
SET GENDER = CASE WHEN GENDER = 'Male' THEN 'M' 
WHEN GENDER = 'Female' THEN 'F' 
    WHEN GENDER = 'M' THEN 'M'
WHEN GENDER = 'F' THEN 'F'
END WHERE Id=40

有人可以提供建议吗?

感谢

4 个答案:

答案 0 :(得分:5)

向WHERE子句添加另一个条件:

UPDATE [People].[People]
SET GENDER = CASE WHEN GENDER = 'Male' THEN 'M' 
WHEN GENDER = 'Female' THEN 'F'  END 
WHERE Id=40 
AND NOT GENDER IN ('M', 'F') 

这将避免再次更新行。

答案 1 :(得分:4)

默认为现有值;

SET GENDER = CASE 
  WHEN GENDER = 'Male' THEN 'M' 
  WHEN GENDER = 'Female' THEN 'F'   
  ELSE GENDER
END WHERE Id=40

甚至

SET GENDER = LEFT(GENDER, 1)

答案 2 :(得分:0)

您可以使用IN

执行此操作
UPDATE [People].[People]
SET GENDER = CASE WHEN GENDER in ('Male','M') THEN 'M' 
WHEN GENDER in ('Female','F')  THEN 'F'  END WHERE Id=40

答案 3 :(得分:0)

如果您只想在列'Male''Female'时更新列,请将其作为语句的附加标准。而且由于您似乎只想留下第一个字符,您可以使用LEFT()或SUBSTRING()来提取它而不是CASE表达式。

所以,你走了:

UPDATE [People].[People]
SET GENDER = LEFT(GENDER, 1)
WHERE Id = 40
AND GENDER IN ('Male', 'Female')
;
相关问题