2014-01-16 86 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') 
;