2

我发现了用一个查询更新 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
4

2 回答 2

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)or 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子句的末尾。

于 2012-10-02T11:44:43.940 回答
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
....
于 2012-10-02T11:43:15.233 回答