2014-01-16 131 views
1

我有我使用更新的性别栏,如果将其设置在马累,然后为M更新,女性在下面的查询,更新到F正确使用SQL CASE语句

的语句运行第一次罚款。

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 

任何人都可以建议吗?

谢谢

回答

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') 

这将避免更新行再次。

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

肯定的。如果您不想编辑所有行,您也可以在更新中添加WHERE子句,以仅触摸'男'或'女'(或不是'M'或'F')的行,获得相同的结果。 –

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 
0

如果您只想更新该列的时间为'Male''Female',则将其作为您声明的附加标准。既然看起来你只想留下第一个字符,你可以使用LEFT()或SUBSTRING()来提取它,而不是你的CASE表达式。

所以,在这里你去:

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