2011-12-01 183 views
9

我有一个使用CASE子句MySQL的CASE ... WHERE ... THEN语句

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
    WHEN partFK = 2 THEN 8 
END 
WHERE buildFK = 1; 

上面的语句作品一个MySQL UPDATE语句。然而,当我删除WHEN语句之一时,它会中断,并且错误指示CASE子句不返回任何内容。是否CASE子句必须有多个WHEN才能运作。

我不知道我需要多少更新,所以我试图构建一个可以处理一个或多个更新的更新语句。

感谢您提供的任何见解。

回答

26

并非CASE必须有多个WHEN...THEN,而是它必须处理您提供的所有日期。

如果您删除了其中一个条款,则会留下一个洞。例如

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
END 
WHERE buildFK = 1; 

有了这个更新语句,如果parkFK是2,那么更新,因为案件不能处理输入失败。

您可以通过向where子句中添加另一行(例如AND partFK in (1,2))来限制源数据,也可以将ELSE添加到案例表达式中。

UPDATE partsList SET quantity = 
CASE 
    WHEN partFK = 1 THEN 4 
    WHEN partFK = 2 THEN 8 
    ELSE 12 
END 
WHERE buildFK = 1; 

但是,根据您显示的SQL语句,可能有更好的方法。据推测,partFK是其他表格的外键。你能从那里得到quantity的值吗?

+0

啊,我明白了。我读过数据库评估每行的CASE,所以现在有意义。表格是构建和部分之间的链接,这个表格是数量存储的地方。我可以使用ELSE中的当前值吗?即ELSE数量 – CDspace

+0

是的,'ELSE数量'应该工作。 – recf

+1

太棒了,谢谢你为我清理那个。而为了记录,“ELSE数量”确实有效。 – CDspace