我在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
答案 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
;