2012-12-02 79 views
21

我想用case語句更新表中的多列,但我找不到如何做到這一點(甚至有可能)。我想出了以下無效引用查詢:更新多列的MySQL CASE

UPDATE tablename SET 
    CASE name 
     WHEN 'name1' THEN col1=5,col2='' 
     WHEN 'name2' THEN col1=3,col2='whatever' 
     ELSE col1=0,col2='' 
    END; 

是否有實現與有效的SQL預期結果的方法嗎?

+0

可能的重複:http://stackoverflow.com/questions/8358642/case-statement-in-sql-how-to-return-multiple-variables – ean5533

+1

不是真的,這是一個更新聲明,而不是選擇一個。 – Villermen

+0

重複http://stackoverflow.com/q/3432/1553851 – shmosel

回答

29
UPDATE tablename 
SET col1 = CASE WHEN name = 'name1' THEN 5 
       WHEN name = 'name2' THEN 3 
       ELSE 0 
      END 
, col2 = CASE WHEN name = 'name1' THEN '' 
       WHEN name = 'name2' THEN 'whatever' 
       ELSE '' 
      END 
; 
+0

感謝您的支持!我將使用ean5533的格式,因爲它包含CASE名稱,但是這個格式更好,所以我將其標記爲anser。 – Villermen

+0

有趣......我不知道這是有效的語法。每天學些新東西。 – bobwienholt

+0

非常感謝@ bobwienholt對於這個UPDATE CASE查詢 – Pank

6

我不知道任何干淨的方式來做你所問的。等效有效的SQL更新將是:

UPDATE tablename SET 
    col1 = CASE name WHEN 'name1' THEN 5 WHEN 'name2' THEN 3 ELSE 0 END, 
    col2 = CASE name WHEN 'name1' THEN '' WHEN 'name2' THEN 'whatever' ELSE '' END; 

當然,這是不漂亮,並且需要重複相同的情況下(例如,'name1')多次,但我不認爲這是可能的任何其他方式。

+0

這是個竅門,重複不會讓PHP難以處理=)謝謝! – Villermen

0

如果name具有獨特的索引和值是已知在表中存在,您可以用這一招:

INSERT INTO tablename (name, col1, col2) 
VALUES ('name1', 5, '') 
    , ('name2', 3, 'whatever') 
ON DUPLICATE KEY UPDATE 
     col1 = VALUES(col1) 
    , col2 = VALUES(col2); 

如果有任何額外的NOT NULL列沒有默認值,你就必須爲這些添加虛擬值。只要將它們排除在ON DUPLICATE KEY UPDATE之外,它們將被忽略。