2012-10-02 42 views
2

我发现这个语法用一个查询更新2个mysql行。它看起来很棒,但我无法按照自己想要的方式工作。更新2使用CASE WHENEN的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 

回答

1

你需要一个ELSE...END这样结束你的case语句:

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 
.... 
+0

谢谢,我忘了结束。 :) – Buddy

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有两个syntaxs。第一个是简化的,像这样:

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

你看,sort_idCASE关键字后只指定一次。但是如果你想添加一个条件,如sort_id IN (1, 2, 3)otherfield LIKE ''。您不能以这种简化的语法添加这些条件。你必须把它写的其他方式,而不CASE关键字,像这样上市后的sort_id

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表达,与任何这两个syntaxs的,与UPDATE声明你写的WHERE子句CASE结束后的表达式。你不能把它混在CASE表达式里面写在UPDATE条款的末尾。

+0

谢谢你。我不明白这一行.. WHERE sort_id IN($ id_swap,$ id_active)THEN'something else' 什么是'别的东西'? – Buddy

+0

对不起,我编辑了我原来的帖子。我打回车按钮认为它会给出一个换行符,但它只是张贴我的第一句话:P WHERE sort_id IN($ id_swap,$ id_active)那么'别的东西'什么是'别的东西'? – Buddy

+0

@Buddy - 对不起,我刚刚注意到它是'WHERE',我以为它是'WHEN'。在这种情况下,您必须将其移动到更新子句的末尾,请参阅我的编辑。对不起。 –