当没有匹配时,CASE语句将我的所有值更新为NULL?

时间:2013-09-26 00:40:16

标签: mysql sql case

我在MySql中使用CASE语句时遇到问题。我在下面添加了一些代码,作为我尝试做的一个例子。我认为如果在WHEN声明中没有匹配,那么就不会发生任何变化,但这似乎不会发生。

我没有my_contacts表中的contact_id值为66的记录,所以我认为什么都不会发生,而是zip_code列中的所有值都变为null。为什么是这样?

UPDATE my_contacts
SET zip_code =
CASE
 WHEN contact_id = 66 THEN '33333'
END;

我如何仅使用案例更新一些记录?例如,我想只更新与contact_id = 1和contact_id = 2匹配的记录。它确实更新了这两个记录,但也更改了现有的邮政编码,来自' 90004'为NULL,为什么?

UPDATE my_contacts 
SET zip_code = 
CASE 
WHEN contact_id = 1 THEN '94301' 
WHEN contact_id = 2 THEN '08540' 
END; 

查询OK,受影响的3行(0.01秒)匹配的行数:5已更改:3警告:0

2 个答案:

答案 0 :(得分:4)

您错误地使用了CASE。使用WHERE子句进行条件更新:

UPDATE my_contacts SET zip_code = '33333' WHERE contact_id = 66;

CASE表达式只决定要返回的值 - 而不是哪些行受到影响。来自documentation

  

如果[是]没有匹配的结果值,则返回ELSE之后的结果,如果没有NULL部分则返回ELSE

所以你所做的就是这个:

UPDATE my_contacts
SET zip_code = CASE WHEN contact_id = 66 THEN '33333' ELSE NULL END
;

为了响应您的更新,您需要执行以下操作:

UPDATE my_contacts 
SET zip_code =
    CASE 
        WHEN contact_id = 1 THEN '94301' 
        WHEN contact_id = 2 THEN '08540' 
    END
WHERE contact_id IN (1, 2)
;

但是只为几条记录做这件事才有意义。有关更具可扩展性的解决方案,请参阅此帖子:MySQL bulk INSERT or UPDATE

答案 1 :(得分:2)

UPDATE my_contacts 
 SET zip_code = 
    CASE  
        WHEN contact_id =  1  THEN  '94301'  
        WHEN contact_id =  2  THEN  '08540' 
    ELSE zip_code
    END 
;