2012-10-02 39 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'。在這種情況下,您必須將其移動到更新子句的末尾,請參閱我的編輯。對不起。 –