然后使用CASE更新2个mysql行

时间:2012-10-02 11:41:38

标签: php mysql sql sql-update case

我发现这个语法用于通过一个查询更新2个mysql行。它看起来很棒,但我不能按照我想要的方式工作。

如果有人能告诉我这种语法是否错误,我会非常感激。 我能正确理解吗?

$id_active = 1;
$id_swap = 2;

UPDATE article_test
// the column to update is 'sort_id' and since it is also the column I need to test,  then I use the same value for CASE right?
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap  // sort_id 1 to become sort_id 2
WHEN $id_swap THEN $id_active // sort_id 2 to become sort_id 1
WHERE sort_id IN ($id_swap,$id_active) // test only rows with sort_id 1 & sort_id 2

2 个答案:

答案 0 :(得分:2)

请改为尝试:

UPDATE article_test
SET sort_id =
  CASE 
    WHEN sort_id = $id_active THEN $id_swap  
    WHEN sort_id = $id_swap THEN $id_active 
    ELSE sort_id
  END
WHERE sort_id IN ($id_swap, $id_active)

请注意:

  • 您必须指定END子句。
  • 如果您未指定ELSE子句,则默认值为NULL

Update2:为了澄清这一点,CASE有两种语法。第一个是简化如下:

CASE sort_id
  WHEN $id_active THEN $id_swap  
  WHEN $id_swap   THEN $id_active 
  ELSE sort_id
END  

您会看到sort_id仅在CASE关键字后指定一次。但是,如果您想添加sort_id IN (1, 2, 3)otherfield LIKE ''等条件,该怎么办?您无法在此简化语法中添加这些条件。您必须以sort_id关键字之后列出CASE的方式另外编写,如下所示:

CASE 
  WHEN sort_id = $id_active THEN $id_swap  
  WHEN sort_id = $id_swap   THEN $id_active 
  WHEN sort_id LIKE '' THEN blah
  ELSE sort_id
END 

使用CASE表达式,使用这两种语法中的任何一种,使用UPDATE语句,您必须在WHERE结束后编写CASE子句表达。你不能在CASE表达式中将它混合在UPDATE子句的末尾写入。

答案 1 :(得分:1)

您需要使用ELSE...END结束您的个案陈述:

UPDATE article_test
SET sort_id = CASE sort_id
WHEN $id_active THEN $id_swap  
WHEN $id_swap THEN $id_active 
else sort_id end
....