2012-12-02 9 views
21

ケースステートメントを使用してテーブル内の複数の列を更新したいと思いますが、これを行う方法がわかりません(これも可能です)。複数の列を更新する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

このUPDATE CASEクエリのために非常に@bobwienholtありがとうございます – Pank

6

あなたが求めていることをするためのきれいな方法がわかりません。もちろん

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')を複数回繰り返すことが必要ですが、私はちょうどそれが他の方法も可能だとは思わない:同等の有効なSQLの更新は次のようになります。

+0

これはトリックを行い、繰り返しはPHPが処理するのが難しくありません=)ありがとう! – Villermen

0

name一意のインデックスを持っており、自分の価値観がテーブルに存在することが知られている場合は、このトリックを使用することができます。デフォルト値を持たない任意の追加のNOT NULL列がある場合

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

、あなたが持っているでしょうそれらのためのダミー値を追加する。ちょうどON DUPLICATE KEY UPDATEの外に置いておけば無視されます。

関連する問題